【图像质量评价指标】信噪比(Signal-to-Noise Ratio,SNR)

文章目录

  • 一、基本定义
  • 二、判断图像信噪比是否过低(经验值,仅供参考)
  • 三、SNR与图像质量指标关系
  • 四、评估方法 + 代码复现 —— 评估一张图像的信噪比
    • (1)有参考图像(推荐)
    • (2)无参考图像(自参考法)
      • 方法1:均值与标准差比值法(Mean-to-Std) —— 适用于背景均匀图像
      • 方法2:局部平滑图作为参考(弱参考) —— 适用于结构复杂图像

一、基本定义

图像信噪比(SNR)是一种衡量图像质量的重要指标,用于评价图像中有用信号(结构/图像内容)与噪声成分(失真/随机干扰)之间的相对强度。它在图像增强、重建、去噪等场景中广泛用于质量评估与调优依据。

信噪比定义:
SNR=10⋅log⁡10(∑S2∑(S−T)2)\mathrm{SNR} = 10 \cdot \log_{10} \left( \frac{\sum S^2}{\sum (S - T)^2} \right) SNR=10log10((ST)2S2)

  • 𝑆:参考图像(ground truth),即理想无噪图像
  • 𝑇:测试图像,含噪或待评估图像
  • 分子:信号能量(原图灰度值平方和)
  • 分母:噪声能量(参考图与测试图差异的平方和)

单位为分贝(dB),值越大表示图像中信号越强、噪声越小,图像质量越高

二、判断图像信噪比是否过低(经验值,仅供参考)

图像SNR越高,视觉质量越好。根据经验或视觉评估,常采用如下分界:

SNR值(dB)质量等级说明
> 40 dB极佳噪声几乎不可见
30–40 dB良好噪声极小,不影响观察
20–30 dB一般可用有一定噪声,图像细节仍可接受
10–20 dB噪声明显,图像结构受干扰
< 10 dB极差(过低)噪声严重遮蔽图像内容,常需重采/去噪

⚠️ 注:SNR判断应结合具体应用,例如医学图像要求更高,而工业场景容忍度可放宽。

图像信噪比低时的表现:

  • 对比度低,轮廓模糊;
  • 纹理缺失,图像边缘噪声明显;
  • 清晰度指标(如方差、Laplacian、熵)均偏低。

三、SNR与图像质量指标关系

指标有参考无参考特征
SNR估算版 ✅强调灰度能量
PSNR最大像素值主导
SSIM更关注结构相似度
信息熵✅/❌衡量信息复杂度或保真度
方差间接反映纹理与对比度
  • 有参考图像时,优先使用SNR或PSNR;
  • 无参考图像时,结合熵+方差+估算SNR三指标综合判断;
  • 图像过于模糊时,SNR 常低于 15 dB,可作为模糊图识别依据;
  • 可将 SNR 与对比度增强算法结合,实现自动图像质量筛选与增强优化。

四、评估方法 + 代码复现 —— 评估一张图像的信噪比

(1)有参考图像(推荐)

适用于图像去噪或增强场景,有“原始图像”作为基准。

若存在“无噪声”参考图,可以使用如下指标判断:

指标判断标准说明
SNR (dB)< 20dB → 认为信噪比低典型图像处理任务中,SNR 低于20dB 可能影响细节分析
PSNR (dB)< 30dB → 质量较差尽管PSNR主要用于压缩图像质量,但也适用于噪声干扰情况
MSE趋近于0越好噪声能量越大,MSE越高;与SNR成反比

信噪比、峰值信噪比、均方根误差、平均绝对误差
ImageJ 的插件用于评估图像质量(定义与安装 + 使用教程)
https://bigwww.epfl.ch/sage/soft/snr/
在这里插入图片描述

