要更改图像中的特定颜色,通常将RGB乘以转换矩阵。诸如gimp和photoshop之类的图像处理程序具有选择性的颜色更改功能,该功能使用户可以将某个“距离”内的像素转换为某些颜色空间中的原始颜色,从而转换为新颜色。例如,将#00f蓝色更改为淡黄色#ffd

我正在尝试在<canvas>中实现这样的功能。这些算法通常使用什么颜色空间和距离定义,然后如何计算变换矩阵?

评论

OK,进行编辑。

现在可以理解了吗?

是的,方法更清晰。

#1 楼

通常使用Lab色彩空间,因为它接近人类对色彩的感知方式。关于要应用的距离:这篇维基百科文章提到Delta E距离为1.0,只是有明显的区别。有许多不同的公式导致不同的阈值。

#2 楼

我发现色相/饱和度或亮度/色度空间很容易使用。它们遵循我们对颜色工作原理的直观感觉,即使它们不像Lab那样科学准确。从RGB到YCbCr的转换是一个简单的矩阵乘法。使用YCbCr,您可以做一些事情,例如在更改色相和/或饱和度时保持亮度恒定。您可以将饱和度视为颜色与亮度轴的距离(因此CbCr的大小= sqrt(Cb x Cb + Cr x Cr))。色相是当投影到CbCr平面上时色点与x轴所成的角度。 (因此,您可以使用atan2(Cr,Cb)。)修改值后,将其转换回RGB是另一个矩阵乘法。