OpenCV这么简单为啥不学——1.12、使用ssim函数对两张照片进行相似度分析

简介: OpenCV这么简单为啥不学——1.12、使用ssim函数对两张照片进行相似度分析



前言

计算机视觉市场巨大而且持续增长,且这方面没有标准API,如今的计算机视觉软件大概有以下三种:

1、研究代码(慢,不稳定,独立并与其他库不兼容)

2、耗费很高的商业化工具(比如Halcon, MATLAB+Simulink)

3、依赖硬件的一些特别的解决方案(比如视频监控,制造控制系统,医疗设备)这是如今的现状,而标准的API将简化计算机视觉程序和解决方案的开发,OpenCV致力于成为这样的标准API。

OpenCV致力于真实世界的实时应用,通过优化的C代码的编写对其执行速度带来了可观的提升,并且可以通过购买Intel的IPP高性能多媒体函数库(Integrated Performance Primitives)得到更快的处理速度。

故而我们选择学习OpenCV,我们来一步步的学习OpenCV。


ssim函数

将这个公式翻译出来变成Python代码即可。

摘抄一段维基百科关于PSNR的定义:

The structural similarity** (SSIM) index is a method for predicting the perceived quality of digital television and cinematic pictures, as well as other kinds of digital images and videos. The basic model was developed in the Laboratory for Image and Video Engineering(LIVE) at The University of Texas at Austin and further developed jointly with the Laboratory for Computational Vision (LCV) at New York University. Further variants of the model have been developed in the Image and Visual Computing Laboratory at University of Waterloo and have been commercially marketed.

我们来翻译一下:

结构相似度* * (SSIM)指数方法预测数字电视和电影的感知质量的照片,以及其他类型的数字图像和视频。的基本模型是在实验室开发的图像和视频工程(住)在得克萨斯大学的奥斯汀分校和进一步发展共同的实验室在纽约大学计算视觉(LCV)。进一步变异模型已经开发的图像和视觉计算实验室在滑铁卢大学和商业销售。

图像相似度算法分类

  1. 直方图比较法
  2. 感知哈希算法
  3. 内容特征法
  4. 关键点匹配
  5. SSIM(structural similarity,结构相似性)

SSIM实操过程

1、文件夹结构

两个图片用作分析的,main.py是主程序,还有一个是相似度对比图片。

2、环境搭建

这里需要3个库分别的作用的在代码中做了注释:

# 数据处理
import numpy as np
# 图像操作
import cv2
# 使用scipy-convolve2d函数进行卷积
from scipy.signal import convolve2d

3、样式处理

def matlab_style_gauss2D(shape=(3, 3), sigma=0.5):
    m, n = [(ss - 1.) / 2. for ss in shape]
    y, x = np.ogrid[-m:m + 1, -n:n + 1]
    h = np.exp(-(x * x + y * y) / (2. * sigma * sigma))
    h[h < np.finfo(h.dtype).eps * h.max()] = 0
    sumh = h.sum()
    if sumh != 0:
        h /= sumh
    return h

4、过滤

def filter2(x, kernel, mode='same'):
    return convolve2d(x, np.rot90(kernel, 2), mode=mode)

5、sim函数计算

def compute_ssim(im1, im2, k1=0.01, k2=0.04, win_size=11, L=255):
    if not im1.shape == im2.shape:
        raise ValueError("Input Imagees must have the same dimensions")
    if len(im1.shape) > 2:
        raise ValueError("Please input the images with 1 channel")
    C1 = (k1 * L) ** 2
    C2 = (k2 * L) ** 2
    window = matlab_style_gauss2D(shape=(win_size, win_size), sigma=0.5)
    window = window / np.sum(np.sum(window))
    if im1.dtype == np.uint8:
        im1 = np.double(im1)
    if im2.dtype == np.uint8:
        im2 = np.double(im2)
    mu1 = filter2(im1, window, 'valid')
    mu2 = filter2(im2, window, 'valid')
    mu1_sq = mu1 * mu1
    mu2_sq = mu2 * mu2
    mu1_mu2 = mu1 * mu2
    sigma1_sq = filter2(im1 * im1, window, 'valid') - mu1_sq
    sigma2_sq = filter2(im2 * im2, window, 'valid') - mu2_sq
    sigmal2 = filter2(im1 * im2, window, 'valid') - mu1_mu2
    ssim_map = ((2 * mu1_mu2 + C1) * (2 * sigmal2 + C2)) / ((mu1_sq + mu2_sq + C1) * (sigma1_sq + sigma2_sq + C2))
    return np.mean(np.mean(ssim_map))

