使用CIELab颜色空间进行抖动的减色算法

时间:2016-01-08 15:55:44

标签: algorithm image-processing colors

我编写了一个程序,用于将图像转换为使用30种特定颜色的有限调色板的自定义文件格式。

在我的应用程序中,我可以选择使用RGB或YUV颜色空间以及选项:Sierra,Jarvis或Floyd-Steinberg抖动。

但是我注意到,使用颜色表来限制调色板,使用photoshop保存到网页功能比我的程序好得多。

所以我想改进我的应用程序以获得更好的结果。

现在,以Floyd-Steinberg为例,我基本上使用这个伪代码

for each y from top to bottom
for each x from left to right
    oldpixel  := pixel[x][y]
    newpixel  := find_closest_palette_color(oldpixel)
    pixel[x][y]  := newpixel
    quant_error  := oldpixel - newpixel
    pixel[x+1][y  ] := pixel[x+1][y  ] + quant_error * 7/16
    pixel[x-1][y+1] := pixel[x-1][y+1] + quant_error * 3/16
    pixel[x  ][y+1] := pixel[x  ][y+1] + quant_error * 5/16
    pixel[x+1][y+1] := pixel[x+1][y+1] + quant_error * 1/16

我的像素以RGB格式存储,并找到最接近的调色板颜色,我使用RGB / YUV中的欧几里德距离。

我一直在阅读CIE94和CIEDE2000色差算法,这些算法对我的“find_closest_palette_color”函数应该更好。

要进行这些计算,我必须将RGB转换为CIELab色彩空间。我可以通过以下方式在我的抖动算法中分配错误时使用CIELab:

  1. 将整个图像转换为CIELab色彩空间
  2. 对于每个像素,使用CIE94或CIEDE2000
  3. 在我的调色板中找到最接近的颜色
  4. 计算CIELab颜色空间中的错误(L *,a *,b *而不是RGB)。
  5. 根据我正在使用的任何抖动算法以及在RGB中使用的相同权重来分配错误。

1 个答案:

答案 0 :(得分:0)

是的,实际上Lab更适合这个目的,因为Lab中颜色之间的欧几里德距离反映了颜色之间的人类感知距离,而RGB中的距离则没有。