我正在使用Python中的程序来创建十字绣方案,并且需要将图像中的颜色减少为特定的牙线颜色like this。没有必要使用牙线调色板中的所有颜色。 在Python或Pseudocode上。
自定义调色板(例如在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?另一种算法/方法/优化?
答案 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]