オブジェクトの輪郭でトリミング、貼り付け

16 views (last 30 days)
HIGUCHI 樋口
HIGUCHI 樋口 on 11 May 2022
Answered: Atsushi Ueno on 11 May 2022
細胞画像を2値化して細胞1個1個を抽出したいと考えています。(あとでfor文で全細胞をやる予定)
方針としては下図のように、特定の細胞だけを2値化して、白い部分の輪郭座標を生画像をリンクさせて切り取り、
切り取ったものを別紙の中央に張り付けるといった事をしたいと考えています。(別紙の中央と2値化画像の細胞の重心を合わせたい)
2値化画像で目的の細胞を残すところまでは出来ているのですが、
2値化画像の白い部分の輪郭で画像(画像①)を切り取って、中央に張り付ける箇所で難航しています。
少々複雑になってしまいますが、よろしくお願いします。
Cell.jpgは細胞の生画像、Cell_binary.jpg は特定細胞の2値画像、back.jpgは張り付ける別紙

Answers (1)

Atsushi Ueno
Atsushi Ueno on 11 May 2022
  • jpeg形式のマスク画像(uint8として読み込み)は改めて二値化しました
  • 細胞画像と背景画像はRGB3層のカラー画像として読み込みました
  • find関数で探した非ゼロ(黒以外の)画素のx,y座標の最小~最大部分をトリミングします
  • 重心を求める為に使っているregionprops関数はImage Processing Toolboxが必要です
cell = imread('Cell.jpg'); % cellは細胞画像: uint8(1000*700*3)
bnry = imread('Cell_binary.jpg') > 127; % bnryはマスク画像: logical(1000*700*1)
back = imread('back.jpg'); % backは背景画像: uint8(300*300*3)
[row,col,~] = ind2sub(size(bnry),find(bnry)); % マスクの非ゼロ(黒以外の)画素のx,y座標を得る
cell = cell(min(row):max(row),min(col):max(col),:); % 黒以外の最小~最大x,y範囲をトリミング
bnry = bnry(min(row):max(row),min(col):max(col),:); % 黒以外の最小~最大x,y範囲をトリミング
cell = cell .* repmat(uint8(bnry),[1 1 3]); % 細胞画像とマスク画像の論理積(AND)を取る
imshow(cell)
s = regionprops(bnry,'centroid'); % マスクにおける連結要素の重心を計算(1個しかない事を想定)
ceny = ceil(s.Centroid(1)); % 重心のY座標
cenx = ceil(s.Centroid(2)); % 重心のX座標
mask = logical(ones(size(back))); % 背景画像: と同サイズの逆マスクmask:logical(300*300*3)を作成
mask(150-ceny:150-ceny+size(bnry,1)-1,150-cenx:150-cenx+size(bnry,2)-1,:) = repmat(~bnry,[1 1 3]); % 重心の中央に合わせマスクで穴をあける
back = back .* uint8(mask); % 背景画像と逆マスクの論理積(AND)を取り細胞形の穴をあける
back(150-ceny:150-ceny+size(bnry,1)-1,150-cenx:150-cenx+size(bnry,2)-1,:) ...
= back(150-ceny:150-ceny+size(bnry,1)-1,150-cenx:150-cenx+size(bnry,2)-1,:) + cell;
imshow(back) % 穴をあけた背景画像とトリミング&マスク済の細胞画像を合わせる

Products


Release

R2022a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!