다음을 통해 공유


Windows 앱 SDK AI 이미징 시작

Important

이 기능은 아직 사용할 수 없습니다. 그것은 Windows 앱 SDK 곧 실험 채널 릴리스에서 제공 될 것으로 예상된다.

Windows 앱 SDK 실험 채널에는 개발 초기 단계의 API 및 기능이 포함됩니다. 실험적 채널의 모든 API는 광범위한 수정 및 호환성이 손상되는 변경이 적용되며 언제든지 후속 릴리스에서 제거될 수 있습니다. 프로덕션 환경에서는 사용할 수 없으며 실험적 기능을 사용하는 앱은 Microsoft Store에 게시할 수 없습니다.

이미징 기능은 이미지의 크기를 조정하고 선명하게 할 수 있을 뿐만 아니라 이미지 내의 개체를 식별할 수 있는 AI(인공 지능) 지원 API 집합을 통해 Windows 앱 SDK 지원됩니다(이미지 구분).

API 세부 정보는 Windows 앱 SDK AI 지원 이미징 기능에 대한 API 참조를 참조하세요.

Windows 앱 SDK GitHub 리포지토리에서 새 문제를 만들어 이러한 API 및 해당 기능에 대한 피드백을 제공합니다. (제목에 이미징을 포함해야 합니다.)

필수 조건

  • CoPilot+ PC

    참고 항목

    AMD 기반 CoPilot+ PC는 이미지 슈퍼 해상도를 지원하지 않습니다.

Windows 앱 SDK 및 이미지 슈퍼 해상도로 무엇을 할 수 있나요?

Windows 앱 SDK 새로운 AI 이미지 슈퍼 해상도 기능을 사용하여 이미지를 선명하게 하고 이미지를 선명하게 하여 크기를 조정합니다.

참고 항목

크기 조정은 최대 8배로 조정됩니다(배율 인수가 높을수록 아티팩트가 도입되고 이미지 정확도가 손상될 수 있음). 최종 너비 또는 높이가 원래 값의 8배보다 크면 예외가 throw됩니다.

이미지의 선명도 향상

이 예제에서는 기존 소프트웨어 비트맵 이미지의 배율(targetWidthtargetHeight, softwareBitmap)을 변경하고 선명도를 개선하는 방법을 보여 줍니다(이미지 크기를 조정하지 않고 선명도를 높이려면 원래 이미지 너비 및 높이 지정).

  1. 먼저 IsAvailable 메서드를 호출하고 MakeAvailableAsync 메서드가 성공적으로 반환되도록 대기하여 이미지 슈퍼 해상도 모델을 사용할 수 있는지 확인합니다.
  2. 이미지 슈퍼 해상도 모델을 사용할 수 있게 되면 참조할 개체를 만듭니다.
  3. 그런 다음 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); 

Windows 앱 SDK 및 이미지 구분으로 무엇을 할 수 있나요?

이미지 구분을 사용하여 이미지의 특정 개체를 식별할 수 있습니다. 모델은 이미지와 "힌트" 개체를 모두 사용하고 식별된 개체의 마스크를 반환합니다.

힌트는 다음의 조합을 통해 제공할 수 있습니다.

  • 식별 대상에 속하는 점의 좌표입니다.
  • 식별 대상에 속하지 않는 점의 좌표입니다.
  • 식별 대상을 묶는 좌표 사각형입니다.

힌트가 많을수록 모델이 더 정확해질 수 있습니다. 그러나 부정확한 결과 또는 오류를 방지하려면 다음 힌트 지침을 따릅니다.

  • 부정확한 마스크를 생성할 수 있으므로 힌트에 여러 사각형을 사용하지 마세요.
  • 포함 지점이나 사각형 없이 제외 지점을 단독으로 사용하지 않습니다.
  • 오류가 반환되므로 지원되는 최대 32개의 좌표(점의 경우 1, 사각형의 경우 2)를 초과하여 지정하지 마세요.

반환된 마스크는 회색조-8 형식입니다. 마스크 내에서 식별된 개체의 픽셀은 255입니다(나머지는 0이고 그 사이에 값을 보유하는 픽셀이 없음).

이미지 내의 개체 식별

다음 예제에서는 이미지 내에서 개체를 식별할 수 있는 다양한 방법을 보여 줍니다. 입력에 대한 소프트웨어 비트맵 개체(softwareBitmap)가 이미 있다고 가정합니다.

  1. 먼저 IsAvailable 메서드를 호출하고 MakeAvailableAsync 메서드가 성공적으로 반환되도록 대기하여 이미지 구분 모델을 사용할 수 있는지 확인합니다.
  2. 이미지 구분 모델을 사용할 수 있게 되면 이를 참조할 개체를 만듭니다.
  3. 다음으로 ImageObjectExtractor.CreateWithImageBufferAsync(또는 이미지 형식에 따라 CreateWithSoftwareBitmapAsync)에 이미지를 전달하여 ImageObjectExtractor 클래스를 만듭니다.
  4. 그런 다음 ImageObjectExtractorHint 개체를 만듭니다(이 항목의 뒷부분에서 다른 입력을 사용하여 힌트 개체를 만드는 다른 방법을 보여 줍니다).
  5. 마지막으로 최종 결과를 반환하는 GetSoftwareBitmapObjectMask 메서드를 사용하여 모델에 힌트를 제출합니다.
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);

포함된 점과 제외된 점을 사용하여 힌트 지정

이 코드 조각에서는 포함된 점과 제외된 점을 모두 힌트로 사용하는 방법을 보여 줍니다.

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}
    }
);

사각형을 사용하여 힌트 지정

이 코드 조각에서는 사각형(RectInt32 is X, Y, Width, Height)을 힌트로 사용하는 방법을 보여 줍니다.

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

추가 리소스