<p>如果您完全抛弃<code>numpy</code>,直接使用枕头数组操作,并使用元组集而不是列表,则速度要快得多(对于我来说,这在示例图片上5秒钟内执行):</p>
<pre><code>from PIL import Image
from datetime import datetime
im = Image.open('7y1JG.png')
im = im.convert('RGB')
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)}
def clean_img_pixels(atlas_img, color_list):
atlas_img_cleaned = atlas_img.copy().load()
dd = 3
for ii in range(atlas_img.size[0] - 1):
for jj in range(atlas_img.size[1] - 1):
if atlas_img.getpixel((ii, jj)) not in color_list:
pixel2_color = atlas_img.getpixel((ii - dd, jj))
if (pixel2_color == (0, 0, 0)) | (pixel2_color not in color_list):
pixel2_color = atlas_img.getpixel((ii + dd, jj))
if (pixel2_color == (0, 0, 0)) | (pixel2_color not in color_list):
pixel2_color = atlas_img.getpixel((ii + 5, jj))
atlas_img_cleaned[ii, jj] = pixel2_color
return atlas_img_cleaned
start_time = datetime.now()
out_image = clean_img_pixels(im, color_list)
time_elapsed = datetime.now() - start_time
print('Time elapsed (hh:mm:ss.ms) {}'.format(time_elapsed))
</code></pre>
<p>我仍然建议你做一些额外的边界检查,因为你的图像是这样布置的</p>