我已经通过图像直方图比较来做到这一点。我的基本算法是这样的:
- 将图像拆分为红色、绿色和蓝色
- 为红色、绿色和蓝色通道创建标准化直方图,并将它们连接成一个向量
(r0...rn, g0...gn, b0...bn)
,其中 n 是“桶”的数量,256 应该足够了
- 从另一个图像的直方图中减去这个直方图并计算距离
这是一些带有numpy
和的代码pil
r = numpy.asarray(im.convert( "RGB", (1,0,0,0, 1,0,0,0, 1,0,0,0) ))
g = numpy.asarray(im.convert( "RGB", (0,1,0,0, 0,1,0,0, 0,1,0,0) ))
b = numpy.asarray(im.convert( "RGB", (0,0,1,0, 0,0,1,0, 0,0,1,0) ))
hr, h_bins = numpy.histogram(r, bins=256, new=True, normed=True)
hg, h_bins = numpy.histogram(g, bins=256, new=True, normed=True)
hb, h_bins = numpy.histogram(b, bins=256, new=True, normed=True)
hist = numpy.array([hr, hg, hb]).ravel()
如果你有两个直方图,你可以得到这样的距离:
diff = hist1 - hist2
distance = numpy.sqrt(numpy.dot(diff, diff))
如果两幅图像相同,则距离为0,它们越发散,距离越大。
对我来说,它在照片上效果很好,但在文本和徽标等图形上却失败了。