メインコンテンツ

対話型の ROI を使用したブロック化されたイメージの詳細の調査

この例では、ROI ツールを使用して対話的に選択した、ブロック化されたイメージの詳細領域を表示する方法を説明します。

imageshowblockedImage オブジェクトを表示します。blockedImage オブジェクトに複数のレベルがある場合、imageshow は画面サイズに基づいて適切なレベルを自動的に選択します。imageshow は常に単一のワールド座標で機能し、空間参照情報に基づいて各レベルを表示します。これにより、同じ blockedImage オブジェクトの 2 つの表示を使用して、同じ座標系を共有しながら、異なるレベルでイメージの詳細を表示できます。

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

bim = blockedImage("tumor_091R.tif");

概要イメージと詳細ビューの表示

imageshow関数を使用して、Figure ウィンドウの左側に大きなイメージ全体を表示します。表示される概要の解像度レベルは、ウィンドウのサイズと使用する画面サイズに応じて自動的に変化します。概要イメージの解像度レベルを最も粗い解像度レベルに固定します。Figure ウィンドウの右側に大きなイメージの詳細ビューを表示します。詳細イメージのレベルは imageshow で自動的に調整します。

hf = uifigure;
g = uigridlayout(hf,ColumnWidth={"1x","1x"},RowHeight={"fit"});
haOView = viewer2d(g,ScaleBar="off");
haDetailView = viewer2d(g,ScaleBar="off");

haOView.Layout.Row = 1;
haOView.Layout.Column = 1;
haOView.Title = "Overview";
haDetailView.Layout.Row = 1;
haDetailView.Layout.Column = 2;
haDetailView.Title = "Detail View";

hl = imageshow(bim,Parent=haOView);
hr = imageshow(bim,Parent=haDetailView);

詳細ビューを拡大します。

対話型の四角形 ROI の追加による表示ビューの制御

概要イメージに四角形 ROI を描画します。この例では、Position プロパティに [xmin,ymin,幅,高さ] 形式の 4 要素ベクトルを設定して、プログラムによって四角形の初期サイズおよび位置を指定します。概要の上に ROI を表示した後、ROI のサイズと位置を対話的に調整できます。

xrange = [2800,3050];
yrange = [500,750];
roiPosition = [xrange(1) yrange(1) xrange(2)-xrange(1) yrange(2)-yrange(1)];

hrOView = uidraw(haOView,"rectangle",Position=roiPosition,Color="r",Label="");
haOView.Annotations = hrOView;
haOView.Interactions = ["zoom" "pan"];
haDetailView.Interactions = ["zoom" "pan"];

四角形と詳細ビューの間の相互作用を定義するときに使用する、ビューのハンドルを保存します。

haOView.UserData.haDetailView = haDetailView;
haDetailView.UserData.haOView = haOView;

詳細ビューにリスナーを追加します。これらのリスナーは、詳細ビューの空間範囲の変化を検出します。空間範囲が変化すると、リスナーは補助関数 updateOverviewROI を呼び出し、詳細ビューの範囲に一致するように ROI の範囲を更新します。この補助関数の定義は、この例の終わりで行います。

addlistener(haDetailView,"CameraMoved",@(src,evt)updateOverviewROI(src,evt));
addlistener(haDetailView,"CameraMoving",@(src,evt)updateOverviewROI(src,evt));

概要ビューアーにリスナーを追加します。これらのリスナーは、四角形の空間範囲の変化を検出します。範囲が変化すると、リスナーは補助関数 updateOverViewROI を呼び出し、ROI の範囲に一致するように詳細イメージの範囲を更新します。この補助関数の定義は、この例の終わりで行います。

addlistener(haOView,"AnnotationMoved",@(src,evt)updateDetailView(src,evt));

これで、四角形 ROI のサイズと位置を対話的に変更して、表示ビューを調整できます。同様に、詳細ビューのズームやパンを行うと、ROI のサイズと位置が更新されます。

相互作用を制御するコールバック関数の定義

function updateOverviewROI(src,~)
  % Update overview rectangle position whenever the right hand side
  % zooms/pans.
   roi = src.CameraViewport;
   roi.Color = "r";
   roi.Label = "";
   src.UserData.haOView.Annotations = roi;
end

function updateDetailView(hSrc,~)
  % Update the right side detail view anytime the overview rectangle is
  % moved or edited.
  ha = hSrc.UserData.haDetailView;

  roi = hSrc.Annotations;
  % Extract location of the overview rectangle
  ha.CameraViewport = roi;
end

参考

|