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

  

前言

  

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

  

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

  

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

  

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

,   

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

  

1。MSE对比

  

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

  


MSE公式   

  

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

  

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

  

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

  

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

  

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

  

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

  

2。PSNR对比

  

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

  

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

  

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

  

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

  

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

  

3。SSIM对比

  

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

  

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

  

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

  

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

  

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

  

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

  

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

  

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

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