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


Posted in Python onJuly 15, 2019

前言

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

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

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

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

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

1. MSE对比

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

MSE formula

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

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

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

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

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

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

2. PSNR对比

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

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

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

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

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

3. SSIM对比

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

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

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

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

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

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

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

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

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

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

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

原图

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

修改图

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

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

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

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

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

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

Python 相关文章推荐
用Python的SimPy库简化复杂的编程模型的介绍
Apr 13 Python
django开发之settings.py中变量的全局引用详解
Mar 29 Python
Python运维自动化之nginx配置文件对比操作示例
Aug 29 Python
python 实现矩阵上下/左右翻转,转置的示例
Jan 23 Python
python tools实现视频的每一帧提取并保存
Mar 20 Python
python批量修改ssh密码的实现
Aug 08 Python
修改Pandas的行或列的名字(重命名)
Dec 18 Python
tensorflow 保存模型和取出中间权重例子
Jan 24 Python
详解Python 实现 ZeroMQ 的三种基本工作模式
Mar 24 Python
Python读取配置文件(config.ini)以及写入配置文件
Apr 08 Python
查看keras各种网络结构各层的名字方式
Jun 11 Python
Python可视化神器pyecharts绘制水球图
Jul 07 Python
python3实现斐波那契数列(4种方法)
Jul 15 #Python
为什么从Python 3.6开始字典有序并效率更高
Jul 15 #Python
django settings.py 配置文件及介绍
Jul 15 #Python
python项目对接钉钉SDK的实现
Jul 15 #Python
用Python识别人脸,人种等各种信息
Jul 15 #Python
django中账号密码验证登陆功能的实现方法
Jul 15 #Python
python tkinter窗口最大化的实现
Jul 15 #Python
You might like
PHP获取表单textarea数据中的换行问题
2010/09/10 PHP
PHP开发不能违背的安全规则 过滤用户输入
2011/05/01 PHP
Ajax提交表单时验证码自动验证 php后端验证码检测
2016/07/20 PHP
php获取用户真实IP和防刷机制的实例代码
2018/11/28 PHP
Laravel如何同时连接多个数据库详解
2019/08/13 PHP
fancybox modal的完美解决(右上的X)
2012/10/30 Javascript
JS对select控件option选项的增删改查示例代码
2013/10/21 Javascript
javascript获取xml节点的最大值(实现代码)
2013/12/11 Javascript
原生javascript实现获取指定元素下所有后代元素的方法
2014/10/28 Javascript
浅析javascript的间隔调用和延时调用
2014/11/12 Javascript
Nodejs关于gzip/deflate压缩详解
2015/03/04 NodeJs
jQuery简单几行代码实现tab切换
2015/03/10 Javascript
JS中绑定事件顺序(事件冒泡与事件捕获区别)
2017/01/24 Javascript
js正则表达式验证密码强度【推荐】
2017/03/03 Javascript
windows下vue.js开发环境搭建教程
2017/03/20 Javascript
微信分享调用jssdk实例
2017/06/08 Javascript
DataTables添加额外的查询参数和删除columns等无用参数实例
2017/07/04 Javascript
jquery 键盘事件的使用方法详解
2017/09/13 jQuery
24个解决实际问题的ES6代码片段(小结)
2020/02/02 Javascript
[37:45]完美世界DOTA2联赛PWL S3 LBZS vs Phoenix 第二场 12.09
2020/12/11 DOTA
[01:31:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第二场 1月10日
2021/03/11 DOTA
python下函数参数的传递(参数带星号的说明)
2010/09/19 Python
Python的Django REST框架中的序列化及请求和返回
2016/04/11 Python
socket + select 完成伪并发操作的实例
2017/08/15 Python
Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法
2018/01/11 Python
Python 编码规范(Google Python Style Guide)
2018/05/05 Python
python 使用plt画图,去除图片四周的白边方法
2019/07/09 Python
Kears+Opencv实现简单人脸识别
2019/08/28 Python
opencv python如何实现图像二值化
2020/02/03 Python
python利用文件时间批量重命名照片和视频
2021/02/09 Python
大学生自我评价怎样写好
2013/10/23 职场文书
建筑工程专业学生的自我评价
2013/12/25 职场文书
优秀教师推荐材料
2014/12/16 职场文书
幼儿园小班教育随笔
2015/08/14 职场文书
社区结对共建协议书
2016/03/23 职场文书
mysql事务隔离级别详情
2021/10/24 MySQL