3

ユークリッド距離アルゴリズムを使用して、色とimに基づいて2つの画像を相互に比較するプログラムを作成していますが、実行して2つの画像を渡すと、1つの距離が得られ、同じ画像を渡すと、その逆になります。まったく異なる結果のセットを取得します。

これは正常ですか、それとも答えは同じである必要がありますか?

ユークリッド距離を計算するために使用しているステートメントは次のとおりです。

distance = (int) Math.sqrt(   (rgb1.getR()-rgb2.getR())^2
                            + (rgb1.getG()-rgb2.getG())^2
                            + (rgb1.getB()-rgb2.getB())^2
                          );
4

3 に答える 3

7

投稿したコードを見ると、RGB 値が int のように見えます。ただし、^演​​算子は累乗演算子ではなく、XOR (排他的 OR) - ビット演算です。したがって、二乗を正しく計算するには、通常の乗算​​を使用します。たとえば、一時変数を使用してから、演算子の代わりにint deltaR = rgb1.getR()-rgb2.getR();数式を記​​述します。RGB 値はおそらく 0 から 255 の範囲になるため、オーバーフローの問題は発生しません。または、式で etc. を使用することもできます。deltaR*deltaR^Math.pow(rgb1.getR()-rgb2.getR(),2)

于 2012-03-10T22:00:28.930 に答える
2

Javaで数値を二乗するには、を使用するMath.pow(x, 2)か、さらに単純にしx * xます。式x ^ 2は二乗せずx、代わりに。とXOR x2ます。

あなたのコードでは:

int diffR = rgb1.getR() - rgb2.getR();
int diffG = rgb1.getG() - rgb2.getG();
int diffB = rgb1.getB() - rgb2.getB();

int distance = (int) Math.sqrt(diffR*diffR + diffG*diffG + diffB*diffB);

...あなたのアルゴリズムはよくわかりませんが、それは別の問題です。

于 2012-03-10T22:02:16.303 に答える
0

人々が言っ​​ているように、あなたはMath.pow(x, 2)二乗に使うことができます。個人的な経験から、この関数を頻繁に呼び出す場合は、乗算を自分で書き出す方がよい場合があります。つまり、Math.sqrt((deltaX * deltaX) + (deltaY * deltaY) + (deltaZ * deltaZ));醜いように見えるかもしれませんが、両方の形式のコードをプロファイリングするとMath.pow、単純な乗算よりもはるかに低速です。Math.sqrt明らかに、呼び出しについては何もすることはありません。

于 2012-03-10T22:06:06.967 に答える