ママのスキンケアのお悩みにおすすめアイテム

以下のプログラムは重心を求めるプログラムなそうなのですが、例えば検出した円や四角形の重心を取るとします。
ここで質問なのですが、
以下のプログラムでどうやって重心を求めているのでしょうか?
アルゴリズムが知りたいです。

//重心の計算
int count=0;
double x_g=0.0,y_g=0.0,x_d=0.0,y_d=0.0,xy_d=0.0
for(int y=0; y<height; y++){
for(int x=0;x<width; x++){
if(img_src[y*width+x] == 255){
count++;
x_g +=x;
y_g +=y;
}
}
}
x_g /=conut;
y_g/=count;

A 回答 (5件)

AN04です。

ああ、 venomctun さんか。
じゃあ何も知らないですよね。

http://wakariyasui.sakura.ne.jp/p/mech/gou/jyuus …

このあたりをしっかり読んで、重心の定義をしっかり頭に入れて下さい。
図形の重心の場合は、各ピクセルが同じ重さ同じと仮定してます。
すると、重心は各ピクセルの座標値の単純平均になります。
    • good
    • 0
この回答へのお礼

理解できました。ありがとうございます。

お礼日時:2018/06/11 01:01

>もしかしたら重心を取るのは現実世界でも


>画像処理の世界でも難しいため平均を用いたのかもしれませんが。

そこまでいうのなら、あなたの知っているか
重心の定義をここにかいてみましょう。
    • good
    • 0

>どうやって、全座標の平均値が重心の座標になることを見つけだしたかはわかりませんが。



No.1の方も仰っていますが、重心(幾何学中心)の定義を知っていればそんな疑問は沸かないと思います。
    • good
    • 6

>なぜ平均にしようとしたのか知りたいです。



if(img_src[y*width+x] == 255){
とあるように、均質と仮定しているからでしょう。

また、このプログラムではimg_src[]に全ピクセル(もしくは一定の粒度の格子点)情報が格納されているものを利用して全座標をなめているので、円や四角形に限らず、任意の複雑な図形にも対応していると思います。
    • good
    • 1
この回答へのお礼

どうもありがとうございます。
ちなみに全座標を調べるのはわかりました。そして検出した全座標の平均が重心となるため、平均値をだしたという事でしょうか?
どうやって、全座標の平均値が重心の座標になることを見つけだしたかはわかりませんが。

お礼日時:2018/06/07 13:17

そのプログラムがアルゴリズムそのものです。


「重心は座標の平均」という定義をそのままプログラムにしただけです。
何も特殊な技術は使われていないので、初心者でもわかります。

そもそもの「重心」って何だか理解していますか?
理解できていないなら、まずは、数学や画像処理の知識を身につけましょう。
    • good
    • 5
この回答へのお礼

どうもありがとうございます。理解が浅はかでした。
ちなみに、座標の平均でないと重心はもとまらないのでしょうか?
なぜ平均にしようとしたのか知りたいです。もしかしたら重心を取るのは現実世界でも画像処理の世界でも難しいため平均を用いたのかもしれませんが。

お礼日時:2018/06/07 09:08

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

Qn角形の重心を求めるアルゴリズム

平面2次元のn角形の頂点のデータがあります。n点の座標ですから(x,y)がn個並んでいます。そのような図形の図心(重心)の座標を計算するアルゴリズムがないでしょうか。最終的にはプログラムとして離散的な処理をするため、1%ぐらいの誤差は許容範囲です。n角形と言ってもせいぜいn=3,4,5,6程度です。

欲を言うと、3次元も考えており、平面に含まれることが分かっているn個の点(3次元空間内)を平面の2次元空間に変換して重心を求め、それを3次元空間に引き戻せば3次元での重心となります。そのためにも2次元での重心の座標を求めるアルゴリズムが必要なのです。

よろしくお願いします。

Aベストアンサー

n角形の頂点を、辺を一周する順に番号付けて P[k], k = 0,1,2,…,n-1 とします。

図形を分割すると、重心は、分割された各部品の重心を、各部品の面積で加重平均
したものになりますから、同じ平面内に点 Q をとって、
△QP[k]P[k+1], k = 0,1,2,…,n-1 (ただし P[n] は P[0] の別名とする)
の重心 (Q + P[k] + P[k+1]) / 3 を、△QP[k]P[k+1] の面積を重みとして
加重平均すればよいことになります。Q は、P[n-1] を採用してかまいません。

その際、△QP[k]P[k+1] がn角形の中にあるか外にあるかに従って、面積に正負を
付けて扱う必要があるため、面積 △QP[k]P[k+1] = (1/2)|↑QP[k]×↑QP[k+1]| の
替わりに、絶対値をつけない ↑QP[k]×↑QP[k+1] そのものを重みとして扱うほうが
便利でしょう。スカラーの計算で済ますために、n角形が乗っている面に平行でない
ベクトル V をひとつ固定して、↑QP[k]×↑QP[k+1]・V を重みにすれば、尚よい。
外積との内積だから、スカラー三重積ですね。平面の方程式が既知ならば、その
法線ベクトルが V として使えるし、そうでなければ、V = ↑QP[0]×↑QP[1] と
してもよいです。

以上まとめると…
Q = P[n-1] とする。
V = ↑QP[0]×↑QP[1] とする。
k = 0,1,2,…,n-3 の夫々について、
  X[k] = (Q + P[k] + P[k+1]) / 3 と
  w[k] = ↑QP[k]×↑QP[k+1]・V を求める。
重心は、(Σ w[k] X[k]) / (Σ w[k]) である。

← No.1
順序付けの自動化は、原理的に無理でしょう。
頂点の集合が同じでも、順序付けが異なると、n角形は別のものになる訳ですから。

n角形の頂点を、辺を一周する順に番号付けて P[k], k = 0,1,2,…,n-1 とします。

図形を分割すると、重心は、分割された各部品の重心を、各部品の面積で加重平均
したものになりますから、同じ平面内に点 Q をとって、
△QP[k]P[k+1], k = 0,1,2,…,n-1 (ただし P[n] は P[0] の別名とする)
の重心 (Q + P[k] + P[k+1]) / 3 を、△QP[k]P[k+1] の面積を重みとして
加重平均すればよいことになります。Q は、P[n-1] を採用してかまいません。

その際、△QP[k]P[k+1] がn角形の中にあるか外にあるかに従...続きを読む

QN点間の中心と重心の求め方

X軸、Y軸にN個の座標が存在するとき、それらの中心となる点と重心点は、どうしたら求まるのでしょうか?

Aベストアンサー

2個の場合、A(χ1,y1)、B(χ2,y2)とすれば、
g((χ1+χ2)/2,(y1+y2)/2)であるから、
N個の点を、Nn(χn,yn)とすれば、
G(χ,y)=((Σχn)/n,(Σyn)/n))

