我曾使用图像直方图比较完成了这个任务。我的基本算法如下:
- 将图像拆分成红、绿和蓝三个通道
- 为每个通道创建标准化的直方图,并将它们连接成向量
(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,它们越不同,距离就越大。
对于我的照片效果还不错,但对于文本和标志等图形失败了。