Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

大きなイメージの空間参照の設定

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

bigimage の空間参照

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

大きなイメージ データのダウンロード

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

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

imageDir = fullfile(tempdir,'Camelyon16');
if ~exist(imageDir,'dir')
    mkdir(imageDir);
end

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

既定の空間参照の調査

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

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

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

finestLevel = bim.FinestResolutionLevel;
finestLevelInfo = bim.SpatialReferencing(finestLevel)
finestLevelInfo = 

  imref2d with properties:

           XWorldLimits: [0.5000 6.1441e+04]
           YWorldLimits: [0.5000 5.3761e+04]
              ImageSize: [53760 61440]
    PixelExtentInWorldX: 1
    PixelExtentInWorldY: 1
    ImageExtentInWorldX: 61440
    ImageExtentInWorldY: 53760
       XIntrinsicLimits: [0.5000 6.1441e+04]
       YIntrinsicLimits: [0.5000 5.3761e+04]

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

coarsestLevel = bim.CoarsestResolutionLevel;
disp(bim.SpatialReferencing(coarsestLevel))
  imref2d with properties:

           XWorldLimits: [0.5000 6.1441e+04]
           YWorldLimits: [0.5000 5.3761e+04]
              ImageSize: [512 512]
    PixelExtentInWorldX: 120
    PixelExtentInWorldY: 105
    ImageExtentInWorldX: 61440
    ImageExtentInWorldY: 53760
       XIntrinsicLimits: [0.5000 512.5000]
       YIntrinsicLimits: [0.5000 512.5000]

縦横比の確認

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

t = table((1:8)',bim.LevelSizes(:,1),bim.LevelSizes(:,2), ...
    bim.LevelSizes(:,1)./bim.LevelSizes(:,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 を使用して bigimage を表示します。Figure ウィンドウの左側に最も粗い解像度レベルを表示します。

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 属性が含まれています。

bigimage の最も細かい解像度レベルの ImageDescription メタデータ フィールドを取得します。

binfo = imfinfo(bim.DataSource);
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.SpatialReferencing(8).ImageSize.*pixelDims;

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

bim.SpatialReferencing(8).XWorldLimits = [0.5 worldExtents(2)];
bim.SpatialReferencing(8).YWorldLimits = [0.5 worldExtents(1)];

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

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

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

参考

|

関連するトピック