对比俩张图片差异,可以用均方误差(MSE)与结构相似性指数(SSIM)函数。(Mean Squared Error vs. Structural Similarity Measure)

使用此方法,我们能够轻松确定两个图像是相同的还是由于轻微的图像操作,压缩伪像或有目的的篡改而有所不同。

尽管MSE的计算速度要快得多,但它的主要缺点是(1)全局应用,(2)仅估计图像的感知错误。
另一方面,SSIM虽然速度较慢,但​​可以通过比较图像的局部区域而不是全局图像来感知图像的结构信息的变化。 那么您应该使用哪种方法?
一般来说,SSIM会为您带来更好的结果,但会降低性能。 但是我认为,准确性的提高是值得的。

MSE的值为0表示完全相似。大于1的值表示相似度较小,MSE的值随着像素强度之间的平均差增加而将继续增长。MSE值域在[0,…)
SSIM的值为1表示完全相似。值越小表示相似性越差。SSIM的值域在[-1,1]之间。

MSE与SSIM的方法比较俩张图片的前提是俩张图片的大小是一样的。
大小不一样的,可以学习cv.resize(),放大缩小到同一大小后进行比较。

1. MSE 均方误差介绍

MSE核心是逐个像素差的平方和,除以像素的个数。
MSE的实现非常简单,但是将其用于相似性时,我们可能会遇到问题。主要的一点是,像素强度之间的较大距离并不一定意味着图像的内容有很大不同。

为了纠正与MSE相关的一些图像比较问题,我们使用了Wang等人开发的结构相似性指数函数。

二、结构相似性指数


SSIM方法显然比MSE方法更复杂,但是要点是SSIM试图对图像的结构信息中感知到的变化建模,而MSE实际上是在评估感知到的错误。两者之间有细微的差别,但结果却是惊人的。
MSE只考虑感知到的变化,而SSIM则考虑到了图像结构的变化(如公式中对于图像中N x N窗口的(x,y)位置,x和y方向上像素强度的平均值,x和y方向上强度的方差以及协方差。 ),是一种更健壮的方法。

# import the necessary packages
from skimage.metrics import structural_similarity as ssim
import matplotlib.pyplot as plt
import numpy as np
import cv2def mse(imageA, imageB):# 均方误差方法用 python实现# 计算俩张图片的像素差的平方和的平均值# 俩张图必须有相同的 分辨率维度err = np.sum((imageA.astype("float") - imageB.astype("float")) ** 2)err /= float(imageA.shape[0] * imageA.shape[1])# return the MSE, the lower the error, the more "similar"# the two images arereturn errdef compare_images(imageA, imageB, title):# 计算俩张图片的均方误差 及 结构相似性指数m = mse(imageA, imageB)s = ssim(imageA, imageB)# 设置图片的名称标头fig = plt.figure(title)plt.suptitle("MSE: %.2f, SSIM: %.2f" % (m, s))# 展示第一张图ax = fig.add_subplot(1, 2, 1)plt.imshow(imageA, cmap=plt.cm.gray)plt.axis("off")# 展示第二张图ax = fig.add_subplot(1, 2, 2)plt.imshow(imageB, cmap=plt.cm.gray)plt.axis("off")# 展示图片plt.show()def main():# 加载图片 —— 初始,对比,ps操作过的original = cv2.imread("D:/pyimagesearch/images/origin.jpg")contrast = cv2.imread("D:/pyimagesearch/images/contrast.jpg")shopped = cv2.imread("D:/pyimagesearch/images/photoshopped.jpg")# convert the images to grayscaleoriginal = cv2.cvtColor(original, cv2.COLOR_BGR2GRAY)contrast = cv2.cvtColor(contrast, cv2.COLOR_BGR2GRAY)shopped = cv2.cvtColor(shopped, cv2.COLOR_BGR2GRAY)# 初始化图表fig = plt.figure("Images")images = ("Original", original), ("Contrast", contrast), ("Photoshopped", shopped)# 循环遍历三张图片for (i, (name, image)) in enumerate(images):# 加载入图片ax = fig.add_subplot(1, 3, i + 1)ax.set_title(name)plt.imshow(image, cmap=plt.cm.gray)plt.axis("off")# 展示图片plt.show()# 分别比较图片compare_images(original, original, "Original vs. Original")compare_images(original, contrast, "Original vs. Contrast")compare_images(original, shopped, "Original vs. Photoshopped")if __name__ == "__main__":main()

结果图如下:

