ラベリングした画像の​ラベルごとの面積を求​めるにはどうしたらよ​いですか?

42 ビュー (過去 30 日間)
Yumi Iwakami
Yumi Iwakami 2017 年 12 月 21 日
コメント済み: Tohru Kikawada 2017 年 12 月 25 日
バイナリイメージの白の部分の面積を求め,一定の閾値より小さいものを削除するプログラムを作成するために,ラベリング処理をしてラベルごとの面積を求めようとしているのですが方法がわかりません.
上記のページを参考にしているのですが,このページだと例えばラベル1は6ピクセル,ラベル2は6ピクセル,ラベル3だけ5ピクセルなのでラベル3の部分を0に置き換えるようなプログラムを作ろうとしています.

採用された回答

Tohru Kikawada
Tohru Kikawada 2017 年 12 月 22 日
ある面積以下の領域を0に置き換えたい場合は bwareaopen が使えそうです。
それとも特定の面積の領域を0にしたいのでしょうか。その場合には bwarea が使えそうですね。
領域解析を詳細にやりたい場合は regionprops も使えるかもしれません。ご参考まで。
  3 件のコメント
Tohru Kikawada
Tohru Kikawada 2017 年 12 月 25 日
regionprops のヒントの項目に置き換える方法の記載がありますよ。また、 accumarray を活用すると輝度値の合計もシンプルに求められます。
%%元画像の読み込み(グレイスケール)
G = imread('coins.png');
figure, imshow(G);
%%2値化
BW = imbinarize(G);
BW2 = imfill(BW,'holes');
figure, imshow(BW2);
%%面積が2000ピクセル以下を抽出
CC = bwconncomp(BW2);
stats = regionprops('table',CC,'Area','Centroid');
figure, histogram(stats.Area,10);
idx = stats.Area <= 2000
%%2000ピクセル以下の領域を0にする
% 2000ピクセルを超える領域だけを抽出する
BW3 = ismember(labelmatrix(CC), find(~idx));
figure, imshowpair(BW2,BW3,'montage');
%%2000ピクセル以下の領域の輝度値の和
% 領域ごとの輝度値の和を求める
L = labelmatrix(CC)+1; % ラベルを1はじまりにするため+1
A = accumarray(L(:),double(G(:))); % ラベルごとの累積値計算
A = A(2:end); % 0に相当する項目(黒)を除去
% 面積が2000ピクセル以下の累積値を可視化
Iout = G;
BW4 = ismember(labelmatrix(CC), find(idx));
Iout(~BW4) = 0; % 該当箇所以外すべて0にする
Iout = insertText(Iout,stats.Centroid(idx,:),cellstr(num2str(A(idx))));
figure, imshow(Iout);
Yumi Iwakami
Yumi Iwakami 2017 年 12 月 26 日

ご丁寧な解説ありがとうございます. やってみます.

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

その他の回答 (0 件)

製品

Community Treasure Hunt

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

Start Hunting!