import cv2
import numpy as npdef compute_snr(r, t):"""计算信号对噪声比(SNR),公式 SNR = 10 * log10(P_signal / P_noise)其中 P_signal = mean(r^2),噪声 = t - r。"""noise = t.astype(np.float64) - r.astype(np.float64)psignal = np.mean(r.astype(np.float64) ** 2)pnoise = np.mean(noise ** 2)if pnoise == 0:return float('inf')return 10 * np.log10(psignal / pnoise)def compute_psnr(r, t, max_pixel=255.0):"""计算峰值信号对噪声比(PSNR),公式 PSNR = 20*log10(MAX_I) - 10*log10(MSE)"""mse = np.mean((r.astype(np.float64) - t.astype(np.float64)) ** 2)if mse == 0:return float('inf')return 20 * np.log10(max_pixel / np.sqrt(mse))def compute_rmse(r, t):"""计算均方根误差(RMSE)"""return np.sqrt(np.mean((r.astype(np.float64) - t.astype(np.float64)) ** 2))def compute_mae(r, t):"""计算平均绝对误差(MAE)"""return np.mean(np.abs(r.astype(np.float64) - t.astype(np.float64)))def evaluate_image_quality(ref_path, test_path):# 读取为灰度图r = cv2.imread(ref_path, cv2.IMREAD_GRAYSCALE)t = cv2.imread(test_path, cv2.IMREAD_GRAYSCALE)assert r.shape == t.shape, "图像尺寸不一致!"snr  = compute_snr(r, t)psnr = compute_psnr(r, t)rmse = compute_rmse(r, t)mae  = compute_mae(r, t)return {'SNR_dB': snr, 'PSNR_dB': psnr, 'RMSE': rmse, 'MAE': mae}if __name__ == "__main__":reference_image = "1-04.tif"test_image = "1-04-1.tif"metrics = evaluate_image_quality(reference_image, test_image)for k, v in metrics.items():print(f"{k}: {v:.8f}")
"""
SNR_dB: 11.92441281
PSNR_dB: 17.78177464
RMSE: 32.91936492
MAE: 23.56512515
"""

(2)无参考图像(自参考法)

常见场景:显微图像、X光图像、SEM图像。此时可考虑:

方法原理是否支持自动评估
方差/标准差图像整体灰度变化程度,方差越小表示图像越平
灰度熵熵低表示像素分布集中,图像信息少
频域分析(如FFT能谱)高频衰减严重,图像模糊,可能是低SNR表现
边缘响应用Sobel等算子检测边缘,边缘弱说明细节低

方法1:均值与标准差比值法(Mean-to-Std) —— 适用于背景均匀图像

import cv2
import numpy as npdef estimate_snr_single_image(img):img = img.astype(np.float64)mean = np.mean(img)std = np.std(img)if std == 0:return float('inf')return 20 * np.log10(mean / std)  # 分贝单位if __name__ == "__main__":path = "1-04-1.tif"image = cv2.imread(path, cv2.IMREAD_GRAYSCALE)metrics = estimate_snr_single_image(image)print(f"SNR: {metrics:.8f}")  # SNR: 4.87419592

方法2:局部平滑图作为参考(弱参考) —— 适用于结构复杂图像

思路:把图像自身当作“信号+噪声”的混合体,利用局部平滑图像估计出“信号”,残差视为“噪声”。

import cv2
import numpy as npdef estimate_snr_single_image(img, kernel_size=3):"""评估单张图像的 SNR:以平滑图像为信号,残差为噪声"""img = img.astype(np.float64)blurred = cv2.GaussianBlur(img, (kernel_size, kernel_size), 0)signal_power = np.mean(blurred ** 2)noise_power = np.mean((img - blurred) ** 2)if noise_power == 0:return float('inf')return 10 * np.log10(signal_power / noise_power)if __name__ == "__main__":path = "1-04-1.tif"image = cv2.imread(path, cv2.IMREAD_GRAYSCALE)metrics = estimate_snr_single_image(image)print(f"SNR: {metrics:.8f}")  # SNR: 13.77251702

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/92157.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92157.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 实现 TCP 一发一收通信

