Compartilhar via


Introdução à imagem de IA no SDK do Aplicativo Windows

Importante

Esse recurso ainda não está disponível. Espera-se que ele seja enviado em uma próxima versão de canal experimental do SDK do Aplicativo Windows.

O canal experimental do SDK do Aplicativo Windows 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 interruptivas, podendo ser removidas de versões subsequentes a qualquer momento. Elas não são compatíveis com o uso em ambientes de produção e os aplicativos que usam os recursos experimentais não podem ser publicados na Microsoft Store.

Os recursos de geração de imagens terão suporte do SDK do Aplicativo Windows por meio de um conjunto de APIs com suporte de IA (inteligência artificial) que podem dimensionar e aprimorar imagens (Super Resolução de Imagem), bem como identificar objetos em uma imagem (Segmentação de Imagem).

Para obter detalhes da API, consulte Referência de API para recursos de imagem com suporte de IA no SDK do Aplicativo Windows.

Dica

Forneça comentários sobre essas APIs e sua funcionalidade criando um novo Problema no repositório GitHub SDK do Aplicativo Windows. (Certifique-se de incluir Imaging no título!)

Pré-requisitos

  • CoPilot+ PCs

    Observação

    Os PCs CoPilot+ baseados em AMD não suportam super-resolução de imagem.

O que posso fazer com o SDK do Aplicativo Windows e a Super-Resolução de Imagem?

Use os novos recursos de Super Resolução de Imagem de IA no SDK do Aplicativo Windows para aprimorar imagens e aprimorar imagens ao dimensioná-las.

Observação

O dimensionamento é limitado 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 altura final for maior que 8x 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 de 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).

  1. Primeiro, garantimos que o modelo de Super Resolução de Imagem esteja disponível chamando o método IsAvailable e aguardando o método MakeAvailableAsync retornar com êxito.
  2. Quando o modelo de super-resolução de imagem estiver disponível, criamos um objeto para referenciá-lo.
  3. Em seguida, obtemos a imagem final enviando a imagem original e a largura e altura de destino 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 do Aplicativo 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 usa uma imagem e um objeto de "dicas" e retorna uma máscara do objeto identificado.

As dicas podem ser fornecidas por meio de qualquer combinação dos seguintes:

  • 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 em uma dica, pois eles podem produzir uma máscara imprecisa.
  • Evite usar pontos de exclusão exclusivamente sem pontos de inclusão 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 retornada está no formato escala de cinza-8. Os pixels do objeto identificado dentro da máscara são 255 (o restante é 0 sem pixels com valores intermediários).

Identificar um objeto em uma imagem

Os exemplos a seguir mostram as várias maneiras de identificar um objeto em uma imagem. Supomos que você já tenha um objeto bitmap de software (softwareBitmap) para a entrada.

  1. Primeiro, garantimos que o modelo de Segmentação de Imagem esteja disponível chamando o método IsAvailable e aguardando o MakeAvailableAsync
  2. Assim que o modelo de segmentação de imagem estiver disponível, criamos um objeto para referenciá-lo.
  3. Em seguida, criamos uma classe ImageObjectExtractor passando a imagem para ImageObjectExtractor.CreateWithImageBufferAsync (ou CreateWithSoftwareBitmapAsync, dependendo do tipo de imagem).
  4. Em seguida, criaremos um objeto ImageObjectExtractorHint (mostraremos outras maneiras de criar um objeto de dica com entradas diferentes posteriormente neste tópico).
  5. Por fim, 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);

Especifique 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 é X, Y, Width, Height) como uma dica.

ImageObjectExtractorHint hint(
    includeRects: 
        new List<RectInt32> {new RectInt32(370, 278, 285, 126)},
    includePoints: null,
    excludePoints: null ); 
ImageObjectExtractorHint hint(
    { 
        RectInt32{370, 278, 285, 126}
    }, 
    {},
    {}
);

Recursos adicionais