2016-01-08 72 views
0

我已经编写了一个用于将图像转换为使用30种特定颜色的有限调色板的自定义文件格式的程序。使用CIELab颜色空间用于降低抖动颜色的算法

在我的应用程序中,我给出了在RGB或YUV色彩空间以及Sierra,Jarvis或Floyd-Steinberg抖动的选项。

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

所以我想改进我的应用程序,以提供更好的结果。

眼下,随着弗洛伊德 - 斯坦伯格的例子中,我基本上是利用伪代码

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色彩空间。

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

回答

0

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