如何将图像调色板减少到特定的颜色?

时间:2013-10-15 19:00:41

标签: python algorithm image-processing python-imaging-library color-palette

我正在使用Python中的程序来创建十字绣方案,并且需要将图像中的颜色减少为特定的牙线颜色like this。没有必要使用牙线调色板中的所有颜色。 在Python或Pseudocode上。

Example

自定义调色板(例如在PILL / Pillow中)不可调整。最多有256种颜色,但是牙线调色板有大约450种颜色,我计划使用来自不同制造商的多种颜色图表。

抖动也不适合十字绣。

我认为这可能是这样的:

result = []
for pixel_color in image:
    nearest = None
    for floss_color in floss_palette:
        distance = delta_e_cie2000(pixel_color, floss_color)
        if distance < nearest:
            nearest = floss_color
    result.append(nearest)

可能有更快的算法? (image_width * image_heigh *调色板中的颜色= 112M delta_e计算和平均500x500px图像的比较。这很多。)

已计算delta_e的Dictonary?另一种算法/方法/优化?

1 个答案:

答案 0 :(得分:3)

这是memoize的一个例子。我还使用了内置min

def nearest(pixel_color, mem={}):
    if pixel_color in mem:
        return mem[pixel_color]
    n = min(floss_palette, key=lambda fc:delta_e_cie2000(pixel_color, fc))
    mem[pixel_color] = n
    return mem[pixel_color]

result = [nearest(pixel_color) for pixel_color in image]