部分イメージまたは低解像度を使用したブロック化されたイメージの効率的な処理
この例では、高解像度イメージの小さい代表サンプルでの計算を実現する 2 つの手法を使用して、ブロック化されたイメージを迅速に処理する方法を説明します。
ブロック化されたイメージの処理には時間がかかる場合があるため、アルゴリズムの反復開発にはばく大な費用がかかります。フィードバック サイクルを短縮するための一般的な方法として、低解像度イメージで反復する方法とブロック化されたイメージの部分領域で反復する方法の 2 つがあります。この例では、ブロック化されたイメージのセグメンテーション マスクを作成する場合について、両方の手法を説明します。
Parallel Computing Toolbox™ をインストール済みの場合は、複数のワーカーを使用して、処理をさらに高速化できます。
CAMELYON16 データ セットのイメージ "tumor_091.tif" の変更したバージョンを使用して blockedImage
オブジェクトを作成します。元のイメージは、腫瘍組織が含まれるリンパ節の学習イメージです。元のイメージには 8 つの解像度レベルがあり、最も細かいレベルの解像度は 53760 x 61440 です。変更したイメージには、3 つの粗い解像度レベルのみが含まれています。変更したイメージの空間参照は、縦横比が一定に維持され、各レベルで特徴がレジストレーションされるように調整されています。
bim = blockedImage("tumor_091R.tif");
関数 bigimageshow
を使用してブロック化されたイメージを表示します。
bigimageshow(bim);
低解像度イメージを使用した処理の高速化
多くのブロック化されたイメージには、最も細かい高解像度イメージの粗く解像度が低いバージョンなど、複数の解像度レベルが含まれています。一般に、個々のピクセル値の分布は、すべてのレベルでほぼ等価でなければなりません。この仮定を活用すると、粗いレベルで全体統計を計算し、その統計量を使用してより細かいレベルを処理できます。
最も粗いレベルでイメージを抽出した後、そのイメージをグレースケールに変換します。
imLowRes = gather(bim); imLowResGray = im2gray(imLowRes);
イメージを 2 つのクラスにしきい値処理し、結果を表示します。
thresh = graythresh(imLowResGray); imLowResQuant = imbinarize(imLowResGray,thresh); imshow(imLowResQuant)
最も大きなイメージで検証します。結果を反転して、染色された領域のマスクを取得します。
bq = apply(bim,@(bs)~imbinarize(rgb2gray(bs.Data),thresh));
最も細かいレベルの結果を可視化します。
bigimageshow(bq,CDataMapping="scaled");
ブロック化されたイメージの部分領域を使用した処理の高速化
大きなイメージを処理する場合のもう 1 つの手法は、対象の特徴を含む小さい領域を抽出することです。ROI から統計量を計算し、その統計量を使用して高解像度イメージ全体を処理できます。
関心領域を拡大します。
bigimageshow(bim); xlim([2400,3300]) ylim([900 1700])
最も細かいレベルから表示する領域を抽出します。
xrange = xlim; yrange = ylim; imRegion = getRegion(bim,[900 2400],[1700 3300],Level=1); imshow(imRegion);
この領域を使用してプロトタイプを作成し、結果を表示します。
imRegionGray = rgb2gray(imRegion); thresh = graythresh(imRegionGray); imLowResQuant = ~imbinarize(imRegionGray,thresh); imshow(imLowResQuant)
ブロック化されたイメージ全体を検証し、結果を表示します。
bq = apply(bim,@(bs)~imbinarize(rgb2gray(bs.Data),thresh));
bigimageshow(bq,CDataMapping="scaled");
Parallel Computing Toolbox を使用した処理の高速化
Parallel Computing Toolbox をインストール済みの場合は、処理を複数のワーカーに分散させて、処理を高速化できます。イメージの並列処理を試すには、変数 runInParallel
を true
に設定します。
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