将Color对象"舍入"到最接近的颜色常量的最佳方法是什么?

Sto*_*ker 12 java pixel colors

我将检索像素的确切颜色,并希望将该确切颜色与常数相关联Color.blue.有没有一种简单的方法可以"舍入"到最近的颜色常数?另外,有没有办法定义自己的颜色常量?

Ted*_*opp 19

基本方法是通过简单地将样品与每个样品进行比较,找到最接近样品的标准颜色.当然,问题在于定义"最接近的".最明显的是使用RGB空间中的欧几里德距离.问题是这个距离与我们对"最接近的颜色"的感知感很不一致.在本文中可以找到对此问题的讨论,以及一个很好的(易于计算的)度量(包括伪代码!).

编辑:以防万一该文章的链接死了(或者如果你很懒,并且愿意使用代码而不理解它的作用),这里是我的Java版本的"色距函数",该文件暗示为"低" - 成本近似"到他们推荐的距离函数(RGB空间中的加权欧氏距离):

double colorDistance(Color c1, Color c2)
{
    int red1 = c1.getRed();
    int red2 = c2.getRed();
    int rmean = (red1 + red2) >> 1;
    int r = red1 - red2;
    int g = c1.getGreen() - c2.getGreen();
    int b = c1.getBlue() - c2.getBlue();
    return Math.sqrt((((512+rmean)*r*r)>>8) + 4*g*g + (((767-rmean)*b*b)>>8));
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果您只是要对颜色距离进行排名,则可以省去调用Math.sqrt(),从而节省一些计算成本.