オブジェクトのトリミング
4 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
HIGUCHI 樋口
am 15 Sep. 2021
Bearbeitet: Atsushi Ueno
am 16 Okt. 2021
添付した図のように、複数の細胞が存在するバイナリイメージ(二値画像)から、細胞を1つ1つトリミングしたいと考えています。
何かいい案を頂けると幸いです。
※以前まで、個々の細胞の重心を求め、そこを中心として必要なピクセルにトリミングしようと考えていたのですが、
全体のバイナリイメージから個々の細胞の重心を求める方法が分からず断念致しました。

2 Kommentare
Akira Agata
am 16 Sep. 2021
バイナリーイメージ内で細胞が1つ1つ分離しているものについては、regionprops 関数で Bounding Box を計算することでトリミング (クロップ) 可能です。また、同じ関数により個々の細胞の重心も求めることができます。ただ、複数の細胞が融合して "かたまり" になっている部分では、そのような処理は困難です。
まずは細胞が1つ1つ分離しているものについてのみ計算する、というアプローチでも問題ないでしょうか?
Akzeptierte Antwort
Atsushi Ueno
am 25 Sep. 2021
Bearbeitet: Atsushi Ueno
am 16 Okt. 2021
各位のコメント内容を実際に動かしてみました。尚、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 Kommentare
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu Image Processing Toolbox finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

