プロが教えるわが家の防犯対策術!

現在プログラミングで困っています。
そのプログラミングというのは、
「二値化した画像を二次元配列に置き換えそこから重心を求めよ」
というプログラムです。

重心を求めたい画像は、以下の特徴を持っています。
・形はほぼ楕円。
・輝度は0と255で二値化。重心を求める部分の輝度は0となっています

この図形の重心を求めるには、どのようにプログラムを組めば良いのでしょうか。
みなさんのアドバイスをよろしくお願い致します。

また、私はプログラミングについてはほぼ初心者なので、詳しい説明をして頂けると助かります。
お手数なのですが、よろしくお願い致します。

A 回答 (4件)

失礼、



sx += (float)x;
sy += (float)y;

これは、間違い。floatの演算は最後にまとめたので、キャストが不要でした。
単純に、

sx += x;
sy += y;

でOKです。

あと説明が不足していましたが、値が”0”の方が重心を求める輝度と書かれているので、
if ( img[ x ][ y ] == 1 ) {

は、
if ( img[ x ][ y ] == 0 ) {

としてください。
    • good
    • 3

重心の計算方法としては下記などを参考にしてみてください。



http://www.gifu-nct.ac.jp/elec/yamada/iwata/cyu/

これを実際にプログラムするとこんな感じになるはずです。
5x5の二値画像を対象にしていますが、適当にアレンジしてみてください。

#include<stdio.h>

int main( void ) {
intsx = 0;
intsy = 0;
intmm = 0;
intimg[ 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;
floatgpx, 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 );
}
    • good
    • 1

考えてみました。



重心座標を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までやれば重心が出ると思います。

形は何でもいいですが
精度を落としてドット数を減らした所で座標を得れば計算できると思います。
    • good
    • 1

重心を求めることそれ自体は定義通りやればいいのだが, 「二次元配列に置き換え」の意味がわからん. なにをさせたいんだろう.

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!