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

11 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に変わる関数があればご教示ください.

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 16 Nov 2019
コメントありがとうございます.
参考サイトもありがとうございます.

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!