用Python+OpenCV对比图像质量的几种方法

所属分类: 脚本专栏 / python 阅读数: 411
收藏 0 赞 0 分享

前言

图片的本质就是大量像素在二维平面上的组合,每个像素点用数字化方式记录颜色。可以直观的想象,一张图片就是一个巨大的电子栅格,每个格子内有一盏灯泡,这个灯泡可以变换256的三次方种颜色,就像下面这张卡通像素图一样,越清晰的图片像素越密集。

这一次来看看OpenCV提供的两种图像质量对比方式(PSNR & SSIM)及其扩展, 这篇文章会涉及到一点数学公式,顺便介绍一个我用过的生成公式的最佳在线编辑工具,秒杀所有收费工具。

链接在这里, 请收好: https://www.mathcha.io/editor

1. MSE对比

均方差 MSE(Mean Squared Error)对比, 思路是对两张尺寸完全相同的图片一个个像素进行对比,对比的数值就是颜色。注意下面公式有两个维度,因为我们对比的图像是像素矩阵,m and n 代表行数和列数。

MSE formula

MSE公式自己用numpy写几行代码实现,这里唯一要注意的是我找的图片是彩色的,因为有BGR3个颜色通道所以MSE要除以3得到平均值。

有了核心逻辑后准备一下素材 - 著名的经典图片Lena,再手工压缩75%, 90%, 95%放置入lena folder. Lena是1972年12月花花公子的封面女郎,这张照片只是裸体插页的1/3,下面少儿不宜部分被截断了,未删节原图在卡耐基梅隆大学的网页上还能找到(Warning: contains nudity)。

至于为什么选取她的照片,据说这张图片包含了各种细节,平滑区域,阴影和纹理,是完美的测试图像。其实都是扯淡,主要因为她当年是个迷人的美女,深受老一代美国码农欢迎。

2. PSNR对比

PSNR (Peak Signal to Noise Ratio)是最广泛使用的一种图像客观评价指标,通常用来评价一副图像压缩后与原图对比质量的好坏,这个值大概在30dB到50dB之间,PSNR值越高则压缩后失真越小,如果差异非常明显可能会得到15甚至更低的值。

所以MSE或者PSNR也好主要是对比完全一样但是压缩重构的图片,OpenCV官方文档说这也是逐帧比较视频差异的最常用方式,毕竟它简单,运行速度快。

但其呈现的差异有时候与人的主观感受不一致,所以OpenCV还提供了结构相似性算法SSIM做出改进。下面是PSNR公式,也是在MSE基础上的进一步扩展,这里MAX表示图像颜色最大值,8bit图像取值为255

3. SSIM对比

自然图像具备高度结构性,临近的像素间存在强相关性。

SSIM考虑了人眼的生物特征,是基于感知的计算模型,人类视觉系统就是从可视区域内获取结构信息,所以我们也可以检测结构信息的差异来对比图片,这和MSE或者PSNR通过线性变换来分解信号有本质上的不同。

SSIM的测量体系由三个模块组成: 亮度,对比度和结构。

三个模块的对比函数组合之后得到SSIM的公式如下:

下面是完整代码实现把三种score都打印出来看看,三种评测函数都直接改用了scikit-image库提供的现成方法,实验过结果和前面的实现是一样的。SSIM的score范围从-1到1,1表示和原图完全一致。

下面继续用SSIM来玩玩找不同游戏看看,我在网上找了两张图片,第一张是原图,第二张是PS后有N处差异,看看如何用SSIM快速找出答案。

原图

修改图

新开一个文件来实现逻辑:首先载入文件并转成grayscale, 并计算出SSIM; 核心逻辑在于line 22通过OSTU找出自适应阈值,line 23行根据这个阈值来提取轮廓,最后画方框出来。

对比结果,一秒找出八处不同

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Python常见加密模块用法分析【MD5,sha,crypt模块】

这篇文章主要介绍了Python常见加密模块用法,结合实例形式较为详细的分析了MD5,sha与crypt模块加密的相关实现方法与操作技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

Python向日志输出中添加上下文信息

这篇文章主要介绍了Python向日志输出中添加上下文信息的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Python实现的简单dns查询功能示例

这篇文章主要介绍了Python实现的简单dns查询功能,结合实例形式分析了Python基于socket模块的dns信息查询实现技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

利用Anaconda完美解决Python 2与python 3的共存问题

Anaconda 是 Python 的一个发行版,如果把 Python 比作 Linux,那么 Anancoda 就是 CentOS 或者 Ubuntu,下面这篇文章主要给大家介绍了利用Anaconda完美解决Python 2与python 3共存问题的相关资料,文中介绍的非常详
收藏 0 赞 0 分享

Python随机读取文件实现实例

这篇文章主要介绍了Python随机读取文件的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

用生成器来改写直接返回列表的函数方法

下面小编就为大家带来一篇用生成器来改写直接返回列表的函数方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

python爬虫入门教程--快速理解HTTP协议(一)

http协议是互联网里面最重要,最基础的协议之一,我们的爬虫需要经常和http协议打交道。下面这篇文章主要给大家介绍了关于python爬虫入门之快速理解HTTP协议的相关资料,文中介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
收藏 0 赞 0 分享

老生常谈Python进阶之装饰器

下面小编就为大家带来一篇老生常谈Python进阶之装饰器。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

浅谈Python基础之I/O模型

下面小编就为大家带来一篇浅谈Python基础之I/O模型。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

python如何获取服务器硬件信息

这篇文章主要为大家详细介绍了python获取服务器硬件信息的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享
查看更多