- 締切済み
図形の重心を取るプログラムを教えてください
現在プログラミングで困っています。 そのプログラミングというのは、 「二値化した画像を二次元配列に置き換えそこから重心を求めよ」 というプログラムです。 重心を求めたい画像は、以下の特徴を持っています。 ・形はほぼ楕円。 ・輝度は0と255で二値化。重心を求める部分の輝度は0となっています この図形の重心を求めるには、どのようにプログラムを組めば良いのでしょうか。 みなさんのアドバイスをよろしくお願い致します。 また、私はプログラミングについてはほぼ初心者なので、詳しい説明をして頂けると助かります。 お手数なのですが、よろしくお願い致します。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- KEIS050162
- ベストアンサー率47% (890/1879)
失礼、 sx += (float)x; sy += (float)y; これは、間違い。floatの演算は最後にまとめたので、キャストが不要でした。 単純に、 sx += x; sy += y; でOKです。 あと説明が不足していましたが、値が”0”の方が重心を求める輝度と書かれているので、 if ( img[ x ][ y ] == 1 ) { は、 if ( img[ x ][ y ] == 0 ) { としてください。
- KEIS050162
- ベストアンサー率47% (890/1879)
重心の計算方法としては下記などを参考にしてみてください。 http://www.gifu-nct.ac.jp/elec/yamada/iwata/cyu/ これを実際にプログラムするとこんな感じになるはずです。 5x5の二値画像を対象にしていますが、適当にアレンジしてみてください。 #include<stdio.h> int main( void ) { int sx = 0; int sy = 0; int mm = 0; int img[ 5 ][ 5 ] = { { 1, 1, 1, 0, 0, }, { 1, 1, 1, 1, 0, }, { 0, 1, 1, 0, 0, }, { 0, 1, 1, 0, 0, }, { 1, 1, 0, 0, 0 } }; int x, y; float gpx, gpy; for( x = 0; x < 5 ; x++ ) { for ( y = 0 ; y < 5 ; y++ ) { if ( img[ x ][ y ] == 1 ) { sx += (float)x; sy += (float)y; ++mm; } } } gpx = (float)sx/(float)mm; gpy = (float)sy/(float)mm; printf( "Total = %d, Gravity Center( x, y) = %f, %f\n", mm, gpx, gpy ); return( 0 ); }
- ROKABAURA
- ベストアンサー率35% (513/1452)
考えてみました。 重心座標をx,yとして 対称図形の座標をU(x(a),y(a))として それぞれを順に計算していく。 つまり a=1 から 例えば a=100 まで。 初期値は x=x(1) y=y(1) でその後は a=2 から 100 で x=x+((x(a)-x)/a y=y+((y(a)-y)/a これをa=100までやれば重心が出ると思います。 形は何でもいいですが 精度を落としてドット数を減らした所で座標を得れば計算できると思います。
- Tacosan
- ベストアンサー率23% (3656/15482)
重心を求めることそれ自体は定義通りやればいいのだが, 「二次元配列に置き換え」の意味がわからん. なにをさせたいんだろう.