图像质量评估指标:PSNR / SSIM 原理及Python代码

2023-11-07

PSNR(峰值信噪比,Peak Signal-to-Noise Ratio),用于衡量两张图像之间差异,例如压缩图像与原始图像,评估压缩图像质量;复原图像与ground truth,评估复原算法性能等。

公式:

 

  其中,  MSE 为两张图像的均方误差; MaxValue 为图像像素可取到的最大值,例如 8 位图像为 2^8-1=255。

代码:

# 直接调库
from skimage.measure import compare_psnr

compare_psnr(img1, img2, 255)

'''
2022-7-28: 更新
skimage.measure.compare_psnr has been moved to skimage.metrics.peak_signal_noise_ratio
'''
from skimage.metrics import peak_signal_noise_ratio as compare_psnr
compare_psnr(img1, img2, data_range=255)
# 自己实现
import numpy as np

def compare_psnr(img1, img2, maxvalue):
        '''
        一般 opencv 读图是 uint8, 漏掉转数据格式会导致计算出错;
        有些代码会在 mse==0 的时候直接返回 100, 但很明显 psnr 并没有最大值为 100 的说法,
        通常也不会算两张相同图像的 psnr, 干脆和 skimage 一样不写 mse==0 的情况
        '''
    img1, img2 = img1.astype(np.float64), img2.astype(np.float64)
    mse = np.mean((img1 - img2) ** 2)
    return 10 * np.log10((maxvalue ** 2) / mse)

意义:
  PSNR 最小值为 0,PSNR 越大,两张图像差异越小;
  PSNR 计算简单,物理意义清晰,但是,这种基于 MSE 的评价指标并不能很好的按人眼的感受来衡量两张图像的相似度,例如 SSIM 论文中的图:


  意思就是5种不同变换后的图像与原图 MSE 相同,即 PSNR 也相同,但是 SSIM 不同,可以类似人的感受评估图像相似性。
  验证一下,保存了论文中的6幅图像计算 PSNR,毕竟不是完全在原图上计算的,不过 PSNR 的差异也确实不大:
psnr(a,b) = 22.8197
psnr(a,c) = 24.6104
psnr(a,d) = 23.6994
psnr(a,e) = 22.9966
psnr(a,f) = 24.6628

2. SSIM

  SSIM(结构相似性,Structural Similarity)基于人眼会提取图像中结构化信息的假设,比传统方式更符合人眼视觉感知。

公式:

 

 

代码:

from skimage.measure import compare_ssim

'''
compare_ssim(X, Y, win_size=None, gradient=False, 
                         data_range=None, multichannel=False, 
                         gaussian_weights=False, full=False, **kwargs)
                         
-------- Parameters --------
X, Y : ndarray
           任意维度图像
win_size : int or None
gradient : bool, optional
                   是否返回关于Y的梯度
data_range : float, optional
                         输入图像数据范围(MaxValue), 默认情况根据图像数据类型估计
multichannel : bool, optional
                           if True, 则将数组的最后一个维度视为通道, 
                           对每个通道独立进行相似度计算, 然后取平均值。
gaussian_weights : bool, optional
                                   if True, 则每个patch的均值和方差由宽度为 sigma=1.5 的归一化高斯核在空间上加权。
full : bool, optional
           if True, 返回原图大小的ssim而不是均值
           
-------- Other Parameters --------
use_sample_covariance : bool, default=True
                                                if True, 则通过 N-1 而不是 N 对协方差进行归一化,
                                                其中 N 是滑动窗口内的像素数。
K1 : float, default=0.01
K2 : float, default=0.03
sigma : float, default=1.5
                gaussian_weights=True 时的 sigma
                
-------- Returns --------
mssim : float
grad : ndarray
           X 和 Y 之间结构相似指数的梯度。
           仅在 gradient=True 时返回
S : ndarray
        完整的 ssim 图像
        仅在 full=True 时返回
'''
ssim = compare_ssim(img1, img2, win_size=11, data_range=255, multichannel=True)

