我想知道此函数可以返回的值范围:
public static double colorDistance(Color color1, Color color2) {
double rmean = ( color1.getRed() + color2.getRed() )/2;
int r = color1.getRed() - color2.getRed();
int g = color1.getGreen() - color2.getGreen();
int b = color1.getBlue() - color2.getBlue();
double weightR = 2 + rmean/256;
double weightG = 4.0;
double weightB = 2 + (255-rmean)/256;
return Math.sqrt(weightR*r*r + weightG*g*g + weightB*b*b);
}
我知道最小的是0,但我不确定最大的。
我制作了这个java代码来帮助测试:
private static List<Color> allColors = new ArrayList<Color>();
public static void main(String[] args) {
for(int i=0; i<=255; i++) {
for(int j=0; j<=255; j++) {
for(int k=0; k<=255; k++) {
allColors.add(new Color(i,j,k));
}
}
}
double max = 0;
for(int i=0; i<allColors.size(); i++) {
Color c1 = allColors.get(i);
for(int j=0; j<allColors.size(); j++) {
Color c2 = allColors.get(j);
System.out.print(i);
System.out.print(" - ");
System.out.println(j);
max = Math.max(max, colorDistance(c1, c2));
}
}
System.out.print(max);
}
但它花了太长时间。我尝试了黑色和白色,得到765但是根据这个页面上的图表 http://en.wikipedia.org/wiki/Color_difference 有些颜色的距离甚至比黑白还要大。
有谁知道如何获得真正的最大值?
由于
答案 0 :(得分:0)
好的,我的错:
对于color1 = white和color2 = black
double rmean = ( color1.getRed() + color2.getRed() )/2; // (255 + 0) /2=255 / 2=(int)127
int r = color1.getRed() - color2.getRed(); // (255 - 0)=255
int g = color1.getGreen() - color2.getGreen(); //(255 - 0)=255
int b = color1.getBlue() - color2.getBlue(); //(255 - 0)=255
double weightR = 2 + rmean/256; = 2 + 127/256 = cca 2.49609375
double weightG = 4.0; // = 4
double weightB = 2 + (255-rmean)/256; // 2 + (255 - 127) / 256 = 2.5
return Math.sqrt(weightR*r*r + weightG*g*g + weightB*b*b);
// sqrt(2.79609375 * 255 * 255 + 4 * 255 * 255 + 2.5 * 255 * 255) =
// sqrt(8.99609375*255*255) = sqrt(584970.99609375) = cca 764.834
所以这是最高价值
增加rmean不会增加结果,因为有+ rmean
和- rmean
一次
所以黑色和白色的价值最高