// Compare two images by getting the L2 error (square-root of sum of squared error).
double getSimilarity( const Mat A, const Mat B ) {
if ( A.rows > 0 && A.rows == B.rows && A.cols > 0 && A.cols == B.cols ) {
// Calculate the L2 relative error between images.
double errorL2 = norm( A, B, CV_L2 );
// Convert to a reasonable scale, since L2 error is summed across all pixels of the image.
double similarity = errorL2 / (double)( A.rows * A.cols );
return similarity;
}
else {
//Images have a different size
return 100000000.0; // Return a bad value
}
4 回答
这是一个非常庞大的话题,从3行代码到整个研究杂志的答案 .
我将概述最常见的此类技术及其结果 .
比较直方图
最简单,最快捷的方法之一 . 几十年前提出的作为寻找图像相似性的手段 . 这个想法是,森林将拥有大量的绿色,人脸会有很多粉红色,或者其他什么 . 因此,如果你将两张图片与森林进行比较,你会在直方图之间得到一些相似之处,因为两者都有很多绿色 .
模板匹配
这是一个很好的例子matchTemplate finding good match . 它将搜索图像与正在搜索的图像进行卷积 . 它通常用于在较大的图像中找到较小的图像部分 .
功能匹配
被认为是进行图像搜索的最有效方法之一 . 从图像中提取许多特征,以确保即使旋转/缩放/倾斜也能再次识别相同的特征 . 以这种方式提取的特征可以与其他图像特征集匹配 . 另一个在第一个中具有高比例特征的图像很可能描绘了相同的对象/场景 . 它可用于查找照片之间拍摄角度的相对差异,或重叠量 .
有点偏离主题但有用的是pythonic
numpy
方法 . 它强大而快速但只是比较像素而不是图片所包含的对象或数据(并且它需要相同大小和形状的图像):在没有openCV和任何计算机视觉库的情况下,一个非常简单快速的方法是通过规范图像阵列
在定义两个标准图片(或矩阵)之后,您可以将您想要比较的图片的乘法加以总结:
1)如果你比较相似的图片,总和将返回1:
2)如果它们不相似,你将获得一个介于0和1之间的值(如果乘以100则为百分比):
请注意,如果您有彩色图片,则必须在所有3个维度中执行此操作,或者只是比较灰度版本 . 我经常需要将大量图片与任意内容进行比较,这是一种非常快速的方法 .
Sam的解决方案应该足够了 . 我已经使用直方图差异和模板匹配的组合,因为没有一种方法在100%的时间对我有效 . 我对直方图方法的重视程度较低 . 这是我在简单的python脚本中实现的方式 .
如果匹配相同的图像(相同的大小/方向)
Source