2

我正在玩Python中的程序來創建十字繡方案,並且需要將圖像中的顏色減少爲特定的牙線顏色like this。不必使用牙線調色板中的所有顏色。 在Python或僞代碼上。如何將圖像調色板減少爲特定顏色?

Example

定製調色板(在丸/枕頭例如)不situable。最多有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圖像上的比較。很多。)

Dictonary for already calculated delta_e?另一種算法/ aproach /優化?

+2

memoize的 - 你不需要重新測試,你已經做了 – stark

回答

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] 
+0

看起來漂亮的顏色。然後我可以執行'PIL.Image.putdata(result)'?是否有意義1)'available_pixel_color = PIL.Image.getcolors',2)將'available_pixel_color'傳遞給''nearest'來製作字典,3)將這個字典應用到'pixel_color'並得到最終的列表? – Pylyp

+0

您可以執行'result = PIL.Image.eval(image,nearest)'將縮小應用於所有像素。 –

相關問題