質問: オブジェクトのトリミング 添付した図のように、複数の細胞が存在するバイナリイメージ(二値画像)から、細胞を1つ1つトリミングしたいと考えています。 何かいい案を頂けると幸いです。 ※以前まで、個々の細胞の重心を求め、そこを中心として必要なピクセルにトリミングしようと考えていたのですが、 全体のバイナリイメージから個々の細胞の重心を求める方法が分からず断念致しました。
回答: 各位のコメント内容を実際に動かしてみました。尚、image processing toolboxが必要です。 i = imread('saibou.png'); bw = imbinarize(rgb2gray(i)); % カラー⇒グレースケール⇒二値化 bw = imopen(bw,strel('disk',10)); % モルフォロジーオープニングで小さなドットを除く % bounding box, 重心, 面積を得る stats = regionprops('table', bw, {'centroid', 'boundingbox', 'area'}); idx = stats.area > 10000; stats(idx,:) = []; % 面積が10000ピクセル以上の領域は以降の処理から除外する bb = stats.boundingbox + [-40 -40 80 80]; % bounding boxに余白を付ける imshow(i); hold on; % 加工前画像。小さなドットや接触した細胞は認識されない plot(stats.centroid(:,1),stats.centroid(:,2),'b*'); % 重心を表示 for i = 1:size(bb,1) rectangle('position', bb(i,:), 'edgecolor', 'y'); % bounding boxを表示 end hold off; for i = 1:size(bb,1) crop{i} = imcrop(bw, bb(i,:)); % 細胞を1つ1つトリミングする(一部はくっついたまま) if any([crop{i}(1,:) crop{i}(end,:) crop{i}(:,1)' crop{i}(:,end)']) crop{i} = ~crop{i}; % bounding boxの境界に他の細胞が写り込んだら反転表示 end end montage(crop); % トリミングした二値化画像を並べて表示