3

我正在编写一个程序来根据颜色和我使用欧几里德距离算法将两个图像相互比较但是当我运行它并传入两个图像时我得到一个距离然后当我传入相同的图像但反过来我得到一组完全不同的结果。

这是正常的还是答案应该是一样的?

我用来计算欧几里得距离的语句是:

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

3 回答 3

7

查看您发布的代码,您的 RGB 值看起来是整数。但是,^运算符不是幂运算符,而是XOR(异或) - 一种按位运算。因此,为了正确计算平方,请使用常规乘法 - 例如,使用临时变量int deltaR = rgb1.getR()-rgb2.getR();,然后在公式中写入deltaR*deltaR而不是^运算符。您的 RGB 值可能在 0 到 255 范围内,因此不应该存在溢出问题。或者,您可以Math.pow(rgb1.getR()-rgb2.getR(),2)在公式中使用 etc.。

于 2012-03-10T22:00:28.930 回答
2

要在 Java 中对数字求平方,请使用Math.pow(x, 2)甚至更简单的x * x. 该表达式x ^ 2不是平方x,而是与 进行异或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 回答