Σχnは、χ座標の点のすべての和、即ち、χ1、χ2、χ3、χ4・・・・χnの和を表しています。

Q座標から図形の重心座標を求める方法

約500点のXY座標が存在します。
各点は順に接続し、開始点と終了点が閉合する多角点の重心座標を求める方法を教えてください。

Aベストアンサー

多角形の重心であれば、1,2,..,i,i+1,...と繋ぐとして
X座標が
(1/6S)Σ(X(i)+X(i+1))(Y(i)X(i+1)-X(i)Y(i+1))
X座標が
(1/6S)Σ(Y(i)+Y(i+1))(X(i)Y(i+1)-Y(i)X(i+1))
Sは多角形の面積です。

No.1は、頂点にのみ質量があった場合です。

参考URL:http://www.tokyo-pax.co.jp/200203.htm

Q図形の中心の取り方を教えてください。

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

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

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

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

Aベストアンサー

#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

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

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

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

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

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

Q画像のベクトルは等速円運動を表した物なのですが、等速なのでv→とv'→は同じなのですが、なぜ差分が0

画像のベクトルは等速円運動を表した物なのですが、等速なのでv→とv'→は同じなのですが、なぜ差分が0ではないのでしょうか?
多分、向きと大きさを表していると思うのですが。

Aベストアンサー

片方のベクトルを分解してみると分かりやすいと思いますが同じ方向に対する大きさには差が生じます
また、
その直角の方向にも力が生じます
それによって現れるのがΔvです

Qリンカの必要性ってなんですか? 例えば、自作したCPUでアセンブリプログラムでプログラムを組む上で、

