regionpropsのCentroidプロパティについて
12 views (last 30 days)
Show older comments
図のようないびつな画像の黒の部分の重心を求めようと思っています.
この場合,黒の部分は2つあるので,重心は2つとれると思いますが,この2つの島全体の重心をとる場合,質量が考慮されていれば,中点(重心のx座標:(c(1).Centroid(1)+c(2).Centroid(1))/2)をとるだけでいいと思うのですが,考慮されていない場合積分して求める必要があると思い,質問しました.
質量が考慮されていない場合,regionpropsに変わる関数があればご教示ください.
0 Comments
Accepted Answer
Kenta
on 15 Nov 2019
こんにちは、すでに他の方が回答されているようですが、気づいておりませんでした。
以下、参考になれば幸いです。もしかしたらどこか間違っているかもしれませんので、
確認いただけると幸いです。
重心は(1)のように、各質点と位置の積の和を、質量の和で割れば求まると思います。
これは、kusanoさまに添付いただいた資料にもあるように、釣り合いの式から導出できます。
これを今回の例にあてはめると、今回は、図形の面積のようなので、各島の重心の位置は、(2)、(3)のようになって、さらに
あらためて、(1)にならって全島に対する重心を求めようとすると式(4)のようになります。
ここで、regionprops関数によって、すでに各島の重心が求まっているので、それをもとに(4)を書き直すと
(5)のようになります。つまり、各島の重みと面積、重心が求まっていれば、(5)の値も算出できます。
実際に、下のようにコードを書いて、重みを変化させてみると、それらしい結果が得られます。
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)
More Answers (1)
Shunichi Kusano
on 15 Nov 2019
正確にご質問の意図を捉えられているのかいまいち自信がありませんが…。
regionpropsのCentroidで出てくるのは各島の重心ですので、それらの中点をとっても黒(実際に計算するときは白黒反転が必要)全体の重心にはなりません。2値画像であれば、各島の質量=面積になりますので、regionpropsからAreaとCentroidを計算して組合わせれば全体の重心が計算できるかと思います。
3 Comments
Shunichi Kusano
on 15 Nov 2019
重心点を各島の質点と考えると、それぞれの重さの比は面積に比例するので、その割合で按分すればいいと思います。
島の面積、重心点座標ををそれぞれA1,P1, A2,P2としますと
(P1*A1 + P2*A2) / (A1+A2)
で求まる…と思います。
ご参考までですが、検索すると下のようなページで解説が見つかりました。
See Also
Categories
Find more on 領域とイメージのプロパティ in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!