我有一个函数需要几秒钟的时间。这个函数应该返回给定图像中前n个色彩值。返回结果必须经过排序,以便我可以使用第一、第二、第三个最常出现的颜色的rgb值进行工作。
首先,我有一个PIL.Image对象,它循环遍历x、y坐标并在defaultdict中进行计数。我已经用Numpy数组替换了我的项目中的PIL对象,这给了我很大的提升,但我不知道如何在这种情况下替换defaultdict。
我的当前解决方案:
import numpy as np
from scipy import misc # for example Image
from collections import defaultdict
def count_colors(img, n):
img = img.reshape(-1, img.shape[-1])
color = defaultdict(int)
for pixel in img:
rgb = (pixel[0], pixel[1], pixel[2])
color[rgb] += 1
sorted_color = sorted(color.items(), key=lambda k_v: k_v[1], reverse=True)
sorted_color = sorted_color[:n]
return sorted_color
img = misc.face() # example Numpy Image array
top_colors = count_colors(img, n=5)
display(top_colors)
当前输出:
[((9, 9, 9), 1062),
((10, 10, 10), 700),
((8, 8, 8), 668),
((9, 7, 8), 586),
((9, 7, 10), 579)]
有没有Numpy的方法可以解决这个问题?