与原图相比 MSE: 0,SSIM:1 无限相似


与contrast对比图,显然不够像


与photoshop操作过加了前缀图的要比 contrast相似些。


参考:How-To: Python Compare Two Images

Python 比较俩张图片差异相关推荐

  1. 使用Python判断俩张图像相同或以某种方式相似

    使用Python判断俩张图像相同或以某种方式相似 1. 均方误差(MSE) 2. 结构相似性指数(SSIM) 3. 效果图 4. 总结 参考 比较图像有俩种方案: 使用图像哈希/感知哈希/差分哈希比较 ...

  2. python如何实现找图_利用OpenCV和Python实现查找图片差异

    使用OpenCV和Python查找图片差异 flyfish 方法1 均方误差的算法(Mean Squared Error , MSE) 下面的一些表达与<TensorFlow - 协方差矩阵&g ...

  3. python求两数最大公因数_『用python求俩个数的最大公约数和最小公倍数』

    python:用递归的方法编写一个函数gys(x,y),计算两个数字的最大公约数. (提示,大的 def gys(x,y): a,b=max(x,y),min(x,y) c=a%b if c==0: ...

  4. 用python做一张图片_如何用python下载一张图片

    如何用python下载一张图片 这里要用到的主要工具是requests这个工具,需要先安装这个库才能使用,该库衍生自urllib这个库,但是要比它更好用.多数人在做爬虫的时候选择它,是个不错的选择. ...

  5. 利用 python 实现多张图片的无损拼接

    利用 python 实现多张图片的无损拼接 以下两段是作者的心路历程,图个乐的可以看一看,想学干货可以直接略过. 导入 python 库 查看需要拼接的图片 横向拼接 保存拼接后的图片 总结 纵向拼接 ...

  6. Python 把两张图片拼起来

     Linux系统下使用 Python 把两张图片拼起来 combine.py from PIL import Image from os import listdir, chdir, mkdir fr ...

  7. 使用python将任意张图片拼接成多张大图

    今天看到在之前的一篇博客下有位朋友留言提到了"将多张图片拼接成多张大图"的问题,这一系列的博客已经写了三篇了,这是第四篇了,后三篇全都是基于广大博友的热心提问而成型的,十分感谢各位 ...

  8. python图片文字合成视频_利用Python将多张图片合成视频的实现

    今天要做一个量子隧穿的的演示动画,在CSDN上看了很多大佬的文章,然而忙了接近半天才做好这件事.把踩过的坑记一下,同时这段代码也是值得记录的,因为以后也可能遇到类似的工作. 先上代码` import ...

  9. python 对比两张图片是否相同

    python 对比两张图片是否相同 说明 说明 适用于对比两张图片是否完全相同 需要两张图片的大小完全一致 代码来源于网络,进行微调 from PIL import Image from PIL im ...

最新文章

  1. 常用的JQuery数字类型验证正则表达式
  2. oracle 主键_Oracle约束详解
  3. java爬取button_学习使用Java的webmagic框架爬取网页内容
  4. sqlserver 常用存储过程集锦
  5. 透视变换--基于getPerspectiveTransform()及像素赋值(未涉及插值)
  6. QT5开发及实例学习之十二Qt5图像坐标变换
  7. Google金山词霸体验小记
  8. 思达报表工具Style Report基础教程—用选择列表,选择树进行数据过滤
  9. c语言bim的题目,BIM考试选择题精选
  10. 萧条下的养殖业成就兽药电子商务新时代
  11. java 实现cmyk转rgb图片格式
  12. 【C语言编程练习】华氏转换为摄氏
  13. 关于MFi认证你所必须要知道的事情
  14. RHEL6.5和RHEL7 的区别(转)
  15. 【项目一】医疗实战-传智健康
  16. selenium常用的浏览器窗口操作
  17. Java选择题(十)
  18. ARPANET的设计思想 (分组交换)
  19. Qt实现软件任务栏托盘功能
  20. js html表单设计器,可视化表单设计器拖拽生成表单(原创)

热门文章

  1. 常用的Java GC算法
  2. [JavaScript] JavaScript 值类型使用:与数组有关的API
  3. CSS盒模型( CSS margin 属性)
  4. github上的图片当网络图片使用
  5. private关键字和构造方法
  6. JavaScript正则表达式之语法
  7. vim+vundle配置
  8. 遥控车_vijos1458_纪中1724_水
  9. [Unity WWW] 跨域访问解决方法
  10. 屏蔽Drupal中的“Notice: Undefined index”警告