这是一个非常庞大的话题,从3行代码到整个研究杂志的答案。
我将概述最常见的此类技术及其结果。
最简单的一个最快的方法。建议几十年前作为寻找图像相似性的手段。这个想法是,森林将拥有大量的绿色,人脸会有很多粉红色,或者其他什么。因此,如果你将两张图片与森林进行比较,你会在直方图之间得到一些相似之处,因为两者都有很多绿色。
缺点:太简单了。香蕉和海滩看起来都一样,都是黄色的。 OpenCV方法:compareHist()
缺点:太简单了。香蕉和海滩看起来都一样,都是黄色的。
OpenCV方法:compareHist()
这是一个很好的例子 matchTemplate找到很好的匹配 。它将搜索图像与正在搜索的图像进行卷积。它通常用于在较大的图像中找到较小的图像部分。
缺点:它只会返回相同图像,相同大小和相同的良好结果。取向。 OpenCV方法:matchTemplate()
被认为是进行图像搜索的最有效方法之一。从图像中提取许多特征,以确保即使旋转/缩放/倾斜也能再次识别相同的特征。以这种方式提取的特征可以与其他图像特征集匹配。另一个在第一个中具有高比例特征的图像很可能描绘了相同的对象/场景。它可用于查找照片之间拍摄角度的相对差异,或重叠量。
关于此,有许多OpenCV教程/示例,以及一个不错的视频 这里 。整个OpenCV模块(features2d)专门用于它。 缺点:可能很慢。它并不完美。
有点偏离主题但有用的是pythonic numpy 做法。它强大而快速但只是比较像素而不是图片所包含的对象或数据(并且它需要相同大小和形状的图像):
numpy
在没有openCV和任何计算机视觉库的情况下,一个非常简单快速的方法是通过规范图像阵列
import numpy as np picture1 = np.random.rand(100,100) picture2 = np.random.rand(100,100) picture1_norm = picture1/np.sqrt(np.sum(picture1**2)) picture2_norm = picture2/np.sqrt(np.sum(picture2**2))
在定义两个标准图片(或矩阵)之后,您可以将您想要比较的图片的乘法加以总结:
1)如果你比较相似的图片,总和将返回1:
In[1]: np.sum(picture1_norm**2) Out[1]: 1.0
2)如果它们不相似,你将获得一个介于0和1之间的值(如果乘以100则为百分比):
In[2]: np.sum(picture2_norm*picture1_norm) Out[2]: 0.75389941124629822
请注意,如果您有彩色图片,则必须在所有3个维度中执行此操作,或者只是比较灰度版本。我经常需要将大量图片与任意内容进行比较,这是一种非常快速的方法。