Main Content

部分イメージまたは低解像度を使用したブロック化されたイメージの効率的な処理

この例では、高解像度イメージの小さい代表サンプルでの計算を実現する 2 つの手法を使用して、ブロック化されたイメージを迅速に処理する方法を説明します。

ブロック化されたイメージの処理には時間がかかる場合があるため、アルゴリズムの反復開発にはばく大な費用がかかります。フィードバック サイクルを短縮するための一般的な方法として、低解像度イメージで反復する方法とブロック化されたイメージの部分領域で反復する方法の 2 つがあります。この例では、ブロック化されたイメージのセグメンテーション マスクを作成する場合について、両方の手法を説明します。

Parallel Computing Toolbox™ をインストール済みの場合は、複数のワーカーを使用して、処理をさらに高速化できます。

CAMELYON16 データ セットのイメージ "tumor_091.tif" の変更したバージョンを使用して blockedImage オブジェクトを作成します。元のイメージは、腫瘍組織が含まれるリンパ節の学習イメージです。元のイメージには 8 つの解像度レベルがあり、最も細かいレベルの解像度は 53760 x 61440 です。変更したイメージには、3 つの粗い解像度レベルのみが含まれています。変更したイメージの空間参照は、縦横比が一定に維持され、各レベルで特徴がレジストレーションされるように調整されています。

bim = blockedImage("tumor_091R.tif");

関数 bigimageshow を使用してブロック化されたイメージを表示します。

bigimageshow(bim);

Figure contains an axes object. The axes object contains an object of type bigimageshow.

低解像度イメージを使用した処理の高速化

多くのブロック化されたイメージには、最も細かい高解像度イメージの粗く解像度が低いバージョンなど、複数の解像度レベルが含まれています。一般に、個々のピクセル値の分布は、すべてのレベルでほぼ等価でなければなりません。この仮定を活用すると、粗いレベルで全体統計を計算し、その統計量を使用してより細かいレベルを処理できます。

最も粗いレベルでイメージを抽出した後、そのイメージをグレースケールに変換します。

imLowRes = gather(bim);
imLowResGray = im2gray(imLowRes);

イメージを 2 つのクラスにしきい値処理し、結果を表示します。

thresh = graythresh(imLowResGray);
imLowResQuant = imbinarize(imLowResGray,thresh);
imshow(imLowResQuant)

Figure contains an axes object. The axes object contains an object of type image.

最も大きなイメージで検証します。結果を反転して、染色された領域のマスクを取得します。

bq = apply(bim,@(bs)~imbinarize(rgb2gray(bs.Data),thresh));

最も細かいレベルの結果を可視化します。

bigimageshow(bq,CDataMapping="scaled");

Figure contains an axes object. The axes object contains an object of type bigimageshow.

ブロック化されたイメージの部分領域を使用した処理の高速化

大きなイメージを処理する場合のもう 1 つの手法は、対象の特徴を含む小さい領域を抽出することです。ROI から統計量を計算し、その統計量を使用して高解像度イメージ全体を処理できます。

関心領域を拡大します。

bigimageshow(bim);
xlim([2400,3300])
ylim([900 1700])

Figure contains an axes object. The axes object contains an object of type bigimageshow.

最も細かいレベルから表示する領域を抽出します。

xrange = xlim;
yrange = ylim;
imRegion = getRegion(bim,[900 2400],[1700 3300],Level=1);
imshow(imRegion);

Figure contains an axes object. The axes object contains an object of type image.

この領域を使用してプロトタイプを作成し、結果を表示します。

imRegionGray = rgb2gray(imRegion);
thresh = graythresh(imRegionGray);
imLowResQuant = ~imbinarize(imRegionGray,thresh);

imshow(imLowResQuant)

Figure contains an axes object. The axes object contains an object of type image.

ブロック化されたイメージ全体を検証し、結果を表示します。

bq = apply(bim,@(bs)~imbinarize(rgb2gray(bs.Data),thresh));
bigimageshow(bq,CDataMapping="scaled");

Figure contains an axes object. The axes object contains an object of type bigimageshow.

Parallel Computing Toolbox を使用した処理の高速化

Parallel Computing Toolbox をインストール済みの場合は、処理を複数のワーカーに分散させて、処理を高速化できます。イメージの並列処理を試すには、変数 runInParalleltrue に設定します。

runInParallel = false;
if runInParallel
    % Location for output, which should be accessible on the client and all
    % workers and should be empty
    outDir = tempname;
    % Open a pool
    p = gcp;
    % Ensure workers are on the same folder as the file to be able to
    % access it using just the relative path
    sourceDir = fileparts(which("tumor_091R.tif"));
    spmd
        cd(sourceDir)
    end
    % Run in parallel
    bq = apply(bim, ...
       @(bs)~imbinarize(rgb2gray(bs.Data),thresh),UseParallel=true, ...
       OutputLocation=outDir);
end

参考

| |