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

조회 수: 20 (최근 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!