OpenCV 进行图像相似度对比的几种办法-【顺带附py对比学习案例】

本文介绍了使用OpenCV进行图像相似度对比的几种方法,包括直方图对比、图像模板匹配、PSNR峰值信噪比、SSIM结构相似性和感知哈希算法。通过案例展示了这些方法在不同场景下的应用效果,如猫咪图像的对比,讨论了各自的优缺点和适用范围。
Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

最近研究了下计算机视觉、图像对比参考了一下py的一些源码和思路等信息学习学习。

但是呢只能对应相似度、稍微改一改剪切了图片后的就变化差异比较大,对目前自己的需求来说不是很有作用,顺带整理分享一下。

如上图:图一:喵1.jpg    图二: g喵1.jpg   图三:喵3.jpg   图四:喵2.jpg(带着后冠的女王喵耶、必须单独一行)

 

代码执行结果如下:

对比后的相似度,相似度越高,图片越接近,达到1.0说明图片完全相同。

(下图为剪切的布偶喵咪和原猫咪对比)效果你肯定想着还可以的吧、但其实不算理想咯。

上下图、另一个不一样的猫咪对比。

可可爱爱的两个猫咪对比后:还没有0.5没一半、过分了喔、可能因为颜色不一样了?但是姿势角度是一样的?差异那么多?  嗯、下面有提供一些思路一起研究啦。。。

那就接下来继续第三只猫咪吧、冲鸭~

结果可以看到、当前的第三只可爱小猫咪和第二只对比过的相似度是差不多的。唉。。。 数据啊结果啊、总是那么的不如意。。。

 

反正都对比了就把女王喵和猫2好对比一下看看咯:这个摆明不一样的啦、

这个结果还是自己认为的妥妥的、对应上了。

计算两幅图片的相似度总结参考:

https://blog.csdn.net/u010977034/article/details/82733137?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.compare&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.compare

猫咪对比的代码参考、互学共进步、顺带自己记录一下 稳稳的

from PIL import Image
import glob
import os
class CompareImage():
    def calculate(self, image1, image2):
        g = image1.histogram()
        s = image2.histogram()
        assert len(g) == len(s), "error"

        data = []

        for index in range(0, len(g)):
            if g[index] != s[index]:
                data.append(1 - abs(g[index] - s[index]) / max(g[index], s[index]))
            else:
                data.append(1)

        return sum(data) / len(g)

    def split_image(self, image, part_size):
        pw, ph = part_size
        w, h = image.size

        sub_image_list = []

        assert w % pw == h % ph == 0, "error"

        for i in range(0, w, pw):
            for j in range(0, h, ph):
                sub_image = image.crop((i, j, i + pw, j + ph)).copy()
                sub_image_list.append(sub_image)

        return sub_image_list


    def compare_image(self, file_image1, file_image2, size=(256, 256), part_size=(64, 64)):
        '''
        'file_image1'和'file_image2'是传入的文件路径
         可以通过'Image.open(path)'创建'image1' 和 'image2' Image 对象.
         'size' 重新将 image 对象的尺寸进行重置,默认大小为256 * 256 .
         'part_size' 定义了分割图片的大小.默认大小为64*64 .
         返回值是 'image1' 和 'image2'对比后的相似度,相似度越高,图片越接近,达到1.0说明图片完全相同。
        '''

        image1 = Image.open(file_image1)
        image2 = Image.open(file_image2)

        #调用"split_image"函数,把图片切割,并分别放在数组中
        img1 = image1.resize(size).convert("RGB")
        sub_image1 = self.split_image(img1, part_size)

        img2 = image2.resize(size).convert("RGB")
        sub_image2 = self.split_image(img2, part_size)

        sub_data = 0
        #把切割好的照片,从数组中一一对应的提出来,传入"calculate"函数,做直方图比较
        for im1, im2 in zip(sub_image1, sub_image2):
            sub_data += self.calculate(im1, im2)

        x = size[0] / part_size[0]
        y = size[1] / part_size[1]

        pre = round((sub_data / (x * y)), 6)
        # print(str(pre * 100) + '%')
        if pre<0.3:
            os.remove(fp[k])

        print('Compare the image result is: ' + str(pre))
        return pre


if __name__ == '__main__':
    img1 =  '/Users/yizhilaomuzhu/Downloads/喵2.jpg'
    img2 =  '/Users/yizhilaomuzhu/Downloads/喵3.jpg'
    compare_image = CompareImage()
    compare_image.compare_image(img1,img2)


======================================== 分割线 ================================================

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

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值