6、图片拼接与保存

这里是将两张图片大小改成一样的方便拼接操作。

def img_show(similarity, img1, img2, name1, name2):
    img1 = cv2.resize(img1, (520, 520))
    img2 = cv2.resize(img2, (520, 520))
    # 拼接两张图片
    imgs = np.hstack([img1, img2])
    path = "{0}".format('{0}VS{1}相似指数{2}%.jpg'.format(name1, name2, round(similarity, 2)))
    cv2.imencode('.jpg', imgs)[1].tofile(path)
    return path

7、调用过程

这里的name1与name2需要自己输入一下。毕竟自己选的图片我并不知道据图内容。

# 这里需要自己改一下
name1 = "图片1名称"
name2 = "图片2名称"
img1_path = '1.jpg'
img2_path = '2.jpg'
img1 = cv2.imread(img1_path)
img2 = cv2.imread(img2_path)
im1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
im2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
im1 = cv2.resize(im1, (520, 520))
im2 = cv2.resize(im2, (520, 520))
similarity = compute_ssim(im1, im2) * 100
if similarity == 100:
    print("图片重复! 请重新上传图片")
    sys.exit()
print(img_show(similarity, img1, img2, name1, name2))

8、正确测试效果

这里两张图片相似度是65.41%,这个相似度是完整图片的相似度。

输出的图片

9、两张相同图片测试效果

由于两张图相同,故而相似度100%,这样是无意义的,故而我们取消它。

总结

图片相似度是人脸相似度的基础,当然,我们在工作中会用到各种图形的比较,产品形态学也会有很多的用处,总之,很重要的一个sim函数,我们得好好学一学哦。

相关文章
|
8月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.8、threshold阈值0-4效果对照图
OpenCV这么简单为啥不学——1.8、threshold阈值0-4效果对照图
75 0
|
8月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.13图片冷白皮(美白)处理
OpenCV这么简单为啥不学——1.13图片冷白皮(美白)处理
83 0
|
3月前
|
算法 计算机视觉
Opencv学习笔记(六):cv2.resize函数的介绍
这篇文章介绍了OpenCV库中cv2.resize函数的使用方法,包括其参数、插值方式选择以及实际代码示例。
656 1
Opencv学习笔记(六):cv2.resize函数的介绍
|
3月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
791 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
5月前
|
计算机视觉
OpenCV滑动条(createTrackbar()函数)如何在多个维度进行同步调整?
这篇文章介绍了如何在OpenCV中使用`createTrackbar()`函数创建多个滑动条以同步调整图像的多个维度(如亮度和对比度),通过将不同滑动条的回调函数合并为一个,确保它们在同一图像基础上进行调整。
|
6月前
|
机器学习/深度学习 XML 计算机视觉
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
|
7月前
|
计算机视觉
OpenCV轮廓分析
OpenCV轮廓分析
|
8月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.5、解决putText中文乱码问题
OpenCV这么简单为啥不学——1.5、解决putText中文乱码问题
439 0
OpenCV这么简单为啥不学——1.5、解决putText中文乱码问题
|
8月前
|
人工智能 监控 API
OpenCV这么简单为啥不学——1.11、蓝背景证件照替换白色或红色
OpenCV这么简单为啥不学——1.11、蓝背景证件照替换白色或红色
91 0
|
8月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.10、addWeighted设置图片透明度
OpenCV这么简单为啥不学——1.10、addWeighted设置图片透明度
100 0