リンカの必要性ってなんですか?
例えば、自作したCPUでアセンブリプログラムでプログラムを組む上で、アセンブリプログラムの為のアセンブルを作るとします。
その際にリンカをつくる必要はあるのでしょうか?
単純にアセンブリ命令を機械語に変換するだけのアセンブラにリンカは必要なのかと思いました。
また、pcのCPUのアセンブリ言語もCPUに対してだいたいが一対一で対応しているため
以上と同じ単純な原理に思えてリンカの必要性がわかりません。
というかどこでリンカが働いているのやら。
なんか、リンカスクリプトとかもありますが、リンカ同様にどこで働いているんだろうという感じです。

Aベストアンサー

結論は「理論的にリンカが絶対必要な理由はない。ただし、作業効率を考えると無しは難しい。」です。

リンカが行っている作業の内容は思いに以下の通りです。
1.コンパイラが生成したオブジェクト同士の結合
2.OS機能やDLL呼び出しの為のスタブ結合
3.プログラミング言語ライブラリの結合
4.コンパイラが生成したオブジェクトを超えた呼び出し(メソッド呼び出しやほかのクラス等のPublicフィールドや外部変数へのアクセス)を行っている個所のアドレスを仮値から真値への書き換え

より大きな視点で見ればコンパイラの出力を実行可能なEXEファイルに加工する作業です。

このうち1と2と3はほとんどファイル結合するだけですので手作業だけでもそれほど難しくなく行えます。
4が問題になるところで、コンパイラによって差はあれWindowsでプロセスをただ立ち上げて終了するだけ(C言語で言うMain関数の処理なし)のプログラムを作っただけで数十カ所の書き換えが必要になります。
結合対象のオブジェクトのサイズ、OS機能やDLL呼び出しの為のスタブのサイズ、呼び出し元と呼び出し先の間に入るオブジェクトのサイズ、呼び出し元と呼び出し先の間に入るスタブのサイズ等の多くの条件を考慮しながら真値を計算し、すべての個所を間違いなく置き換える作業を何百万、何千万と人が行う事は不可能に近いです。
バイナリファイルを直接編集できるからコンパイラやアセンブラは絶対必要なわけではないけれど、無いと大変困るという事例に大変似ています。

独自CPUとの事ですのでi386のCALL命令やRET命令に相当する命令を実装せずJMP相当の命令で代用し、かつ、コンテキストスイッチを実装せず、OS、アプリケーションを問わずシングルプロセスしか許容しないという設計にすればリンカが存在しない・できないCPUは作れるかもしれません。

結論は「理論的にリンカが絶対必要な理由はない。ただし、作業効率を考えると無しは難しい。」です。

リンカが行っている作業の内容は思いに以下の通りです。
1.コンパイラが生成したオブジェクト同士の結合
2.OS機能やDLL呼び出しの為のスタブ結合
3.プログラミング言語ライブラリの結合
4.コンパイラが生成したオブジェクトを超えた呼び出し(メソッド呼び出しやほかのクラス等のPublicフィールドや外部変数へのアクセス)を行っている個所のアドレスを仮値から真値への書き換え

より大きな視点で見ればコンパ...続きを読む

Qなぜ、加速度に時間を掛けても道のりはわからないのでしょうか? 速度と加速度の違いはわかりますが、速度

なぜ、加速度に時間を掛けても道のりはわからないのでしょうか?
速度と加速度の違いはわかりますが、速度は加速度から出来ています。なのに加速度に時間を掛けても道のりが導けない事になんだか違和感があります。
単位的に見ればとりあえずは納得できます。

Aベストアンサー

加速度に時間を乗ずると速度の加減が求まるだけです。距離を求めるためには積分が必要です。

