オブジェクトのトリミング
16 ビュー (過去 30 日間)
古いコメントを表示
添付した図のように、複数の細胞が存在するバイナリイメージ(二値画像)から、細胞を1つ1つトリミングしたいと考えています。
何かいい案を頂けると幸いです。
※以前まで、個々の細胞の重心を求め、そこを中心として必要なピクセルにトリミングしようと考えていたのですが、
全体のバイナリイメージから個々の細胞の重心を求める方法が分からず断念致しました。
2 件のコメント
Akira Agata
2021 年 9 月 16 日
バイナリーイメージ内で細胞が1つ1つ分離しているものについては、regionprops 関数で Bounding Box を計算することでトリミング (クロップ) 可能です。また、同じ関数により個々の細胞の重心も求めることができます。ただ、複数の細胞が融合して "かたまり" になっている部分では、そのような処理は困難です。
まずは細胞が1つ1つ分離しているものについてのみ計算する、というアプローチでも問題ないでしょうか?
採用された回答
Atsushi Ueno
2021 年 9 月 25 日
編集済み: Atsushi Ueno
2021 年 10 月 16 日
各位のコメント内容を実際に動かしてみました。尚、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 件のコメント
その他の回答 (0 件)
参考
カテゴリ
Help Center および File Exchange で 領域とイメージのプロパティ についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!