アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在プログラミングで困っています。
そのプログラミングというのは、
『ビットマップ画像(640×480pixel)中に表示された図形の中心を求める』
というプログラムです。

中心を求めたい図形は、以下の特徴を持っています。
・大きさは一定ではない。10×10~20×20pixelの大きさ。
・形はほぼ正方形。厳密に言うと、台形や平行四辺形に近い形。
・輝度は255。

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

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

A 回答 (2件)

#1 さんの方法では重心は求まりません.



> 1.水平線を引き、したから上に移動する。上下の図形のピクセル数が等しくなったらとめる。
> 2.垂直線を引き、左から右に移動する。左右の図形のピクセル数が等しくなったらとめる。

これらは重心を求めているのではなく,面積を縦横それぞれについて2等分しているだけです.

重心は面積を2等分する点ではなくて,そのまわりの1次モーメントが釣り合う (0になる) 点です.

重心を求める (物理のかぎしっぽ)
http://www12.plala.or.jp/ksp/mechanics/CG/

2次元での一般的な重心 (Xg, Yg) の定義は,
位置 (x, y) の密度を ρ(x, y) とすると,

・質量
 M = ∫∫ρ(x, y) * dx * dy

・Xの (つまりY軸まわりの) 1次モーメント
 Ix = ∫∫ρ(x, y) * x * dx * dy

・Yの (つまりX軸まわりの) 1次モーメント
 Iy = ∫∫ρ(x, y) * y * dx * dy

・重心
 Xg = Ix / M
 Yg = Iy / M

画像処理でいう「重心」は,密度の代わりに輝度 (画素値) p(x, y) を使うので,

 M = Σ{x} Σ{y} p(x, y)
 Ix = Σ{x} Σ{y} p(x, y) * x
 Iy = Σ{x} Σ{y} p(x, y) * y

質問文中の「輝度は255」というのは,たぶん二値画像で
「輝度は0または255」ということだと思います.
その場合には次のようにすれば無駄な計算をせずに重心が求められます.

 M = (輝度=255の画素数)
 Ix = Σ{輝度=255の画素} x
 Iy = Σ{輝度=255の画素} y

今は時間がないのでこの辺で.
あとは自分で考えるか,他の方の回答を待ってください.


QNo.3233875:濃淡画像の縦方向のゆがみを求めたいのですが・・
http://okwave.jp/qa3233875.html
    • good
    • 0
この回答へのお礼

返信が遅くなってしまい、申し訳ありません。
簡易化したプログラムを作ることにしたのですが、
noocyteさんのアドバイスは非常に参考になりました。
ありがとうございました。

お礼日時:2007/12/20 00:09

問題を解く前に中心を定義する必要があります。


円や楕円には、中心がありますが、台形や平行四辺形に近い形には、「中心」がありません。
その他には長方形や菱形、平行四辺形のような点対称な図形の重心のことを中心(もしくは対称の中心)とよぶこともあるので、重心を求めることにしましょうか。

1.水平線を引き、したから上に移動する。上下の図形のピクセル数が等しくなったらとめる。

2.垂直線を引き、左から右に移動する。左右の図形のピクセル数が等しくなったらとめる。

3.水平線と垂直線の交点を求め重心点とする。
    • good
    • 0
この回答へのお礼

お答えありがとうございます。

この方法をプログラムとして記述したいのですが、
どのようにプログラムを組んでよいのかが分かりません。

稚拙で大変恐縮なのですが、
プログラムの組み方を簡単で結構なので教えて頂けませんでしょうか。

お礼日時:2007/11/21 11:07

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