我正在编写一个程序来比较两个图像相互比较基于颜色和im使用欧几里德距离算法然而当我运行它并传入两个图像我得到一个距离,然后当我传入相同的图像,但另一个我会得到一组完全不同的结果。
这是正常的还是答案应该相同?
我用来计算欧几里德距离的陈述是:
distance = (int) Math.sqrt( (rgb1.getR()-rgb2.getR())^2
+ (rgb1.getG()-rgb2.getG())^2
+ (rgb1.getB()-rgb2.getB())^2
);
答案 0 :(得分:7)
查看您发布的代码,看起来您的RGB值是整数。但是,^
运算符不是幂运算符,而是XOR (exclusive-OR) - 按位运算。因此,为了正确计算平方,请使用常规乘法 - 例如,使用临时变量int deltaR = rgb1.getR()-rgb2.getR();
,然后在公式中写deltaR*deltaR
而不是^
运算符。您的RGB值可能在0到255范围内,因此不应存在溢出问题。或者,您可以在公式中使用Math.pow(rgb1.getR()-rgb2.getR(),2)
等。
答案 1 :(得分:2)
要在Java中对数字进行平方,请使用Math.pow(x, 2)
甚至更简单的x * x
。表达式x ^ 2
不与x
平方,而是XORs x
与2
。
在您的代码中:
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);
...虽然我不太确定你的算法,但这是一个不同的问题。
答案 2 :(得分:0)
正如人们所说,你可以使用Math.pow(x, 2)
进行平方。仅仅从个人经验来看,如果你打算多次调用这个函数,最好自己写出乘法,即Math.sqrt((deltaX * deltaX) + (deltaY * deltaY) + (deltaZ * deltaZ));
它可能看起来更加丑陋但是如果你分析两种形式的代码你会看到对Math.pow
的调用比简单乘法要慢得多。显然,Math.sqrt
电话无关。