一年前,一个
similar question被问到,并有许多反应,包括一个关于像素化的图像,我将建议作为至少一个资格预审步骤(因为它会很快排除非常不相似的图像)。
也有链接到更早的问题,有更多的参考和良好的答案。
这里是一个实现使用Scipy的一些想法,使用上面的三个图像(分别保存为im1.jpg,im2.jpg,im3.jpg)。最后的输出显示im1与自身比较,作为基线,然后每个图像与其他图像进行比较。
>>> import scipy as sp
>>> from scipy.misc import imread
>>> from scipy.signal.signaltools import correlate2d as c2d
>>>
>>> def get(i):
... # get JPG image as Scipy array, RGB (3 layer)
... data = imread('im%s.jpg' % i)
... # convert to grey-scale using W3C luminance calc
... data = sp.inner(data, [299, 587, 114]) / 1000.0
... # normalize per http://en.wikipedia.org/wiki/Cross-correlation
... return (data - data.mean()) / data.std()
...
>>> im1 = get(1)
>>> im2 = get(2)
>>> im3 = get(3)
>>> im1.shape
(105, 401)
>>> im2.shape
(109, 373)
>>> im3.shape
(121, 457)
>>> c11 = c2d(im1, im1, mode='same') # baseline
>>> c12 = c2d(im1, im2, mode='same')
>>> c13 = c2d(im1, im3, mode='same')
>>> c23 = c2d(im2, im3, mode='same')
>>> c11.max(), c12.max(), c13.max(), c23.max()
(42105.00000000259, 39898.103896795357, 16482.883608327804, 15873.465425120798)
所以注意im1与本身相比得分为42105,im2与im1相比并不遥远,但是im3与其他任何一个相比都得到了不到一半的价值。你必须尝试其他图像,看看这可能会执行,以及如何可能改善它。
运行时间长…在我的机器上几分钟。我会尝试一些预过滤,以避免浪费时间比较非常不相似的图像,也许与“比较jpg文件大小”手法提到在回应其他问题,或与像素化。事实上,你有不同大小的图像使事情复杂化,但你没有给出足够的信息,关于屠宰的程度可能期望,所以很难给出一个具体的答案,考虑到这一点。