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

作者:Jeru_d39e 时间:2022-06-28 10:57:59 

前言

图片的本质就是大量像素在二维平面上的组合,每个像素点用数字化方式记录颜色。可以直观的想象,一张图片就是一个巨大的电子栅格,每个格子内有一盏灯泡,这个灯泡可以变换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对比图像质量的几种方法

来源:https://www.jianshu.com/p/ca343a441e6d

标签:python,opencv,对比,图像,质量
0
投稿

猜你喜欢

  • python pprint模块中print()和pprint()两者的区别

    2023-10-18 07:34:18
  • asp如何制作一个文本文件编辑器?

    2010-07-07 12:26:00
  • php函数之strtr和str_replace的用法详解以及效率分析

    2023-06-02 14:04:18
  • asp如何用OdbcRegTool组件来创建一个数据源?

    2010-06-12 12:55:00
  • 仿china.nba.com焦点图轮播展示效果(ie6,ff)

    2008-04-21 12:54:00
  • 通向MySQL神秘王国的图形化之路

    2008-12-08 13:43:00
  • MYSQL在一个字段值前面加字符串

    2010-10-14 14:28:00
  • 利用Go语言快速实现一个极简任务调度系统

    2023-08-28 14:26:15
  • python中k-means和k-means++原理及实现

    2022-01-17 10:52:07
  • asp生成UTF-8格式的文件方法

    2008-01-26 20:59:00
  • ASP.NET中MVC从后台控制器传递数据到前台视图的方式

    2023-06-29 07:09:39
  • PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)

    2023-11-23 11:35:00
  • 从开发人员角度看IE8的开发新特性

    2010-02-26 10:48:00
  • Go单元测试对GORM进行Mock测试

    2023-07-20 17:38:53
  • 向上不间断(无缝)滚动图片js代码

    2007-09-24 20:22:00
  • js全选/全不选/反选 checkbox代码

    2008-03-18 13:00:00
  • ASP存储过程应用全接触

    2007-08-18 14:28:00
  • 谈一谈基于python的面向对象编程基础

    2021-09-09 11:04:39
  • 如何在Access 2007数据库中添加附件

    2008-11-21 12:32:00
  • css基础教程属性篇

    2008-07-23 12:44:00
  • asp之家 网络编程 m.aspxhome.com