我已经实现了几个函数来将sRGB转换为CIE-L*a*b*颜色空间。
现在,我想将它用于抖动,但我不确定如何准确辨别哪种颜色是“较低”颜色,哪一种颜色是“较高”。
当在一维色彩空间(灰度)中抖动时,事情很容易。当使用误差扩散抖动时,我从我的调色板计算最接近的灰度值,并将误差添加到周围的像素,这取决于我使用的抖动矩阵类型(例如Floyd-Steinberg)。由于这是一维的,所以很简单,只有这一个值。但是现在我有这个三维颜色空间,我应该单独将错误添加到每个坐标吗? (这是对我来说唯一合理的方式。)
当使用ordered dither矩阵进行抖动时,事情会变得更复杂更多。有序抖动矩阵定义阈值。为此,我需要知道我的托盘的“较低”像素值和“较高”像素值,就我当前要抖动的像素而言。现在,我计算到两个像素的距离,来自抖动矩阵的阈值决定在相邻像素之间的值之后,像素要么抖动到较低像素,要么抖动到较高像素。
(实际的实施当然比计算它更合理,通过使用合理选择的托盘中的灰度颜色值的矩阵。此外,选择具有均匀间隔颜色值的托盘等等。)
这是 - 再次 - 在一维色彩空间中非常容易。但在CIE-L * a * b *中,没有“更高”或“更低”的值。
仅使用亮度来应用阈值矩阵,看起来非常不正确,我的托盘中可能有两种颜色相同的亮度,那么呢?
答案 0 :(得分:3)
本文描述了与您的问题非常接近的问题,然后继续提供解决它的算法:
http://ira.lib.polyu.edu.hk/bitstream/10397/1494/1/A%20multiscale%20color%20error_05.pdf
希望这有帮助。
答案 1 :(得分:1)
当你在多个维度上抖动时,你会想要量化这些值并在每个维度中独立地扩散错误。
以3通道RGB图像为例:将组件分成三个灰度图像,独立抖动,然后将它们组合成彩色图像。一个通道中的错误不知道其他通道中的错误...不要陷入ΔE或其他任何事情。
同样的概念适用于CIE-Lab中的抖动,即使对于有序的抖动也是如此。抖动将在每个通道上独立应用。不要担心像素之间的欧氏距离,只考虑单个通道上的delta。
“更高”和“更低”在一维环境中很容易被消化。即使是CIElab的各个渠道。
你是不对的,你不想只在亮度通道上应用阈值矩阵!我相信您需要三个阈值矩阵,每个通道一个,根据您配置调色板的方式确定。 (这些矩阵可能相同,可能不同,具体取决于您如何在通道中分配调色板值)
在三个通道中,您可以将调色板可视化为立方体(xyz)。因此,当亮度通道被量化为某个值时,可能会确定X坐标,但您仍然在Y和Z方向上具有整个值范围。这些坐标由其他通道的量化方式决定。以这样的方式生成调色板,使得通道可以独立变化。您甚至不需要在每个维度中具有相同数量的量化级别。您可以选择仅有3个可能的亮度值,并使用调色板的其余部分来更精确地改变A / B通道。 (这就是你的三个阈值矩阵可能不同的原因。)