- 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) % 穴をあけた背景画像とトリミング&マスク済の細胞画像を合わせる