【圖像質量評價指標】信噪比(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=10?log10?((S?T)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
英文地址,請注明出處:http://en.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;有以下幾個問題…