共用方式為


在 Windows 應用程式 SDK 開始使用 AI 映像

重要

此功能尚無法使用。 它預計將在即將發行的實驗通道發行 Windows 應用程式 SDK。

Windows 應用程式 SDK 實驗通道包含開發初期的 API 和功能。 實驗通道中的所有 API 都受限於廣泛的修訂和中斷性變更,而且可以隨時從後續版本中移除。 不支援在生產環境中使用,且使用實驗性功能的應用程式無法發佈至 Microsoft 市集。

Windows 應用程式 SDK 會透過一組人工智慧(AI)支援的 API 來支援影像功能,這些 API 可以縮放和銳化影像(影像超解析度),以及識別影像中的物件(影像分割)。

如需 API 詳細數據,請參閱 #D6A1B4DF8B474489F91889FF52D0D454B 中 AI 支援的映射功能的 API 參考。

提示

在 GitHub 存放庫中建立新的 Windows 應用程式 SDK 問題,以提供有關這些 API 及其功能的意見反應。 (請確定您在 標題中包含影像處理

必要條件

  • CoPilot+ 電腦

    注意

    AMD 型 CoPilot+ 電腦不支援影像超解析度。

我可以使用 Windows 應用程式 SDK 和影像超級解析度做什麼?

使用 Windows 應用程式 SDK 中新的 AI 影像超級解析度功能,在縮放影像時將影像和影像銳化。

注意

縮放比例會縮小到 8 倍的最大係數(較高的縮放比例可能會造成成品和危害影像精確度)。 如果最終寬度或高度大於其原始值 8 倍,則會擲回例外狀況。

增加影像的銳度

此範例示範如何變更現有軟體點圖影像的縮放比例 (targetWidthtargetHeightsoftwareBitmap) 並改善其銳度(如果您想要在不調整影像的情況下改善銳度,請指定原始影像寬度和高度)。

  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 來建立 ImageObjectExtractor 類別(或根據影像類型而定的 CreateWithSoftwareBitmapAsync)。
  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}
    }, 
    {},
    {}
);

其他資源