如何在 CIE-L*a*b* 颜色空间中辨别哪种颜色是 "lower" and/or "higher" 以进行有序抖动?
How to discern which color is "lower" and/or "higher" in CIE-L*a*b* colorspace for ordered dithering?
我已经实现了几个函数来将 sRGB 转换为 CIE-L*a*b* 颜色 space。
现在,我想用它来抖动,但我不确定如何准确辨别哪种颜色是 "lower" 颜色,哪种颜色是 "higher" 颜色。
在一维颜色 space(灰度)中抖动时,事情很容易。当使用误差扩散抖动时,我从我的调色板中计算出最接近的灰度值,并将误差添加到周围的像素,这取决于我使用的抖动矩阵类型(例如 Floyd-Steinberg)。因为这是一维的,所以很简单,只有一个值。但是现在我有了这个三维颜色space,我应该把误差单独添加到每个坐标吗?
(目前,这是对我来说唯一有意义的方法。)
使用 ordered dither 矩阵进行抖动时,事情会变得 更 复杂。有序抖动矩阵定义了一个阈值。为此,我需要知道我的托盘的 "lower" 像素值和 "higher" 像素值,关于我即将抖动的当前像素。现在,我计算到两个像素的距离,抖动矩阵的阈值决定相邻像素之间的哪个值,像素要么抖动到较低的像素,要么抖动到较高的像素。
(实际实现当然比计算更优化,通过使用一个矩阵,该矩阵是为我的调色板中的灰度颜色值数量明智地选择的。此外,选择具有均匀 [=40 的调色板之类的东西=]d色值等)
这又一次在一维颜色 space 中非常简单。但在 CIE-L*a*b* 中,没有 "higher" 或 "lower" 这样的值。
仅使用亮度来应用阈值矩阵,似乎很不正确,我的调色板中可能有两种亮度相同的颜色,然后呢?
这篇论文描述的问题非常接近你的问题,然后继续提供解决它的算法:
http://ira.lib.polyu.edu.hk/bitstream/10397/1494/1/A%20multiscale%20color%20error_05.pdf
希望这对您有所帮助。
当您在多个维度上进行抖动时,您可能希望量化这些值并独立地在每个维度中扩散误差。
以3通道RGB图像为例:将分量分成三张灰度图像,独立抖动,然后组合回彩色图像。一个通道中的错误忽略了其他通道中的错误...不要被 ΔE 或任何东西所困扰。
相同的概念适用于 CIE-Lab 中的抖动,即使对于有序抖动也是如此。抖动将独立应用于每个通道。不用担心像素之间的欧式距离,只需考虑单个通道上的增量即可。
"Higher"和"lower"在一维环境下很容易消化。即使对于 CIElab 的各个频道。
你是对的,你不想只在亮度通道上应用阈值矩阵!我相信您会想要三个阈值矩阵,每个通道一个,这是根据您配置调色板的方式确定的。 (这些矩阵可能相同,也可能不同,具体取决于您如何在通道中分配调色板值)
在三个通道中,您可以将调色板可视化为立方体 (xyz)。因此,当亮度通道被量化为某个值时,这可能会确定 X 坐标,但在 Y 和 Z 方向上仍然有一个完整的值范围。这些坐标由其他通道的量化方式决定。以通道可以独立变化的方式生成调色板。您甚至不需要在每个维度中具有相同数量的量化级别。您可以选择只有 3 个可能的亮度值,并使用调色板的其余部分更精确地改变 A/B 通道。 (这就是您的三个阈值矩阵可能不同的原因。)
我已经实现了几个函数来将 sRGB 转换为 CIE-L*a*b* 颜色 space。
现在,我想用它来抖动,但我不确定如何准确辨别哪种颜色是 "lower" 颜色,哪种颜色是 "higher" 颜色。
在一维颜色 space(灰度)中抖动时,事情很容易。当使用误差扩散抖动时,我从我的调色板中计算出最接近的灰度值,并将误差添加到周围的像素,这取决于我使用的抖动矩阵类型(例如 Floyd-Steinberg)。因为这是一维的,所以很简单,只有一个值。但是现在我有了这个三维颜色space,我应该把误差单独添加到每个坐标吗?
(目前,这是对我来说唯一有意义的方法。)
使用 ordered dither 矩阵进行抖动时,事情会变得 更 复杂。有序抖动矩阵定义了一个阈值。为此,我需要知道我的托盘的 "lower" 像素值和 "higher" 像素值,关于我即将抖动的当前像素。现在,我计算到两个像素的距离,抖动矩阵的阈值决定相邻像素之间的哪个值,像素要么抖动到较低的像素,要么抖动到较高的像素。
(实际实现当然比计算更优化,通过使用一个矩阵,该矩阵是为我的调色板中的灰度颜色值数量明智地选择的。此外,选择具有均匀 [=40 的调色板之类的东西=]d色值等)
这又一次在一维颜色 space 中非常简单。但在 CIE-L*a*b* 中,没有 "higher" 或 "lower" 这样的值。
仅使用亮度来应用阈值矩阵,似乎很不正确,我的调色板中可能有两种亮度相同的颜色,然后呢?
这篇论文描述的问题非常接近你的问题,然后继续提供解决它的算法:
http://ira.lib.polyu.edu.hk/bitstream/10397/1494/1/A%20multiscale%20color%20error_05.pdf
希望这对您有所帮助。
当您在多个维度上进行抖动时,您可能希望量化这些值并独立地在每个维度中扩散误差。
以3通道RGB图像为例:将分量分成三张灰度图像,独立抖动,然后组合回彩色图像。一个通道中的错误忽略了其他通道中的错误...不要被 ΔE 或任何东西所困扰。
相同的概念适用于 CIE-Lab 中的抖动,即使对于有序抖动也是如此。抖动将独立应用于每个通道。不用担心像素之间的欧式距离,只需考虑单个通道上的增量即可。
"Higher"和"lower"在一维环境下很容易消化。即使对于 CIElab 的各个频道。
你是对的,你不想只在亮度通道上应用阈值矩阵!我相信您会想要三个阈值矩阵,每个通道一个,这是根据您配置调色板的方式确定的。 (这些矩阵可能相同,也可能不同,具体取决于您如何在通道中分配调色板值)
在三个通道中,您可以将调色板可视化为立方体 (xyz)。因此,当亮度通道被量化为某个值时,这可能会确定 X 坐标,但在 Y 和 Z 方向上仍然有一个完整的值范围。这些坐标由其他通道的量化方式决定。以通道可以独立变化的方式生成调色板。您甚至不需要在每个维度中具有相同数量的量化级别。您可以选择只有 3 个可能的亮度值,并使用调色板的其余部分更精确地改变 A/B 通道。 (这就是您的三个阈值矩阵可能不同的原因。)