MATLAB Answers

regionprop​sのCentroid​プロパティについて

3 views (last 30 days)
Yumi Iwakami
Yumi Iwakami on 15 Nov 2019
Commented: Yumi Iwakami on 16 Nov 2019
図のようないびつな画像の黒の部分の重心を求めようと思っています.
ex.png
この場合,黒の部分は2つあるので,重心は2つとれると思いますが,この2つの島全体の重心をとる場合,質量が考慮されていれば,中点(重心のx座標:(c(1).Centroid(1)+c(2).Centroid(1))/2)をとるだけでいいと思うのですが,考慮されていない場合積分して求める必要があると思い,質問しました.
質量が考慮されていない場合,regionpropsに変わる関数があればご教示ください.

  0 Comments

Sign in to comment.

Accepted Answer

Kenta
Kenta on 15 Nov 2019
こんにちは、すでに他の方が回答されているようですが、気づいておりませんでした。
以下、参考になれば幸いです。もしかしたらどこか間違っているかもしれませんので、
確認いただけると幸いです。
重心は(1)のように、各質点と位置の積の和を、質量の和で割れば求まると思います。
これは、kusanoさまに添付いただいた資料にもあるように、釣り合いの式から導出できます。
これを今回の例にあてはめると、今回は、図形の面積のようなので、各島の重心の位置は、(2)、(3)のようになって、さらに
あらためて、(1)にならって全島に対する重心を求めようとすると式(4)のようになります。
ここで、regionprops関数によって、すでに各島の重心が求まっているので、それをもとに(4)を書き直すと
(5)のようになります。つまり、各島の重みと面積、重心が求まっていれば、(5)の値も算出できます。
実際に、下のようにコードを書いて、重みを変化させてみると、それらしい結果が得られます。
img.PNG
clear;clc
I = zeros(500,500);
C1 = insertShape(I,'FilledCircle',[300 400 50],'Color',"white",'Opacity',1);
C2 = insertShape(C1,'FilledCircle',[100 400 50],'Color',"white",'Opacity',1);
% figure;imshow(C2)
BW = C2(:,:,1)>0;
figure;imshow(double(BW))
stats = regionprops('table',BW,'Centroid',...
'MajorAxisLength','MinorAxisLength','Centroid','Area')
area = stats.Area;
centroid = stats.Centroid;
w1 = 2;
w2 = 1;
weighted_centroid = (w1*area(1)*centroid(1,:)+w2*area(2)*centroid(2,:))./(area(1)*w1+area(2)*w2)
im2.PNG

  1 Comment

Yumi Iwakami
Yumi Iwakami on 16 Nov 2019
ありがとうございます.
コードまで書いていただいて感謝いたします.

Sign in to comment.

More Answers (1)

Shunichi Kusano
Shunichi Kusano on 15 Nov 2019
正確にご質問の意図を捉えられているのかいまいち自信がありませんが…。
regionpropsのCentroidで出てくるのは各島の重心ですので、それらの中点をとっても黒(実際に計算するときは白黒反転が必要)全体の重心にはなりません。2値画像であれば、各島の質量=面積になりますので、regionpropsからAreaとCentroidを計算して組合わせれば全体の重心が計算できるかと思います。

  3 Comments

Yumi Iwakami
Yumi Iwakami on 15 Nov 2019
コメント,ありがとうございます.
実際に計算に使っているのは白黒反転したものを使っています.
もしご存知でしたら,全体の重心の計算方法をご教示いただけますか?
Shunichi Kusano
Shunichi Kusano on 15 Nov 2019
重心点を各島の質点と考えると、それぞれの重さの比は面積に比例するので、その割合で按分すればいいと思います。
島の面積、重心点座標ををそれぞれA1,P1, A2,P2としますと
(P1*A1 + P2*A2) / (A1+A2)
で求まる…と思います。
ご参考までですが、検索すると下のようなページで解説が見つかりました。
Yumi Iwakami
Yumi Iwakami on 16 Nov 2019
コメントありがとうございます.
参考サイトもありがとうございます.

Sign in to comment.

Sign in to answer this question.