<p>以下是我根据问题陈述,托马斯·荣布卢特的答案和答案<a href="https://stackoverflow.com/questions/54242194/python-find-the-closest-color-to-a-color-from-giving-list-of-colors">here</a>得出的结论</p>
<p>该算法执行单像素查找并生成仅限于颜色列表中颜色的图像</p>
<pre><code>from PIL import Image
from datetime import datetime
from math import sqrt
COLOR_LIST = {(52, 26, 75), (9, 165, 216), (245, 34, 208), (146, 185, 85), (251, 6, 217), (223, 144, 239),
(190, 224, 121), (252, 26, 157), (150, 130, 142), (51, 129, 172), (97, 85, 204), (1, 108, 233),
(138, 201, 180), (210, 63, 175), (26, 138, 43), (216, 141, 61), (38, 89, 118), (0, 0, 0)}
COLOR_CACHE = {}
def closest_color(rgb, color_list):
if rgb not in COLOR_CACHE:
r, g, b = rgb
color_diffs = []
for color in color_list:
cr, cg, cb = color
color_diff = sqrt(abs(r - cr)**2 + abs(g - cg)**2 + abs(b - cb)**2)
color_diffs.append((color_diff, color))
COLOR_CACHE[rgb] = min(color_diffs)[1]
return COLOR_CACHE[rgb]
def clean_img_pixels(atlas_img, color_list):
atlas_img_cleaned = atlas_img.copy()
pixels = atlas_img_cleaned.load()
for ii in range(atlas_img.size[0] - 1):
for jj in range(atlas_img.size[1] - 1):
pixel = atlas_img.getpixel((ii, jj))
if pixel not in color_list:
pixels[ii, jj] = closest_color(pixel, color_list)
return atlas_img_cleaned
im = Image.open('7y1JG.png')
im = im.convert('RGB')
start_time = datetime.now()
om = clean_img_pixels(im, COLOR_LIST)
print('Time elapsed (hh:mm:ss.ms) {}'.format(datetime.now() - start_time))
om.save('7y1JG-clean.png', "PNG")
# Time elapsed (hh:mm:ss.ms) 0:00:02.932316
</code></pre>