MATLAB Answers

オブジェクトのトリミング

39 ビュー (過去 30 日間)
HIGUCHI 樋口
HIGUCHI 樋口 2021 年 9 月 15 日
編集済み: Atsushi Ueno 2021 年 10 月 16 日 10:13
添付した図のように、複数の細胞が存在するバイナリイメージ(二値画像)から、細胞を1つ1つトリミングしたいと考えています。
何かいい案を頂けると幸いです。
※以前まで、個々の細胞の重心を求め、そこを中心として必要なピクセルにトリミングしようと考えていたのですが、
全体のバイナリイメージから個々の細胞の重心を求める方法が分からず断念致しました。
  2 件のコメント
HIGUCHI 樋口
HIGUCHI 樋口 2021 年 9 月 23 日
ご丁寧な説明ありがとうございました。
大変申し訳ありませんがBounding Box を用いたトリミング方法は使用方法が理解できなかったため、
御指摘頂いたregionprops関数で、1つ1つの細胞の重心座標を求めて、そこの座標を中心としたて必要なピクセル数でトリミングする方法を使用しました。
複数細胞が融合しているものに関しましては除外するので問題ありません。1つ1つが明確に分離されているものを重心位置からトリミングするというアプローチで問題ありません。

サインインしてコメントする。

採用された回答

Atsushi Ueno
Atsushi Ueno 2021 年 9 月 25 日
編集済み: Atsushi Ueno 2021 年 10 月 16 日 10:13
各位のコメント内容を実際に動かしてみました。尚、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); % トリミングした二値化画像を並べて表示
  4 件のコメント
HIGUCHI 樋口
HIGUCHI 樋口 2021 年 10 月 10 日 2:00
無事細胞個々でトリミング出来ました。お二方本当にありがとうございました。

サインインしてコメントする。

その他の回答 (0 件)

Community Treasure Hunt

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

Start Hunting!