6

我已经实现了几个函数来将 sRGB 转换为CIE-L*a*b*颜色空间。

现在,我想用它来抖动,但我不确定如何准确辨别哪种颜色是“较低”颜色,哪种颜色是“较高”颜色。

当在一维色彩空间(灰度)中抖动时,事情很容易。当使用误差扩散抖动时,我会从我的调色板中计算最接近的灰度值,并将误差添加到周围的像素中,具体取决于我使用的抖动矩阵类型(例如 Floyd-Steinberg)。因为这是一维的,所以很简单,只有这一个值。但是现在我有了这个三维色彩空间,我应该将误差单独添加到每个坐标吗?
(在这一点上,这是唯一对我有意义的方法。)

当使用有序抖动矩阵进行抖动时,事情会变得更加复杂。有序抖动矩阵定义了一个阈值。为此,关于我即将抖动的当前像素,我需要知道托盘的“较低”像素值和“较高”像素值。现在,我计算到两个像素的距离,抖动矩阵的阈值决定在相邻像素之间的哪个值之后,像素要么抖动到较低的像素,要么抖动到较高的像素。
(通过使用为我的托盘中的灰度颜色值数量合理选择的矩阵,实际实现当然比计算它更优化。此外,诸如选择具有均匀间隔颜色值的托盘之类的事情等)
这 - 再次 - 在一维色彩空间中非常容易。但在 CIE-L*a*b* 中,没有“更高”或“更低”的值。

仅使用亮度来应用阈值矩阵,似乎很不正确,我的托盘中可能有两种亮度相同的颜色,然后呢?

4

2 回答 2

3

本文描述了与您的问题非常接近的问题,然后继续提供解决该问题的算法:

http://ira.lib.polyu.edu.hk/bitstream/10397/1494/1/A%20multiscale%20color%20error_05.pdf

希望这会有所帮助。

于 2015-06-21T05:03:17.037 回答
1

当您在多个维度上进行抖动时,您可能希望量化这些值并独立地分散每个维度中的误差。

以 3 通道 RGB 图像为例:将组件分成三个灰度图像,独立抖动,然后将它们组合回彩色图像。一个通道中的错误不知道其他通道中的错误......不要被ΔE或任何东西赶上。

相同的概念适用于 CIE-Lab 中的抖动,即使对于有序抖动也是如此。抖动将独立应用于每个通道。不要担心像素之间的欧几里德距离,只需考虑单个通道上的增量即可。

“高”和“低”在单维环境中很容易被消化。即使对于 CIElab 的各个渠道。

您是正确的,您不想仅在亮度通道上应用阈值矩阵!我相信您需要三个阈值矩阵,每个通道一个,这取决于您配置调色板的方式。(这些矩阵可能相同,也可能不同,具体取决于您在通道之间分配调色板值的方式)

在三个通道中,您可以将调色板可视化为立方体 (xyz)。因此,当亮度通道被量化到某个值时,这可能会确定 X 坐标,但在 Y 和 Z 方向上仍然有整个范围的值。这些坐标由其他通道的量化方式决定。以通道可以独立变化的方式生成调色板。您甚至不需要在每个维度中具有相同数量的量化级别。您可以选择只有 3 个可能的亮度值,并使用调色板的其余部分更精确地改变 A/B 通道。(这就是为什么您的三个阈值矩阵可能不同的原因。)

于 2015-06-21T13:19:39.410 回答