OpenCV进行图像相似度对比的几种办法

1、直方图方法

方法描述:有两幅图像patch(当然也可是整幅图像),分别计算两幅图像的直方图,并将直方图进行归一化,然后按照某种距离度量的标准进行相似度的测量。

方法的思想:基于简单的向量相似度来对图像相似度进行度量。

优点:直方图能够很好的归一化,比如256个bin条,那么即使是不同分辨率的图像都可以直接通过其直方图来计算相似度,计算量适中。比较适合描述难以自动分割的图像。

缺点:直方图反应的是图像灰度值得概率分布,并没有图像的空间位置信息在里面,因此,常常出现误判;从信息论来讲,通过直方图转换,信息丢失量较大,因此单一的通过直方图进行匹配显得有点力不从心。


2、图像模板匹配

一般而言,源图像与模板图像patch尺寸一样的话,可以直接使用上面介绍的图像相似度测量的方法;如果源图像与模板图像尺寸不一样,通常需要进行滑动匹配窗口,扫面个整幅图像获得最好的匹配patch。

在OpenCV中对应的函数为:matchTemplate():函数功能是在输入图像中滑动窗口寻找各个位置与模板图像patch的相似度。


3、PSNR峰值信噪比

PSNR(Peak Signal to Noise Ratio),一种全参考的图像质量评价指标。

简介:https://en.wikipedia.org/wiki/Peak_signal-to-noise_ratio

PSNR是最普遍和使用最为广泛的一种图像客观评价指标,然而它是基于对应像素点间的误差,即基于误差敏感的图像质量评价。由于并未考虑到人眼的视觉特性(人眼对空间频率较低的对比差异敏感度较高,人眼对亮度对比差异的敏感度较色度高,人眼对一个区域的感知结果会受到其周围邻近区域的影响等),因而经常出现评价结果与人的主观感觉不一致的情况。


4、SSIM(structural similarity)结构相似性

也是一种全参考的图像质量评价指标,它分别从亮度、对比度、结构三方面度量图像相似性。

SSIM取值范围[0,1],值越大,表示图像失真越小.

在实际应用中,可以利用滑动窗将图像分块,令分块总数为N,考虑到窗口形状对分块的影响,采用高斯加权计算每一窗口的均值、方差以及协方差,然后计算对应块的结构相似度SSIM,最后将平均值作为两图像的结构相似性度量,即平均结构相似性MSSIM:

5、感知哈希算法

(perceptual hash algorithm)

http://blog.csdn.net/fengbingchun/article/details/42153261

感知哈希算法(perceptual hash algorithm),它的作用是对每张图像生成一个“指纹”(fingerprint)字符串,然后比较不同图像的指纹。结果越接近,就说明图像越相似。

实现步骤:

  1. 缩小尺寸:将图像缩小到8*8的尺寸,总共64个像素。这一步的作用是去除图像的细节,只保留结构/明暗等基本信息,摒弃不同尺寸/比例带来的图像差异;
  2. 简化色彩:将缩小后的图像,转为64级灰度,即所有像素点总共只有64种颜色;
  3. 计算平均值:计算所有64个像素的灰度平均值;
  4. 比较像素的灰度:将每个像素的灰度,与平均值进行比较,大于或等于平均值记为1,小于平均值记为0;
  5. 计算哈希值:将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图像的指纹。组合的次序并不重要,只要保证所有图像都采用同样次序就行了;
  6. 得到指纹以后,就可以对比不同的图像,看看64位中有多少位是不一样的。在理论上,这等同于”汉明距离”(Hamming distance,在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数)。如果不相同的数据位数不超过5,就说明两张图像很相似;如果大于10,就说明这是两张不同的图像。 
    以上内容摘自:http://www.ruanyifeng.com/blog/2011/07/principle_of_similar_image_search.html
  • 6
    点赞
  • 118
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OpencvSharp是一个开源的计算机视觉库,它提供了许多图像处理和计算机视觉算法。要计算相似度,可以使用OpencvSharp中的几个功能。 首先,可以使用OpencvSharp中的函数计算图像的直方图。直方图是图像中像素强度分布的统计信息。通过比较两个图像的直方图,可以判断它们在颜色或灰度上的相似度。 其次,可以使用OpencvSharp中的函数计算图像的结构相似性指数(SSIM)。SSIM是一种衡量图像质量的方法,它计算了亮度、对比度和结构三个方面的相似度。通过比较两个图像的SSIM值,可以得出它们的相似度分数。 还可以使用OpencvSharp中的函数计算图像的均方差(MSE)。MSE衡量了两个图像之间像素强度的差异。通过计算两个图像的像素值之差的平方,并求平均值,可以得到它们之间的MSE值。MSE越小,表示两个图像越相似。 除了上述方法,还可以使用OpencvSharp中的函数计算图像的结构相似度指数(PSNR)。PSNR是一种衡量图像失真程度的指标,它将图像的MSE值转化为对数刻度,并计算出表示图像质量的PSNR值。PSNR越高,表示图像质量越好,相似度也就越高。 综上所述,OpencvSharp提供了多种方法来计算图像相似度。根据具体的需求和应用场景,选择合适的方法进行相似度的计算。 ### 回答2: OpenCvSharp是一个基于OpenCV的开源计算机视觉库,它提供了各种图像处理和计算机视觉算法。要计算两个图像相似度,可以使用OpenCVSharp中的几个函数和方法。 首先,可以使用OpenCvSharp加载两个图像,并将它们转换为相同的颜色空间,例如灰度图像。然后,可以使用OpenCVSharp中的函数计算两个图像的差异。常用的方法是平方差法和相关系数。 平方差法是通过计算两个图像像素之差的平方来衡量它们的相似度。相关系数则是通过计算两个图像之间的协方差来衡量它们的相似度。相关系数的取值范围为-1到1,接近1表示两个图像高度相似,接近-1表示它们高度不相似。 接下来,可以根据得到的相似度进行进一步的处理。例如,可以设置一个阈值,当相似度超过该阈值时,认为两个图像相似。还可以使用其他的图像匹配算法,如特征匹配或基于深度学习的方法,来进一步提高相似度的准确性。 总之,使用OpenCvSharp可以方便地计算两个图像相似度,并根据需要进行进一步的处理和操作。 ### 回答3: OpenCvSharp是一个基于OpenCV的开源计算机视觉库,它提供了许多用于图像处理和计算机视觉任务的函数和类。要计算相似度,可以使用OpenCvSharp中的一些函数和算法。 首先,可以使用OpenCvSharp中的函数读取两个图像。可以使用`Cv2.ImRead`函数读取图像文件,并将其存储在`Mat`对象中。 接下来,可以使用`Cv2.CompareHist`函数计算两个图像的直方图相似度。该函数需要两个参数,分别是要比较的两个图像的直方图,以及相似度度量的方法。常用的方法包括相关性、卡方、交叉熵等。该函数的返回值是一个0到1之间的相似度得分,值越接近1表示两个图像越相似。 除了直方图相似度,还可以使用OpenCvSharp中的其他函数和算法计算图像相似度。例如,可以使用`Cv2.MatchTemplate`函数进行模板匹配,该函数将模板图像与目标图像进行比较,返回一个匹配结果图像,其中亮度表示匹配程度。可以使用该函数找到目标图像中与模板图像最相似的区域。 此外,OpenCvSharp还提供了一些其他的函数和类,用于特征提取、特征匹配和图像分类等任务。可以根据具体的应用场景选择适合的函数和算法来计算图像相似度。 总而言之,使用OpenCvSharp可以方便地计算图像相似度。根据具体的需求,可以选择不同的函数和算法来完成相应的计算任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值