在网络编程中&#xff0c;TCP&#xff08;传输控制协议&#xff09;凭借其可靠传输的特性&#xff0c;成为需要确保数据完整性场景的核心选择。本文将基于一段 Java 代码实例&#xff0c;全面解析 TCP 单向通信的实现逻辑&#xff0c;帮助开发者掌握 TCP 编程的基础框架与底层原…

docker-compose启动前后端分离项目(单机)

&#x1f31f;docker-compose启动前后端 &#x1f4c1;准备文件 xzs-mysql.sql&#xff08;数据库脚本&#xff09;xzs-3.9.0.jar&#xff08;后端代码&#xff09;application-prod.yml&#xff08;后端配置文件&#xff09;entry.sh&#xff08;后端启动脚本&#xff09;exam…

有关Mysql数据库的总结

MySQL概念MySQL的理论知识概念数据库就是用来存储和管理数据的仓库&#xff01;数据库分类层次型数据库树型结构&#xff0c;一个子记录可以有一个父记录&#xff0c;一个父记录可以有多个子记录&#xff0c;类似一个二叉树&#xff0c;但是一个父节点可以不止两个子节点&#…

复制docker根目录遇到的权限问题

环境 ubuntu20.04, 普通用户使用sudo权限。 需求 linux系统上&#xff0c;默认的docker跟目录在/var/lib/docker目录下&#xff0c;但是根分区太小。想要将docker根目录挪到其它磁盘&#xff0c;防止以后镜像和容器增加后磁盘满了。 操作 先停止所有docker容器&#xff0c;然后…

git-子仓操作

为什么为什么要将代码仓作为子模块&#xff1f;有什么优势&#xff1f;精确版本控制&#xff1a;父仓记录子仓的commit哈希值&#xff0c;确保代码版本固定&#xff0c;避免隐式升级导致的兼容性问题模块化管理&#xff1a;将独立仓库作为子模块嵌入父仓&#xff0c;实现代码物…

代数——第5章——线性算子之应用(Michael Artin)

