Main Content

setBlock

(削除予定) bigimage オブジェクトの特定のブロックへのデータの配置

R2019b 以降

bigimage オブジェクトの関数 setBlock は将来のリリースで削除される予定です。代わりに、blockedImage オブジェクトに関連付けられた関数 setBlock を使用してください。詳細については、互換性の考慮事項を参照してください。

説明

setBlock(bigimg,level,locationWorld,data) は、指定された解像度レベルで座標 locationWorld を含む大きなイメージ bigimg のブロックにピクセル データを設定します。

すべて折りたたむ

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

bim = bigimage('tumor_091R.tif');

bigimage を表示し、表示されたイメージの上に円 ROI を作成します。

h = bigimageshow(bim);
hROI = drawcircle(gca,'Radius',470,'Position',[1477 2284]);

書き換え可能な bigimage を作成するレベルを選択します。レベル 3 は最も粗い解像度レベルです。

maskLevel = 3;

指定されたレベルから空間参照とピクセル範囲を取得します。

ref = bim.SpatialReferencing(maskLevel);
pixelExtent = [ref.PixelExtentInWorldX,ref.PixelExtentInWorldY];

イメージ データではなく空間参照を指定して、書き換え可能な bigimage を作成します。大きなイメージには 1 つのチャネルがあり、データ型は logical です。

bmask = bigimage(ref,1,'logical');

書き換え可能な大きなイメージ内のすべてのブロックでループ処理を行い、マスク イメージを作成します。ブロックごとに、ROI 内のピクセルではピクセル値を 1 (true) として設定し、ROI 外のピクセルでは 0 (false) として設定します。

for cStart = 1:bmask.BlockSize(2):ref.ImageSize(2)
    for rStart = 1:bmask.BlockSize(1):ref.ImageSize(1)

        % Get the center of top left pixel of this block in world units.
        xyStart = [cStart,rStart].*pixelExtent;

        % Get the block size. The |'BlockSize'| property represents the
        % size as a 2-element vector of the form [row,column]. Switch the
        % order of the elements so that the block size is represented as
        % [x,y].
        bsize = bmask.BlockSize;
        numRows = bsize(1);
        numCols = bsize(2);

        % Determine which pixels have coordinates inside the ROI.
        roiPositions = hROI.Vertices;

        % Transform |roiPositions| from world coordinates to the intrinsic
        % image indices at the given resolution level.
        roiPositions = (roiPositions - xyStart) ./ pixelExtent + 1;

        blockMask = poly2mask(roiPositions(:,1),roiPositions(:,2), ...
                              numRows, numCols);

        % Set the pixel values of the block.
        setBlock(bmask,1,xyStart,blockMask);
    end
end

マスクを表示します。

figure
bigimageshow(bmask)

入力引数

すべて折りたたむ

大きなイメージ。bigimage オブジェクトとして指定します。

解像度レベル。bigimg の解像度レベル値以下の正の整数として指定します。

点の座標。[x y] 形式の 1 行 2 列の数値ベクトルとして指定します。場所はワールド座標、つまり最も高い解像度レベルに対するピクセル位置で指定されます。位置は bigimg 内の有効な位置でなければなりません。

ピクセル データ。大きなイメージ bigimg.ClassUnderlying と同じデータ型の数値配列として指定します。データの最初の 2 つの次元は、指定した level でブロック サイズに一致しなければなりません。

ヒント

  • イメージ データを初期化しない構文を使用して、書き換え可能な bigimage を作成します。イメージ データのファイル名、ディレクトリ名、または変数名を指定して、または関数 apply を使用して bigimage を作成する場合、bigimage は書き換え可能にならず、関数 setBlock を使用できません。

  • data のサイズがブロック サイズ bigimg.BlockSize より小さい場合、setBlock は既定値 bigimg.UnloadedValue を使用してデータをパディングします。

  • setBlock は部分エッジ ブロックのデータをトリミングします。

バージョン履歴

R2019b で導入

すべて展開する

R2023b: setBlock は削除予定