Qx=v0t+1/2at^2に関しての質問です。 初めの0とv=atとなったときの平均値を使うとv=(

x=v0t+1/2at^2に関しての質問です。
初めの0とv=atとなったときの平均値を使うとv=(0+at)/2、x=vt=(0+at)t/2=at²/2となります。
さらに、初めの速度がv0のときはx=v0tを加えてx=at²/2+ v0tとなります。
グラフや図形を見たりすれば、なぜ平均値を導き(0+at)t/2となる事はわかるのですが、頭でイメージするとなぜ等加速度直線運動を始める速度0からある速度vまでの和(速度0+ある速度v)ではなく、平均値(速度0+ある速度v)/2なのだろうかと疑問が湧いてきます。
どうか、図というより文章的にわかりやすく説明していただけないでしょうか?
どうかよろしくお願いします。

Aベストアンサー

①1m / sで9秒走ると、距離は9m
 その直後の1秒は11m / sで走ると距離は11m。
 距離の合計は20m,要した時間は10秒
①平均速度は1m / sが9回と11m / sが1回。
 だから(1m/s×9回+11m/s×1回)÷10回=2m/s。
 距離20m÷平均速度2m/s=10秒・・・・・①で要した時間と同じ
上の①の場合貴方は平均速度の計算どうして計算しますか?。
多分(1m/s+11m/s)÷2=6m/s、なんて計算しかねないように思えてなりません。
確かに言葉で表現された速度の数値は9と11の2つだけですね、単純にその数値だけの平均なら6になります、貴方の頭の中の平均速度はこんな計算の数値の速度です、小学性あたりではそんな理解しかできません。
言い換えれば表面だけしか見えていません。
本当は比例する・・・なんて言葉を使いたかったのですが小学性ではまだ習っていないかも?、それなので、3行越える文章になってしまいましたので、国語の理解能力が無いと理解できないかも知れません。

Q今現在、自作の式を作っているのですが、 火のついたタバコでタバコのフィルターを押すとどれだけ深く入る

今現在、自作の式を作っているのですが、
火のついたタバコでタバコのフィルターを押すとどれだけ深く入るかの式を作っています。
深さ/押す力=k①
熱と押す力は反比例と考えると
熱×押す力=K②
①と②の理論式より組み合わせて、理論式を作りたいのですが、この後のk,Kの求め方がイマイチわかりません。
どうか、知恵を貸して頂けないでしょうか?

Aベストアンサー

No.2へのコメントについてです。

> 導かれた論理式を使って縦横の軸を決めて実験したグラフが論理式と近所できた場合は、その論理式は現象を表していると言えるのでしょうか?

 「論理式」とか「近所」とかの用語の間違いはさておいて。
 
 データをうまく近似できた場合、その理論は少なくとも「近似式」あるいは「実験式」と呼ばれるものになります。実験をする前に結果を予測する、実験をしなくても結果が計算できる、という意味で価値を持っています。
 ただし、その式が現象の本質を捉えているかどうかはわからない。もし実験の条件を大きく変えて(たとえば「火のついたタバコでタバコのフィルターを押す」のではなく、「火のついた線香でタオルを押す」のように)、それでも実験とよく合うのであれば、現象を的確に捉えている可能性が出てくる。理論はそれが現象と合う範囲(適用範囲)でのみ意味を持つわけですが、その範囲が広いほど値打ちが高い理論であるわけです。
 しかし、「これこそが、正確に現象を表している正しい理論だ」と断定することはどこまで行っても不可能です。というのは、理論と合わない現象が見つかれば、適用範囲がそこまでだったということになる。数学では命題が証明できる(そして、その命題を定理と呼ぶ)ことが多々ありますけれども、この意味での証明は、科学では不可能です。現時点で科学の教科書に書いてある理論だって「今のところもっとも蓋然性が高い」というだけであり、いつかは必ず書き換えられる。だから、

> 時には実際に実験しなければわからないこともありますが。

いやいや、そんな甘いもんじゃないですね。科学の理論は現実の現象に絶対服従しなくてはならないのですから、「実験・観察ありき」なんです。つまり、ご質問は「数学」ではなく、「自然科学」の話なんです。

No.2へのコメントについてです。

> 導かれた論理式を使って縦横の軸を決めて実験したグラフが論理式と近所できた場合は、その論理式は現象を表していると言えるのでしょうか?

 「論理式」とか「近所」とかの用語の間違いはさておいて。
 
 データをうまく近似できた場合、その理論は少なくとも「近似式」あるいは「実験式」と呼ばれるものになります。実験をする前に結果を予測する、実験をしなくても結果が計算できる、という意味で価値を持っています。
 ただし、その式が現象の本質を捉えているかどうか...続きを読む

Qベルヌーイの定理において、 どうやって理論から導いたのでしょうか? また、ベルヌーイの定理を使えばど

ベルヌーイの定理において、
どうやって理論から導いたのでしょうか?
また、ベルヌーイの定理を使えばどんな複雑な水や空気の流れの圧力や力を求められるのでしょうか?

Aベストアンサー

No.1です。お礼ありがとうございます。

圧力のエネルギー
PV

位置エネルギー
mgh

運動エネルギー
(1/2)mv²

3つの和が一定だから
PV+mgh+(1/2)mv²=一定

m=ρVより

PV+ρVgh+(1/2)ρVv²=一定

ρVで割って

P/ρ+gh+v²/2=一定
となります。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング