量化两种颜色之间相似性的方法?

时间:2015-08-07 13:35:38

标签: c++ colors

这个问题可能更多地与人类心理学有关

我正在尝试制作一个程序,使用有限的调色板重新创建一个位图图像。我天真地认为我可以简单地找到红色/绿色/蓝色值的平方差异,并使用它来量化颜色之间的平方差异。然而在实践中,这似乎并不能很好地工作,红色阴影与紫色阴影相匹配等等。

有没有人对我可以使用的替代比较方法有任何建议?

int squaredDistance(colour a, colour b)
{
    return (a.r - b.r)*(a.r - b.r) + (a.g - b.g)*(a.g - b.g) + (a.b - b.b)*(a.r - b.b);
}

int findClosestColour(colour a) //Returns id of colour that most closely matches
{
    int smallestColourDistance = 195075;
    int colourId = -1;
    for(int i=0; i<NUMOFCOLOURS; i++)
    {
        if( squaredDistance(a, coloursById[i]) < smallestColourDistance)
        {
            smallestColourDistance = squaredDistance(a, coloursById[i]);
            colourId = i;
            if(smallestColourDistance == 0)
                break;
        }
    }
    return colourId;
}

2 个答案:

答案 0 :(得分:1)

这在颜色科学中称为colour difference,有多种算法可供计算,以下是其中一些:

  • Delta E CIE 1976
  • Delta E CIE 1994
  • Delta E CIE 2000
  • Delta E CMC

Bruce Lindbloom有calculatorColour提供了矢量化Python implementation。在能够使用任何 Delta E 实现之前,您必须将 RGB 值转换为 CIE Lab

colour difference 颜色外观模型之上还可以实现CIECAM02次计算,特别是 CAM02-UCS 颜色空间更多统一版本的 CIECAM02 基础色彩空间。

答案 1 :(得分:0)

这是一个老问题,但如果有人碰到它......

我有一个类似的问题,我想计算两个随机选择的颜色(前景和背景)之间的差异,以确保前景是可读的。所以我做了我的研究并编写了这个使用CIE76计算delta-E的小C ++库:

https://github.com/ThunderStruct/Color-Utilities

样品:

46.8072

这会输出public boolean updateSchool(String username, String password, String school) throws Exception { User user = userDao.findByUsername(userName); boolean status = false; try { if (user != null && user.getPassword().equals(password)) { user.setSchool(school); userDao.save(user); status = true; } } catch (Exception e) { e.printStackTrace(); } return status; } ,可以使用this计算器验证