bigimage オブジェクトとこの関数は将来のリリースで削除される予定です。代わりに、blockedImage オブジェクトの関数 setBlock を使用してください。

コードを更新するには、まず、イメージ データを書き込むための書き込み可能な blockedImage オブジェクトを作成します。次に、以下の手順に従います。

  • 2 つの要素の順序を入れ替えて、(x, y) ワールド座標を (行, 列) ワールド座標に変換します。

  • 関数 world2sub を使用して、ワールド座標をピクセルの添字に変換します。レベル 1 以外の解像度レベルでブロックを設定するには、名前と値の引数 Level を使用してそのレベルを指定します。

  • 関数 sub2blocksub を使用して、ピクセルの添字をブロックの添字に変換します。レベル 1 以外の解像度レベルでブロックを設定するには、名前と値の引数 Level を使用してそのレベルを指定します。

  • blockedImage の関数 setBlock は、ブロック サイズと等しいデータ サイズを必要とします。ブロック サイズより小さいサイズの blockedImage データを設定するには、データをパディングします。

  • ブロック化されたイメージ、ブロックの添字、および書き込むデータを関数 setBlock に渡します。レベル 1 以外の解像度レベルでブロックを設定するには、名前と値の引数 Level を使用してそのレベルを指定します。

  • blockedImage オブジェクトにデータを書き込んだ後、オブジェクトのモードを読み取り専用に変更してから、イメージ データを取得しなければなりません。たとえば、ドット表記を使用して Mode プロパティを "r" に設定し、blockedImage オブジェクト blockedMask のモードを変更します。

    blockedMask.Mode = "r";

    一方、書き込んだデータは、オブジェクトのプロパティを変更することなく、bigimage オブジェクトから読み取ることができます。

非推奨の使用方法推奨される代替案

この例では、関数 setBlockbigimage オブジェクトと共に使用して、(x, y) ワールド座標 (1000, 2500) の周囲にあるブロックにイメージ データを最も高い解像度レベルで設定します。

% Create a writeable bigimage object
filename = "tumor_091R.tif";
bim = bigimage(filename);
ref = bim.SpatialReferencing(1);
blockSize = bim.BlockSize(1,1:2);
bigMask = bigimage(ref,1,"logical");

% Identify a coordinate
coordWorld = [1000 2500];

% Specify the data to write, then write the data
blockSize = bim.BlockSize(1,1:2);
data = logical(checkerboard(blockSize(1)/16,8));
setBlock(bigMask,1,coordWorld,data);

以下は、blockedImage オブジェクトを使用する等価なコードです。

% Create a writeable blockedImage object
filename = "tumor_091R.tif";
blockedIm = blockedImage(filename);
imgSize = blockedIm.Size(1,1:2);
blockSize = blockedIm.BlockSize(1,1:2);
initVal = logical(0);
blockedMask = blockedImage([],imgSize,blockSize,initVal,Mode="w");

% Identify the block containing a coordinate
coordWorld = [1000 2500];
coordRC = flip(coordWorld);
subPixel = world2sub(blockedMask,coordRC);
subBlock = sub2blocksub(blockedMask,subPixel);

% Specify the data to write, then write the data to the block
data = logical(checkerboard(blockSize(1)/16,8));
setBlock(blockedMask,subBlock,data);

この例では、関数 setBlockbigimage オブジェクトと共に使用して、ブロック サイズより小さいサイズのイメージ データを設定します。

% Create a writeable bigimage object
% (same as above)
% Identify a coordinate
% (same as above)

% Specify the data to write, then write the data
data = logical(checkerboard(10,8));
setBlock(bmask,1,coordWorld,data);

以下は、blockedImage オブジェクトを使用する等価なコードです。

% Create a writeable blockedImage object
% (same as above)
% Identify a coordinate
% (same as above)

% Specify the data to write, then write the data to the block
data = logical(checkerboard(10,8));
data = padarray(data,blockSize-size(data),initVal,"post");
setBlock(blockedMask,subBlock,data);