Main Content

ブロック化されたイメージの空間参照の設定

この例では、blockedImage オブジェクトの空間参照情報を設定および確認する方法を説明します。

ブロック化されたイメージの空間参照

ブロック化されたイメージは、解像度レベルの異なる一連のイメージとしてシーンのイメージ データが格納された多重解像度イメージを扱います。ブロック化されたイメージでは、各レベルの空間範囲は同じであると仮定します。つまり、すべてのレベルが実世界の同じ物理的領域をカバーすると仮定します。大きな多重解像度イメージを使用するときの最初の手順は、この仮定を検証することです。

ブロック化されたイメージ データのダウンロード

この例では Camelyon16 データセットの 1 つのイメージを使用します。このデータセットには、リンパ節のスライド ガラス標本全体のイメージ (WSI) が 400 個含まれています。これらのイメージは、多重解像度 TIF ファイルとして格納されていますが、サイズが大きいためメモリに読み込むことができません。

Camelyon16 イメージを格納するディレクトリを作成します。

imageDir = fullfile('I:\','Camelyon16');
if ~exist(imageDir,'dir')
    mkdir(imageDir);
end

イメージをダウンロードするには、Camelyon17 の Web サイトに移動し、最初の [CAMELYON16 data set] リンクをクリックします。"training" ディレクトリ、"tumor" ディレクトリの順に開きます。"tumor_091.tif" ファイルをダウンロードし、変数 imageDir で指定されたディレクトリにファイルを移動します。

既定の空間参照の調査

既定の空間参照情報を使用して blockedImage オブジェクトを作成します。既定では、ブロック化されたイメージは、最も細かいレイヤーと同じワールド範囲をもつように各レベルの空間参照を設定します。最も細かいレイヤーは、解像度が最も高く、ピクセル数が最も多いレイヤーです。

fileName = fullfile(imageDir,'tumor_091.tif');
bim = blockedImage(fileName);

最も細かいレベルの空間参照情報を表示します。イメージ サイズ (Size プロパティで指定) は、ワールド座標の範囲と一致します。既定のイメージ座標系では、最初のピクセルの中心が (1,1) に配置されることに注目してください。ピクセル範囲は各次元で 1 単位の幅があるため、最初のピクセルの左端は (0.5,0.5) から始まります。

finestLevel = 1;
finestStart = bim.WorldStart(finestLevel,:)
finestEnd = bim.WorldEnd(finestLevel,:)
finestStart =

    0.5000    0.5000    0.5000


finestEnd =

   1.0e+04 *

    5.3761    6.1441    0.0003

最も粗いレベルの空間参照情報を表示します。ワールド範囲は最も細かいレベルと同じですが、粗いイメージ サイズはわずか 512 x 512 ピクセルです。実際、この粗いレベルの各ピクセルは、最も細かい解像度のピクセルの 105 行 120 列のブロックに対応します。

coarsestLevel = bim.NumLevels;
coarsestStart = bim.WorldStart(coarsestLevel,:)
coarsestEnd = bim.WorldEnd(coarsestLevel,:)
coarsestStart =

    0.5000    0.5000    0.5000


coarsestEnd =

   1.0e+04 *

    5.3761    6.1441    0.0003

縦横比の確認

各レベルのイメージ サイズと縦横比を表示します。縦横比には一貫性がありません。これは、レベル間で、広がるワールド領域が異なることを示します。そのため、このイメージの場合、既定の仮定は正しくありません。

t = table((1:8)',bim.Size(:,1),bim.Size(:,2), ...
    bim.Size(:,1)./bim.Size(:,2), ...
    'VariableNames',["Level" "Height" "Width" "Aspect Ratio"]);
disp(t)
    Level    Height    Width    Aspect Ratio
    _____    ______    _____    ____________

      1      53760     61440        0.875   
      2      27136     30720      0.88333   
      3      13824     15360          0.9   
      4       7168      7680      0.93333   
      5       3584      4096        0.875   
      6       2048      2048            1   
      7       1024      1024            1   
      8        512       512            1   

レイヤーの表示による空間範囲の比較

関数 bigimageshow を使用してブロック化されたイメージを表示します。最も粗い解像度レベルで表示します。

figure
subplot(1,2,1);
hl = bigimageshow(bim,'ResolutionLevel',coarsestLevel);
title('Coarsest Resolution Level (8)')
%

同じ Figure ウィンドウに、既定の解像度レベルでイメージ データを表示します。既定では、bigimageshow は、画面解像度と表示される領域のサイズに基づいて、表示するレベルを選択します。

subplot(1,2,2);
hr = bigimageshow(bim);
title('Default Resolution Level')
%

両方の表示の範囲が同じであることを確認します。

linkaxes([hl.Parent,hr.Parent]);

既定の空間参照の確認

特徴を拡大します。

xlim([45000 50000]);
ylim([12000 17000]);

Figure ウィンドウの右側のイメージの解像度レベルを変更します。レベル 6 では、特徴が最も粗いレベルと一致しているように見えます。

hr.ResolutionLevel = 6;
title('Level 6');
snapnow
%

レベル 1 では、特徴は一致しません。そのため、レベル 1 とレベル 8 でワールド範囲が異なります。

hr.ResolutionLevel = 1;
title('Level 1');
snapnow
%

ブロック化されたイメージのメタデータの空間範囲の取得

通常、データの元のソースには、そのメタデータにエンコードされている空間参照情報が含まれています。Camelyon16 データセットの場合、空間参照情報は、最も細かい解像度レベルの ImageDescription メタデータ フィールドに XML コンテンツとして格納されます。XML コンテンツには、ピクセル範囲を指定する各解像度レベルの DICOM_PIXEL_SPACING 属性が含まれています。

blockedImage オブジェクトの最も細かい解像度レベルで ImageDescription メタデータ フィールドを取得します。

binfo = imfinfo(bim.Source);
binfo = binfo(1).ImageDescription;

コンテンツで文字列 "DICOM_PIXEL_SPACING" を検索します。9 つの一致が見つかります。属性の 2 番目のインスタンスは、最も細かいレベルのピクセル間隔に対応します。属性の最後のインスタンスは、最も粗いレベルのピクセル間隔に対応します。

indx = strfind(binfo,"DICOM_PIXEL_SPACING");

最も細かいレベルのピクセル間隔を格納します。XML テキストからピクセル間隔の値を抽出するには、"DICOM_PIXEL_SPACING" 属性の 2 番目のインスタンスに続くテキストを目視で確認します。

disp(binfo(indx(2):indx(2)+100))
pixelSpacing_L1 = 0.000227273;
DICOM_PIXEL_SPACING" Group="0x0028" Element="0x0030" PMSVR="IDoubleArray">"0.000227273" &qu

同様に、最も粗いレベルのピクセル間隔を格納します。XML テキストからピクセル間隔の値を抽出するには、"DICOM_PIXEL_SPACING" 属性の最後のインスタンスに続くテキストを目視で確認します。

disp(binfo(indx(end):indx(end)+100))
pixelSpacing_L8 = 0.0290909;
DICOM_PIXEL_SPACING" Group="0x0028" Element="0x0030" PMSVR="IDoubleArray">"0.0290909" &quot

空間範囲の設定

レベル 8 とレベル 1 の間の相対的なピクセル幅を計算します。

pixelDims = pixelSpacing_L8/pixelSpacing_L1;

最も細かいレベルには基準空間範囲が含まれます。レベル 1 の範囲に対するレベル 8 の対応範囲を計算します。

worldExtents = bim.Size(8,1:2).*pixelDims;

レベル 8 の空間参照を更新します。

bim.WorldEnd(8,1:2) =  worldExtents(2);

カスタム空間参照での配置の確認

データを再表示して、主要な特徴の配置を確認します。左側にレベル 8 を表示し、右側にレベル 1 を表示します。

hl.CData = bim;
hl.ResolutionLevel = 8;
snapnow
hr.CData = bim;
hr.ResolutionLevel = 1;
snapnow

参考

|

関連するトピック