获取此颜色距离函数的范围

时间:2014-09-07 20:53:36

标签: java colors

我想知道此函数可以返回的值范围:

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 有些颜色的距离甚至比黑白还要大。

有谁知道如何获得真正的最大值?

由于

1 个答案:

答案 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一次 所以黑色和白色的价值最高