我已经实现了几个函数来将 sRGB 转换为CIE-L*a*b*颜色空间。
现在,我想用它来抖动,但我不确定如何准确辨别哪种颜色是“较低”颜色,哪种颜色是“较高”颜色。
当在一维色彩空间(灰度)中抖动时,事情很容易。当使用误差扩散抖动时,我会从我的调色板中计算最接近的灰度值,并将误差添加到周围的像素中,具体取决于我使用的抖动矩阵类型(例如 Floyd-Steinberg)。因为这是一维的,所以很简单,只有这一个值。但是现在我有了这个三维色彩空间,我应该将误差单独添加到每个坐标吗?
(在这一点上,这是唯一对我有意义的方法。)
当使用有序抖动矩阵进行抖动时,事情会变得更加复杂。有序抖动矩阵定义了一个阈值。为此,关于我即将抖动的当前像素,我需要知道托盘的“较低”像素值和“较高”像素值。现在,我计算到两个像素的距离,抖动矩阵的阈值决定在相邻像素之间的哪个值之后,像素要么抖动到较低的像素,要么抖动到较高的像素。
(通过使用为我的托盘中的灰度颜色值数量合理选择的矩阵,实际实现当然比计算它更优化。此外,诸如选择具有均匀间隔颜色值的托盘之类的事情等)
这 - 再次 - 在一维色彩空间中非常容易。但在 CIE-L*a*b* 中,没有“更高”或“更低”的值。
仅使用亮度来应用阈值矩阵,似乎很不正确,我的托盘中可能有两种亮度相同的颜色,然后呢?