假设有一张相册中有1万个JPEG、PNG格式的图片,如何查找所有颜色调色板与所选图片相似的图片,并按相似度降序排列?
为每个图像构建一个颜色直方图。当您想将图像与集合匹配时,只需按其直方图与所选图像直方图的接近程度对列表进行排序。
桶数取决于您想要多精确。用于创建桶的数据类型将定义如何优先考虑搜索。
例如,如果你最关心色调,则可以定义图像的每个单独像素属于哪个桶:
def bucket_from_pixel(r, g, b):
hue = hue_from_rgb(r, g, b) # [0, 360)
return (hue * NUM_BUCKETS) / 360
如果您还需要一个通用的匹配器,那么您可以基于完整的RGB值选择桶。
使用PIL,您可以使用内置的histogram
函数。 "相似度"直方图可以使用任何想要的距离度量来计算。例如,L1距离可以如下计算:
hist_sel = normalize(sel.histogram())
hist = normalize(o.histogram()) # These normalized histograms should be stored
dist = sum([abs(x) for x in (hist_sel - hist)])
一个 L2 将是:
dist = sqrt(sum([x*x for x in (hist_sel - hist)]))
Normalize
操作的目的是将直方图的总和强制设置为某个常数值(1.0效果很好)。这非常重要,因为这样可以正确比较大图像和小图像。如果您打算使用L1距离,则应在normalize
中使用L1度量。如果使用L2,则使用L2。