意义:
  SSIM≤1,SSIM 越大,两张图像越相似。

  但是 PSNR 和 SSIM 都只适合画面复杂度低或完全对齐的图像,例如下图是同一地点的不同时期卫星图像及其重叠显示,对人眼来说相似度高,但由于没对齐导致 SSIM 很低。

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图像质量评估指标:PSNR / SSIM 原理及Python代码 的相关文章

  • Python 异常 - args 属性如何自动设置?

    假设我定义了以下异常 gt gt gt class MyError Exception def init self arg1 pass 然后我实例化该类以创建异常对象 gt gt gt e MyError abc gt gt gt e ar
  • 如何让Python的socket服务器永远运行

    我有这段代码创建了一个简单的Python套接字服务器 但是每次客户端断开连接时它都会关闭 如何让它永远运行 import socket HOST PORT 8000 s socket socket socket AF INET socket
  • 在 Django 中获取数据库类型[重复]

    这个问题在这里已经有答案了 我需要能够确定 Django 运行时使用的数据库类型 MYSQL False if
  • 如何使 Django ManyToMany “直通”查询更加高效?

    我使用的是 ManyToManyField 和 through 类 这会在获取事物列表时产生大量查询 我想知道是否有更有效的方法 例如 这里有一些描述书籍及其几位作者的简化类 它们通过角色类 定义 编辑器 插画家 等角色 class Per
  • 合并数据框中的值以写入 Excel

    我有一个看起来像的数据框 column1 column2 column3 colum4 column5 1 r n 1 r s 1 r n 2 r s 3 r n 3 2 r n 1 r s 1 r n 4 r s 4 r n 5 3 r
  • HoughLinesP后如何合并线?

    My task is to find coordinates of lines startX startY endX endY and rectangles 4 lines Here is input file 我使用下一个代码 img c
  • SQLAlchemy:检查给定值是否在列表中

    问题 在 PostgreSQL 中 检查某个字段是否在给定列表中是使用IN操作员 SELECT FROM stars WHERE star type IN Nova Planet SQLAlchemy 的等价物是什么INSQL查询 我尝试过
  • S3 选择检索 CSV 中的标头

    我尝试使用以下代码从存储在 S 存储桶中的 CSV 中获取记录子集 s3 boto3 client s3 bucket bucket file name file sql stmt SELECT S FROM s3object S LIMI
  • Highcharts 奇怪的分组行为

    我正在使用延迟加载 http www highcharts com stock demo lazy loading加载 OHLC 数据的方法 在服务器端 我使用 Python MySQL 并有 4 个包含 OHLC 数据的表 时间间隔为 5
  • __getitem__、__setitem__ 如何处理切片?

    我正在运行 Python 2 7 10 我需要拦截列表中的更改 我所说的 更改 是指在浅层意义上修改列表的任何内容 如果列表由相同顺序的相同对象组成 则列表不会更改 无论这些对象的状态如何 否则 它会更改 我不需要找出来how列表已经改变
  • 为什么我不能“string”.print()?

    我的理解print 在 Python 和 Ruby 以及其他语言 中 它是字符串 或其他类型 上的方法 因为它的语法非常常用 打印 嗨 works 那么为什么不呢 hi print 在 Python 中或 hi print在红宝石工作 当你
  • 使用Python进行图像识别[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个想法 就是我想识别图像中的字母 可能是 bmp或 jpg 例如 这是一个包含字母 S 的 bmp 图像 我想做的是使用Pyth
  • Python代码执行时自动打开浏览器

    我正在 Python Flask 中实现 GUI Flask 的设计方式是 必须 手动 打开本地主机以及端口号 有没有一种方法可以使其自动化 以便在运行代码时自动打开浏览器 本地主机 我尝试使用 webbrowser 包 但它在会话终止后打
  • Microsoft Azure 数据仓库和 SqlAlchemy

    我正在尝试使用 python 的 sqlalchemy 库连接到 microsoft azure 数据仓库 并收到以下错误 pyodbc Error HY000 HY000 Microsoft ODBC SQL Server Driver
  • Bottle 是否可以处理没有并发的请求?

    起初 我认为 Bottle 会并发处理请求 所以我编写了如下测试代码 import json from bottle import Bottle run request response get post import time app B
  • Numpy 通过一个数组的值总结另一个数组

    我正在尝试找到一种矢量化方法来完成以下任务 假设我有一个 x 和 y 值的数组 请注意 x 值并不总是整数并且可以为负数 import numpy as np x np array 1 1 1 3 2 2 2 5 4 4 dtype flo
  • 当我打印“查询”时获取 PY_VAR1

    我正在制作一个简单的网络抓取代码 当我尝试打印一个值时 它给了我其他东西 def PeopleSearch query SearchTerm query what is query print str query SearchTerm St
  • Python 可以替代 Java 小程序吗?

    除了制作用于物理模拟 如抛射运动 重力等 的教育性 Java 小程序之外 还有其他选择吗 如果你想让它在浏览器中运行 你可以使用PyJamas http pyjs org 这是一个 Python 到 Javascript 的编译器和工具集
  • Matplotlib 渲染日期、图像的问题

    我在使用 conda forge 的 Matplotlib v 3 1 3 和 python 3 7 时遇到问题 我拥有 Matplotlib 所需的所有依赖项 当我输入这段代码时 它应该可以工作 我得到了泼溅艺术 它基于此 YouTube
  • 将字典写入 csv 时遇到问题,其中键作为标题,值作为列

    我有一本字典 看起来像 mydict foo 1 2 bar 3 4 asdf 5 6 我正在尝试将其写入 CSV 文件 使其看起来像 foo bar asdf 1 3 5 2 4 6 我花了最后一个小时寻找解决方案 我发现的最接近的解决方

随机推荐

  • 【机器学习】9、最小二乘法和岭回归

    文章目录 一 最小二乘法 线性回归 1 1 公式 1 2 矩阵 1 3 代码实现 二 岭回归 一 最小二乘法 线性回归 1 1 公式 最小二乘法的本质 公式推导过程 1 2 矩阵 假设我们有n个样本数据 每个数据有p个特征值 然后p个特征值
  • 十大思维导图软件推荐

    1 GitMind GitMind是一款电脑上好用的免费在线思维导图软件 主要功能有大纲视图 一键自动布局 多人云协作 插入富文本 批量管理文件 格式刷 自定义主题 快速查看历史版本 插入关系线 添加概括 一键分享思维导图 多格式文本导出
  • Jmeter—实现识别验证码登录

    在做自动化测试或压力测试时 验证码总是一个问题 在以往的压力测试经历中 测试一般在独立的测试环境中进行 可以放心禁用验证码或使用万能验证码 这个是最实用的 但是 这两天我尝试了一个使用第三方的图形图像识别工具来完成验证码识别并通过Jmete
  • Google Material Design 设计分享

    Material design 核心思想是把物理世界的体验带进屏幕 还原最贴近真实的体验 达到简洁与直观的效果 详情请参阅 https developer android com design Google对app设计的一些要求案例 1 用
  • 充电管理BQ25619使用

    特征说明 1 Power On Reset POR 该装置通过VBUS usb充电口 和VBAT 电池 中的电压较高者给内部供电 当VBUS的电压上升到超过V BUS UVLOZ值或VBAT的电压超过V BAT UVLOZ值时 睡眠比较器
  • 谈前后端分离开发模式

    前后端分离的开发模式 系统分析阶段 系分和前端开发人员约定好页面上所需的逻辑变量 进入功能开发阶段 前端开发人员进行前台页面结构 样式 行为层的代码编写 并根据约定好的变量 逻辑规则 完成不同情况展示不同的表现 而后端开发人员 只需要按照约
  • 【软件测试 #3】软件测试基本概念作业题

    测试项目周期包括以下哪个阶段 1 0分 A 需求测试阶段 B 测试设计阶段 C 测试执行阶段 D 以上都是 正确答案 D 我的答案 D得分 1 0分 2 在进行静态白盒测试的过程中 正式审查的基本要素不包括下列哪一项 1 0分 A 确定问题
  • 加入SC-SIG,构建智能合约及分布式应用

    为了让更多开发者参与到智能合约库组件优化中 近期社区持续开展 智能合约库有奖征码 活动 随着活动的进行大家对智能合约库的关注度与讨论度日趋高涨 在此背景下 FISCO BCOS智能合约与分布式应用专项兴趣小组 Smart Contract
  • ue4,用三星MR开发时,出现分屏,而且屏幕在左上角是怎么回事?

    这个问题困扰了几天 后来测试发现跟模式无关 跟三星MR设置无关 因为正常的地图是可以看的 最后终于找到了原因 如果设置了窗口 全屏 分辨率的话 会出现这种情况 不用的话就好了 至于为什么不能设置 目前不知道 在用MR开发 并且只开启Wind
  • 在ubuntu环境下执行openssl编译和安装

    参考链接 工具系列 Ubuntu18 04安装Openssl 1 1 1 Tinywan的技术博客 51CTO博客 密码学专题 openssl编译和安装 MY CUP OF TEA的博客 CSDN博客 openssl 编译安装 下载 sou
  • Axure学习之路01——元件介绍

    本系列博客的目的是记录Auxure软件使用的一些要点 学习课程来自 Axure 9从入门到精通 目录 一些设计资源 基本元件 图片 占位符 图像热区 动态面板 内联框架 中继器 表单元件 文本框 文本域 下拉列表 列表框 复选框 单选按钮
  • 如何产生10个100-1000的随机数

    假设max 1000 min 100 random nextInt 1000 是取0 1000之间的数 max min 1 是901 取余数所得的数应该是0 900吧 最后再加上最小数 100 0 900 最小数一起加 得出100 1000
  • Linux下安装运行keil uVision 4 (MDK v4.7)

    前几日把Keil uVision mdk v4 7 在ubuntu 12 04LTS上运行起来了 过程还算顺利 分享下步骤给需要的朋友 先上个安装完的屏幕截图 我用的是老土的Gnome Classic界面 可以看到wine菜单里有keil
  • CVE-2022-22965:Spring远程代码执行漏洞

    CVE 2022 22965 Spring Framework远程代码执行漏洞 本文仅为验证漏洞 在本地环境测试验证 无其它目的 漏洞编号 CVE 2022 22965 漏洞说明 Spring framework 是Spring 里面的一个
  • Mac下如何彻底删除IntelliJ IDEA

    有时候破解版idea 或者对idea进行各种操作后 idea 坏 掉了 那就要删除再重新安装一个 但是单纯的将整个idea移入废纸篓后 重新安装idea 会恢复到删除之前的状态 里面包含你写的代码啊 破解是改变的文件的 十分麻烦 今天老9教
  • 详解MySQL的三层架构(连接层、服务层、引擎层)

    首先来看一张很经典的图 连接层 Connectors 即为连接层 我们在访问MySQL服务前 第一件事就是建立TCP链接 经过三次握手建立连接成功后 MYSQL对TCP传输过来的账号密码做身份认证 权限获取 TCP链接收到请求后 必须要分配
  • 膜拜大佬!java设计模式刘伟课后答案

    一 先来解读 23种设计模式要点 1 单例模式 Singleton Pattern 2 工厂模式 3 抽象工厂模式 Abstract Factory Pattern 4 模板方法模式 Template Method Pattern 5 建造
  • 劳务派遣管理系统_适合人力资源外包、劳务派遣和劳务外包公司使用的人力资源管理系统有哪些?...

    人力资源外包 劳务派遣和劳务外包使用的管理系统有啥不一样 从区别上 人力资源外包里面的 包 指的是人力资源部门的职能 而劳务派遣则派的是 人 由劳务派遣单位与被派遣劳动者签订劳动合同 对于劳务外包而言 包的是 活儿 当然也包了 人 劳务外包
  • 飞书与德勤管理咨询达成战略合作,赋能企业实现智慧运营与管理

    3月19日 飞书宣布与德勤管理咨询达成战略合作 双方将携手整合资源 渠道以及解决方案 通过德勤管理咨询智慧运营方案 以及飞书高效 愉悦的一站式沟通与协作平台 为中国的各类企业客户提供高效管理 智慧管理解决方案 伴随着经济全球化与信息技术革新
  • 图像质量评估指标:PSNR / SSIM 原理及Python代码

    PSNR 峰值信噪比 Peak Signal to Noise Ratio 用于衡量两张图像之间差异 例如压缩图像与原始图像 评估压缩图像质量 复原图像与ground truth 评估复原算法性能等 公式 其中 MSE 为两张图像的均方误差