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

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

Accepted Answer

Tohru Kikawada
Tohru Kikawada on 22 Dec 2017
ある面積以下の領域を0に置き換えたい場合は bwareaopen が使えそうです。
それとも特定の面積の領域を0にしたいのでしょうか。その場合には bwarea が使えそうですね。
領域解析を詳細にやりたい場合は regionprops も使えるかもしれません。ご参考まで。
  3 Comments
Tohru Kikawada
Tohru Kikawada on 25 Dec 2017
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 on 26 Dec 2017

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

Sign in to comment.

More Answers (0)

Products

Community Treasure Hunt

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

Start Hunting!