Introdução à criação de imagens de IA no SDK de aplicativos Windows
Importante
Esta funcionalidade ainda não está disponível. Espera-se que seja lançado numa próxima versão do canal experimental do SDK de Aplicações do Windows.
O SDK de Aplicativos Windows canal experimental inclui APIs e recursos em estágios iniciais de desenvolvimento. Todas as APIs no canal experimental estão sujeitas a extensas revisões e alterações disruptivas e podem ser removidas de versões subsequentes a qualquer momento. Eles não são suportados para uso em ambientes de produção e os aplicativos que usam recursos experimentais não podem ser publicados na Microsoft Store.
Os recursos de imagem serão suportados pelo SDK de aplicativos Windows por meio de um conjunto de APIs apoiadas por inteligência artificial (IA) que podem dimensionar e tornar mais nítidas as imagens (Super Resolução de Imagem), bem como identificar objetos dentro de uma imagem (Segmentação de Imagem).
Para obter detalhes da API, consulte ref da API para recursos de criação de imagens com suporte de IA no SDK do Aplicativo Windows.
Dica
Forneça feedback sobre estas APIs e a sua funcionalidade criando um novo Problema no repositório GitHub do Windows App SDK. (Certifique-se de incluir Imaging no título!)
Pré-requisitos
-
de PCs CoPilot+
Observação
Os PCs CoPilot+ baseados em AMD não suportam a Super Resolução de Imagem.
O que posso fazer com o SDK de Aplicativos Windows e a Superresolução de Imagem?
Use os novos recursos de Super Resolução de Imagem da IA no SDK do Aplicativo Windows para aprimorar imagens e afiá-las enquanto as dimensiona.
Observação
O dimensionamento é reduzido a um fator máximo de 8x (fatores de escala mais altos podem introduzir artefatos e comprometer a precisão da imagem). Se a largura ou a altura final for maior que oito vezes os seus valores originais, uma exceção será lançada.
Aumentar a nitidez de uma imagem
Este exemplo mostra como alterar a escala (targetWidth
, targetHeight
) de uma imagem bitmap de software existente (softwareBitmap
) e melhorar sua nitidez (se você quiser melhorar a nitidez sem dimensionar a imagem, especifique a largura e a altura da imagem original).
- Primeiro, garantimos que o modelo de Super Resolução de Imagem esteja disponível chamando o método IsAvailable e aguardando que o método MakeAvailableAsync retorne com êxito.
- Assim que o modelo de Super Resolução de Imagem estiver disponível, criamos um objeto para fazer referência a ele.
- Em seguida, obtemos a imagem final enviando a imagem original e a largura e altura da imagem final para o modelo usando o método ScaleSoftwareBitmap.
using Microsft.Windows.Imaging;
using Windows.Graphics.Imaging;
if (!ImageScaler.IsAvailable())
{
var result = ImageScaler.MakeAvailableAsync();
if (result.Status != PackageDeploymentStatus.CompletedSuccess)
{
throw result.ExtendedError;
}
}
var imageScaler = await ImageScaler.CreateAsync();
var finalImage = imageScaler.ScaleSoftwareBitmap(softwareBitmap, targetWidth, targetHeight);
#include "winrt/Microsoft.Graphics.Imaging.h"
#include "winrt/Windows.Graphics.Imaging.h"
using namespace winrt::Windows::Graphics::Imaging;
using namespace winrt::Microsoft::Graphics::Imaging;
if (!ImageScaler::IsAvailable())
{
auto result = ImageScaler::MakeAvailableAsync();
if (result.Status() != AsyncStatus::Completed)
{
throw result.ErrorCode();
}
}
ImageScaler imageScaler = ImageScaler::CreateAsync().get();
ImageBuffer buffer = imageScaler.ScaleSoftwareBitmap(softwareBitmap, targetWidth, targetHeight);
O que posso fazer com o SDK de Aplicativos Windows e a Segmentação de Imagem?
A segmentação de imagem pode ser usada para identificar objetos específicos em uma imagem. O modelo considera tanto uma imagem quanto um objeto de "sugestões" e retorna uma máscara do objeto identificado.
As dicas podem ser fornecidas através de qualquer combinação do seguinte:
- Coordenadas para pontos que pertencem ao que você está identificando.
- Coordenadas para pontos que não pertencem ao que você está identificando.
- Um retângulo de coordenadas que inclui o que você está identificando.
Quanto mais dicas você fornecer, mais preciso o modelo pode ser. No entanto, siga estas diretrizes de dicas para evitar resultados imprecisos ou erros.
- Evite usar vários retângulos numa pista, pois eles podem produzir uma máscara imprecisa.
- Evite usar exclusivamente pontos de exclusão sem incluir pontos ou um retângulo.
- Não especifique mais do que o máximo suportado de 32 coordenadas (1 para um ponto, 2 para um retângulo), pois isso retornará um erro.
A máscara devolvida está no formato escala de cinzentos-8. Os pixels do objeto identificado dentro da máscara são 255 (o restante é 0 sem pixels mantendo quaisquer valores entre eles).
Identificar um objeto dentro de uma imagem
Os exemplos a seguir mostram as várias maneiras de identificar um objeto dentro de uma imagem. Supomos que você já tenha um objeto bitmap de software (softwareBitmap
) para a entrada.
- Primeiro, garantimos que o modelo de segmentação de imagem esteja disponível chamando o método IsAvailable e aguardando que o método MakeAvailableAsync retorne com êxito.
- Assim que o modelo de Segmentação de Imagem estiver disponível, criamos um objeto para fazer referência a ele.
- Em seguida, criamos uma classe ImageObjectExtractor passando a imagem para ImageObjectExtractor.CreateWithImageBufferAsync (ou CreateWithSoftwareBitmapAsync, dependendo do seu tipo de imagem).
- Em seguida, criaremos um objeto ImageObjectExtractorHint (mostraremos outras maneiras de criar um objeto de dica com entradas diferentes mais adiante neste tópico).
- Finalmente, enviamos a dica para o modelo usando o método GetSoftwareBitmapObjectMask, que retorna o resultado final.
using Microsft.Windows.Imaging;
using Windows.Graphics.Imaging;
if (!ImageObjectExtractor.IsAvailable())
{
var result = await ImageObjectExtractor.MakeAvailableAsync();
if (result.Status != PackageDeploymentStatus.CompletedSuccess)
{
throw result.ExtendedError;
}
}
ImageObjectExtractor imageObjectExtractor =
await ImageObjectExtractor.CreateWithSoftwareBitmapAsync(softwareBitmap);
ImageObjectExtractorHint hint(
includeRects: null,
includePoints:
new List<PointInt32> { new PointInt32(306, 212),
new PointInt32(216, 336)},
excludePoints: null);
SoftwareBitmap finalImage = imageObjectExtractor.GetSoftwareBitmapObjectMask(hint);
#include "winrt/Microsoft.Graphics.Imaging.h"
#include "winrt/Windows.Graphics.Imaging.h"
using namespace winrt::Windows::Graphics::Imaging;
using namespace winrt::Microsoft::Graphics::Imaging;
if (!ImageObjectExtractor::IsAvailable())
{
auto result = ImageObjectExtractor::MakeAvailableAsync();
if (result.Status() != AsyncStatus::Completed)
{
throw result.ErrorCode();
}
}
ImageObjectExtractor imageObjectExtractor =
ImageObjectExtractor::CreateWithSoftwareBitmapAsync(softwareBitmap).get();
ImageObjectExtractorHint hint(
{},
{
PointInt32{306, 212},
PointInt32{216, 336}
},
{}
);
SoftwareBitmap finalImage = imageObjectExtractor.GetSoftwareBitmapObjectMask(hint);
Especificar dicas com pontos incluídos e excluídos
Neste trecho de código, demonstramos como usar pontos incluídos e excluídos como dicas.
ImageObjectExtractorHint hint(
includeRects: null,
includePoints:
new List<PointInt32> { new PointInt32(150, 90),
new PointInt32(216, 336),
new PointInt32(550, 330)},
excludePoints:
new List<PointInt32> { new PointInt32(306, 212) });
ImageObjectExtractorHint hint(
{},
{
PointInt32{150, 90},
PointInt32{216, 336},
PointInt32{550, 330}
},
{
PointInt32{306, 212}
}
);
Especificar dicas com retângulo
Neste trecho de código, demonstramos como usar um retângulo (RectInt32 is X, Y, Width, Height
) como dica.
ImageObjectExtractorHint hint(
includeRects:
new List<RectInt32> {new RectInt32(370, 278, 285, 126)},
includePoints: null,
excludePoints: null );
ImageObjectExtractorHint hint(
{
RectInt32{370, 278, 285, 126}
},
{},
{}
);