第 5 章 线性算子之应用 (Applications of Linear Operators) By relieving the brain from all unnecessary work, a good notation sets it free to concentrate on more advanced problems.( 通过减轻大脑所有不必要的工作&#xff0c;良好的符号可以让大脑集中精力解决…

Pytorch02:深度学习基础示例——猫狗识别

一、第三方库介绍库/模块功能torch提供张量操作、自动求导、优化算法、神经网络模块等基础设施。torchvision计算机视觉工具集&#xff0c;提供预训练模型、数据集、图像转换等功能。datasets (torchvision)用于加载常见数据集&#xff08;如 ImageNet、CIFAR-10、MNIST&#x…

spring简单项目实战

项目路径 modelspackage com.qcby.demo1;import com.qcby.service.UserService; import com.qcby.service.UserServiceImpl;public class Dfactory {public UserService createUs(){System.out.println("实例化工厂的方式...");return new UserServiceImpl();} }pack…

ServBay for Windows 1.4.0 发布:新增MySQL、PostgreSQL等数据库自定义配置

各位 Windows 平台的开发者们&#xff0c; ServBay 始终致力于为您打造一个强大、高效且灵活的本地开发环境。距离上次更新仅过去短短一周&#xff0c;经过我们技术团队的快速开发&#xff0c;我们正式推出了 ServBay for Windows 1.4.0 版本。 专业开发者不仅需要一个能用的环…

python网络爬虫小项目(爬取评论)超级简单

python网络爬虫小项目&#xff08;爬取评论&#xff09;超级简单 学习python网络爬虫的完整路径&#xff1a; &#xff08;第一章&#xff09; python网络爬虫(第一章/共三章&#xff1a;网络爬虫库、robots.txt规则&#xff08;防止犯法&#xff09;、查看获取网页源代码)-…

本周大模型新动向:奖励引导、多模态代理、链式思考推理

点击蓝字关注我们AI TIME欢迎每一位AI爱好者的加入&#xff01;01Iterative Distillation for Reward-Guided Fine-Tuning of Diffusion Models in Biomolecular Design本文提出了一种用于生物分子设计中奖励引导生成的扩散模型微调框架。扩散模型在建模复杂、高维数据分布方面…

JAVA+AI教程-第三天

我将由简入繁&#xff0c;由零基础到详细跟大家一起学习java---------------------------------------------------------------------01、程序流程控制&#xff1a;今日课程介绍02、程序流程控制&#xff1a;if分支结构if分支有三种形式&#xff0c;执行顺序就是先执行if&…

自定义命令行解释器shell

目录 一、模块框架图 二、实现目标 三、实现原理 四、全局变量 五、环境变量函数 六、初始化环境变量表函数 七、输出命令行提示符模块 八、提取命令输入模块 九、填充命令行参数表模块 十、检测并处理内建命令模块 十一、执行命令模块 十二、源码 一、模块框架图…

uniapp使用uni-ui怎么修改默认的css样式比如多选框及样式覆盖小程序/安卓/ios兼容问题

修改 uni-ui 多选框 (uni-data-checkbox) 的默认样式 在 uniapp 中使用 uni-ui 的 uni-data-checkbox 组件时&#xff0c;可以通过以下几种方式修改其默认样式&#xff1a; 方法一&#xff1a;使用深度选择器格式一&#xff1a;在页面的 style 部分使用深度选择器 >>>…

《Linux 环境下 Nginx 多站点综合实践:域名解析、访问控制与 HTTPS 加密部署》​

综合练习:请给openlab搭建web网站&#xff0c;网站需求&#xff1a; 1.基于域名www.openlab.com可以访问网站内容为 welcome to openlab!!&#xff0c; 2.给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料和缴费网站&#xff0c;基于www.openlab.com/student 网站访…

网络基础1-11综合实验(eNSP):vlan/DHCP/Web/HTTP/动态PAT/静态NAT

注&#xff1a;在华为模拟器&#xff08;eNSP&#xff09;上做的实验其中&#xff0c;在内网实验&#xff1a;Vlan/DHCP/VWeb/HTTP&#xff0c;在外网实验&#xff1a;动态PAT/静态NAT一、拓扑结构1. 核心设备与连接设备接口连接对象VLAN/IP角色LSW2/LSW3Ethernet 0/0/1-2PC1/P…

Mac上安装Claude Code的步骤

以下是基于现有信息的简明安装指南&#xff0c;适用于macOS系统。请按照以下步骤操作&#xff1a; 前提条件 操作系统&#xff1a;macOS 10.15或更高版本。Node.js和npm&#xff1a;Claude Code基于Node.js&#xff0c;需安装Node.js 18和npm。请检查是否已安装&#xff1a; …

MybatisPlus-15.扩展功能-逻辑删除

一.逻辑删除配置逻辑删除的字段时&#xff0c;logic-delete-field字段配置的是逻辑删除的实体字段名。字段类型可以是boolean和integer。在java中默认是boolean类型。逻辑已删除值默认为1&#xff0c;而逻辑未删除值默认为0。当是1时代表已删除(1在数据库表中为true&#xff0c…

IDEA 同时修改某个区域内所有相同变量名

在 IntelliJ IDEA 中&#xff0c;同时修改某个区域内所有 相同变量名 的快捷键是&#xff1a; ✅ Shift F6&#xff08;重命名变量&#xff09; 但这个快捷键默认是 全局重命名&#xff0c;如果你想 仅修改某个方法或代码块内的变量名&#xff0c;可以这样做&#xff1a;&…

Telink BLE 低功耗学习

低功耗管理&#xff08;Low Power Management&#xff09;也可以称为功耗管理&#xff08;Power Management&#xff09;&#xff0c;本⽂档中会简称为PM。Telink低功耗解惑我查阅多连接SDK开发手册时&#xff0c;低功耗管理章节看了两三遍也没太明白&#xff0c;有以下几个问题…