紅外圖像增強(dde):基于“基礎層-細節層”分解的增強算法

1、引言

與可見光圖像相比,紅外熱成像捕捉的是物體表面的溫度分布,其原始數據(通常為12位或14位)包含了極寬的溫度動態范圍。然而,人眼能夠感知的灰度范圍以及顯示設備能夠展示的灰度級(通常為8位,即256級)都非常有限。這導致原始紅外圖像直接顯示時,往往呈現為一片灰蒙蒙的景象,目標與背景的溫差細節被壓縮,難以分辨。

傳統的直方圖均衡化(HE)算法雖然能提升全局對比度,但容易造成局部細節丟失或噪聲過度放大,并可能產生“光暈”偽影。為了解決這些問題,研究人員提出了一系列更精細的增強算法。其中,基于圖像分解的增強思想是一種非常有效的途徑,其核心理念是將圖像分解為代表大尺度變化的基礎層和代表局部細節的細節層,然后分別對它們進行優化,最后再融合以得到最終結果。這種方法可以有效地在壓縮動態范圍的同時,強化我們感興趣的細節信息。

2. 算法核心原理

該增強算法可以概括為三個主要階段:分解、處理和融合。

I o r i g i n a l → 分解 ( I b a s e , I d e t a i l ) → 處理 ( I b a s e ′ , I d e t a i l ′ ) → 融合 I e n h a n c e d I_{original} \xrightarrow{分解} (I_{base}, I_{detail}) \xrightarrow{處理} (I'_{base}, I'_{detail}) \xrightarrow{融合} I_{enhanced} Ioriginal?分解 ?(Ibase?,Idetail?)處理 ?(Ibase?,Idetail?)融合 ?Ienhanced?

1. 圖像分解 (Decomposition)

圖像可以被看作是低頻信息和高頻信息的疊加。

  • 基礎層 (Base Layer, I b a s e I_{base} Ibase?):代表了圖像的低頻分量,即圖像中大面積的、平緩變化的區域,它決定了圖像的整體輪廓和明暗分布。

  • 細節層 (Detail Layer, I d e t a i l I_{detail} Idetail?):代表了圖像的高頻分量,即圖像中的邊緣、紋理和噪聲等劇烈變化的部分。

我們的目標是從原始圖像 I o r i g i n a l I_{original} Ioriginal?中分離出這兩層。一個理想的提取基礎層的方法是,在平滑圖像的同時能夠保持邊緣信息,雙邊濾波器(Bilateral Filter) 正是實現這一目標的利器。它在計算像素值時,同時考慮了空間距離和像素值的相似性,因此可以在有效濾除噪聲的同時,最大程度地保留邊緣,避免了普通高斯模糊導致的邊緣模糊問題。

通過雙邊濾波,我們得到初步的基礎層:
I b a s e = BilateralFilter ( I o r i g i n a l ) I_{base} = \text{BilateralFilter}(I_{original}) Ibase?=BilateralFilter(Ioriginal?)
隨后,細節層可以通過原始圖像與基礎層(或其進一步平滑后的版本)相減得到:
I d e t a i l = I o r i g i n a l ? GaussianBlur ( I b a s e ) I_{detail} = I_{original} - \text{GaussianBlur}(I_{base}) Idetail?=Ioriginal??GaussianBlur(Ibase?)

2. 分層處理 (Processing)

分離出基礎層和細節層后,我們便可以“對癥下藥”:

  • 基礎層處理:基礎層包含了寬廣的動態范圍。我們的目標是壓縮這個動態范圍,使其適應8位顯示。這里我們不采用標準的全局直方圖均衡,而是采用一種改進的平臺直方圖均衡化方法。通過設置一個閾值,將直方圖中貢獻很小的部分(通常是噪聲或極端值)舍棄,然后對剩余的主要部分進行均衡化,這樣可以更穩定地提升主要場景的對比度,生成處理后的基礎層 I b a s e ′ I'_{base} Ibase?
  • 細節層處理:細節層包含了我們想要增強的紋理和邊緣。處理方法相對直接:對其進行非線性增益。為了防止噪聲被過度放大,通常會先對細節層的幅值進行裁剪(clip),即設置一個上下限,然后進行線性或非線性的放大,得到處理后的細節層 I d e t a i l ′ I'_{detail} Idetail?

3. 圖像融合 (Fusion)

最后一步,將處理后的基礎層和細節層重新相加,就得到了最終增強后的圖像。
I e n h a n c e d = I b a s e ′ + I d e t a i l ′ I_{enhanced} = I'_{base} + I'_{detail} Ienhanced?=Ibase?+Idetail?
由于 I b a s e ′ I'_{base} Ibase? I d e t a i l ′ I'_{detail} Idetail?的數值范圍可能已經不再是標準的圖像范圍,因此最后還需要一步歸一化操作,將整個圖像的像素值線性拉伸到 [0, 255] 區間,以便保存和顯示。

3、Python 代碼實現與解析

下面,我們通過一個具體的Python腳本來演示上述算法流程。

import cv2
import numpy as np
import osdef apply_decomposition_enhancement(input_path, output_path):"""一種基于“基礎層-細節層”分解的增強算法。Args:input_path (str): 輸入的16位TIF圖像文件路徑。output_path (str): 處理后要保存的8位圖像文件路徑。"""print("--- 開始運行'基礎層-細節層'分解增強算法 ---")# 0. 加載圖像并轉換為支持的浮點數類型print("步驟 0: 加載圖像并準備數據...")img_16bit = cv2.imread(input_path, cv2.IMREAD_UNCHANGED)if img_16bit is None:print(f"錯誤: 無法讀取圖像文件 '{input_path}'。")returnoriginal_img_f32 = img_16bit.astype(np.float32)height, width = original_img_f32.shape# --- 階段 1: 分解圖像 ---print("階段 1.1: 應用雙邊濾波獲取基礎層...")# d: 鄰域直徑, sigmaColor: 顏色空間標準差, sigmaSpace: 坐標空間標準差base_layer_bf = cv2.bilateralFilter(original_img_f32, d=9, sigmaColor=25, sigmaSpace=80)print("階段 1.2: 通過高斯模糊和相減提取細節層...")# 對基礎層再做一次輕微高斯模糊,以獲得更純凈的細節base_layer_gauss = cv2.GaussianBlur(base_layer_bf, (3, 3), 1)detail_layer = original_img_f32 - base_layer_gauss# --- 階段 2: 獨立處理圖層 ---print("階段 2.1: 對基礎層應用自定義直方圖均衡...")# 將基礎層轉回16位整型以計算直方圖hist_input = base_layer_bf.astype('uint16')# 計算一個裁剪閾值,忽略出現次數極少的像素值threshold = height * width * 0.0001hist, _ = np.histogram(hist_input.flatten(), bins=65536, range=[0, 65536])# 應用閾值,構建平臺直方圖hist[hist < threshold] = 0hist[hist >= threshold] = 1# 確定均衡化后的灰度級數n = int(np.sum(hist))if n > 255: n = 255 # 限制在8位范圍內# 計算累積分布函數(CDF)并創建查找表(LUT)cdf = np.cumsum(hist)if cdf.max() == 0:cdf_normalized = cdfelse:# 歸一化CDFcdf_normalized = cdf / float(cdf.max())lut = (n * cdf_normalized).astype('uint16')# 應用查找表,完成基礎層處理base_layer_processed = lut[hist_input]# 2.2 處理細節層print("階段 2.2: 裁剪并縮放細節層...")sigma_r = 25  # 細節裁剪范圍,一個可調參數# 將細節裁剪到 [-sigma_r, sigma_r] 范圍內detail_layer_clipped = np.clip(detail_layer, -sigma_r, sigma_r)# 將范圍平移到 [0, 2*sigma_r]detail_layer_scaled = detail_layer_clipped + sigma_r# --- 階段 3: 融合 ---print("階段 3: 融合處理后的基礎層和細節層...")final_image_f32 = base_layer_processed.astype(np.float32) + detail_layer_scaled# --- 最后: 歸一化并保存 ---print("最終處理: 歸一化到8位并保存...")# 使用MINMAX歸一化將最終圖像拉伸到[0, 255]范圍final_image_8bit = cv2.normalize(final_image_f32, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U)cv2.imwrite(output_path, final_image_8bit)print(f"結果已保存至: {os.path.abspath(output_path)}")if __name__ == '__main__':# 假設當前目錄下存在一個名為 'dde_test_image_16bit.tif' 的16位原始紅外圖像input_file = "dde_test_image_16bit.tif" output_file = "dde_test_image_processed.png"if not os.path.exists(input_file):print(f"錯誤: 輸入文件 '{input_file}' 不存在。請準備一張16位TIF格式的紅外圖像。")else:apply_decomposition_enhancement(input_file, output_file)

4. 效果演示

為了直觀地展示算法效果,您可以準備一張16位的TIF格式紅外原圖,運行上述代碼。下面是一個示例對比,上方為直接線性拉伸到8位的原圖,下方為經過我們算法增強后的圖像。
在這里插入圖片描述
在這里插入圖片描述

5、總結與展望

本文介紹了一種基于“基礎層-細節層”分解的紅外圖像增強算法。該方法通過雙邊濾波有效分離圖像的宏觀結構與局部細節,并對兩者采用不同的優化策略——對基礎層進行平臺直方圖均衡以壓縮動態范圍,對細節層進行增益控制以強化紋理——最終融合得到高質量的增強圖像。

所提供的Python代碼展示了該算法的完整流程。值得注意的是,算法的效果在很大程度上依賴于參數的選擇,例如雙邊濾波的sigmaColor、sigmaSpace,以及細節裁剪的sigma_r等。在實際應用中,這些參數需要根據具體的成像設備、場景內容和應用需求進行仔細的調優,甚至可以發展出自適應的參數選擇策略。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/86908.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/86908.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/86908.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java-day28-其他流

1. 緩沖流 昨天學習了基本的一些流&#xff0c;作為IO流的入門&#xff0c;今天我們要見識一些更強大的流。比如能夠高效讀寫的緩沖流&#xff0c;能夠轉換編碼的轉換流&#xff0c;能夠持久化存儲對象的序列化流等等。這些功能更為強大的流&#xff0c;都是在基本的流對象基礎…

S712001 開放式用戶通信

開放式用戶通信分類 TIA PORTAL 軟件內提供了以下指令&#xff1a; 不帶連接管理的通信指令 “TCON ” &#xff1a;建立以太網連接“TDISCON” &#xff1a;斷開以太網連接“TSEND” &#xff1a;TCP 和 ISO ON TCP 使用的發送數據“TRCV”&#xff1a; TCP 和 ISO ON TCP 使…

CSMatIO庫的安裝與C#實現.mat文件生成

一.CSMatIO介紹 CSMatIO 是一個用于讀寫 MATLAB .mat 文件的開源 C# 庫&#xff0c;它提供了簡單而高效的 API&#xff0c;使 .NET 應用程序能夠與 MATLAB 進行數據交換&#xff0c;支持讀取和寫入 MATLAB 的 .mat 文件&#xff08;版本 5 和 7.3&#xff09;&#xff0c;兼容…

設計一個interface (一)

好的&#xff0c;我來舉一個具體的例子&#xff0c;幫助你理解 interface、element、resource 和 architecture 之間的關系。 場景&#xff1a;設計一個用戶管理系統的接口 背景 假設我們正在設計一個用戶管理系統&#xff0c;系統中有兩個主要的模塊&#xff1a; 用戶服務模…

tomcat下載安裝

目錄 一.tomact簡介 二.詳細步驟 三.下載頁面詳解&#xff08;選看&#xff09; 一.tomact簡介 Tomcat是Apache軟件基金會下的一個核心項目&#xff0c;它是一個開源的Java Servlet和JSP容器。由Apache、Sun等公司及個人共同開發&#xff0c;由于Sun的參與&#xff0c;最新的…

Axure版AntDesign 元件庫-免費版

AntDesign 元件庫概述 一、AntDesign 元件庫概述 添加圖片注釋&#xff0c;不超過 140 字&#xff08;可選&#xff09; AntDesign 是螞蟻集團推出的企業級設計體系&#xff0c;在 Axure 中使用 AntDesign 元件庫&#xff0c;可幫助設計師快速搭建符合現代企業級產品標準的高…

MySQL鎖機制全解析

MYSQL存儲引擎支持的鎖 InnoDB支持行級鎖(row-level locking)和表級鎖,默認為行級鎖。MyISAM采用表級鎖(table-level locking) 鎖的基本分類 1. 按照鎖的使用方式 , Mysql的鎖大致分為共享鎖和排它鎖 a. 共享鎖(S) 共享鎖&#xff0c;Share lock&#xff0c;又稱為讀鎖&am…

圖解Git中Rebase與Merge的區別

文章目錄 前言理解基本概念&#x1f500; Git Merge&#xff1a;合并分支&#x1f504; Git Rebase&#xff1a;重寫歷史 可視化理解工作流程實際應用場景與示例場景1&#xff1a;團隊協作 - 使用Merge場景2&#xff1a;個人分支整理 - 使用Rebase沖突解決&#xff1a;兩種策略…

2 Qt中的空窗口外觀設置和常用的基礎部件

Widget空窗口 this->setWindowTitle("我的窗口");//設置窗口標題this->resize(500,300);//設置窗口大小this->setFixedSize(500,300);//設置固定大小&#xff08;無法拖拽&#xff09; 此時&#xff0c;窗口大小發生改變&#xff0c;且窗口名稱改變&#x…

常用 Python 編輯器

可以使用任何文本編輯器來編寫 Python 程序&#xff0c;只要遵循 Python 語法且保存為文件&#xff0c;程序都可以通過 python 命令運行。不過&#xff0c;使用功能豐富的專用編輯器會帶來更好的編程體驗。 當今最常用的幾個 Python 編輯器&#xff08;也稱 IDE 或代碼編輯器&a…

Java+Vue開發的電子采購管理系統,助力企業采購智能化,提升效率促發展

前言&#xff1a; 在當今數字化時代&#xff0c;企業采購管理面臨著提高效率、降低成本、增強透明度等諸多挑戰。傳統的采購模式往往存在流程繁瑣、信息傳遞不及時、管理難度大等問題。電子采購管理系統應運而生&#xff0c;它借助先進的互聯網技術和信息化手段&#xff0c;將…

嵌入式網絡通信與物聯網協議全解析:Wi-Fi、BLE、LoRa、ZigBee 實戰指南

來源&#xff1a;0voice/EmbeddedSoftwareLearn 一、為什么嵌入式一定要搞懂網絡通信&#xff1f; 在傳統的裸機或單機嵌入式項目里&#xff0c;我們習慣了“點燈、串口、IC/SPI、RTOS 多任務”這樣的套路。但當一個設備需要與云平臺、手機 App 或其他設備實時交互時&#xff…

【補充筆記●推薦方案】解決 Docker “open \.\pipe\docker_engine: Access is denied” 權限問題

starting services: initializing Docker API Proxy: setting up docker api proxy listener: open \\.\pipe\docker_engine: Access is denied.引言 【筆記】解決 WSL 遷移后 Docker 出現 “starting services: initializing Docker API Proxy: setting up docker ap” 問題-…

AI編程工具深度對比:騰訊云代碼助手CodeBuddy、Cursor與通義靈碼

騰訊云代碼助手 CodeBuddy 智能代碼補全&#xff1a;基于上下文和編輯行為預測代碼&#xff0c;支持行內補全、函數塊生成及注釋轉代碼&#xff0c;覆蓋200編程語言和框架&#xff0c;可減少70%以上的鍵盤輸入。Craft智能體&#xff1a;支持自然語言驅動的多文件協同開發&…

Redis 的集群

深入理解 Redis 的集群模式與高可用機制 Redis 是一款廣泛應用于高性能緩存與存儲系統的 NoSQL 數據庫。隨著業務的發展&#xff0c;如何提升 Redis 的高可用性和水平擴展能力成為架構設計的關鍵。本篇博客將系統講解 Redis 的不同集群模式及其高可用策略&#xff0c;深入剖析其…

基于Dify平臺構建AI應用

2022年底openAI的chatgpt的出現&#xff0c;讓人們看到生成式AI的能力如此強大&#xff0c;引燃了生成式AI的一波浪潮。2025年春節前&#xff0c;DeepSeek的橫空出世讓大模型這個領域變得人人都可以參與進來&#xff0c;生成式AI大模型不再有非常高的顯卡的門檻&#xff0c;普通…

Python tikinter實現打開指定ip的電腦攝像頭

以下是一個使用Python的tkinter和OpenCV庫實現打開指定IP攝像頭的應用程序。這個程序允許用戶輸入IP攝像頭的URL&#xff0c;并實時顯示攝像頭畫面&#xff0c;同時支持截圖和錄制功能。 登錄后復制 import tkinter as tk from tkinter import ttk, messagebox, filedialog imp…

OpenCV插值方法詳解:原理、應用與代碼實踐

一、引言 在數字圖像處理中&#xff0c;插值是一種基本且重要的技術&#xff0c;它廣泛應用于圖像縮放、旋轉、幾何變換等場景。OpenCV作為最流行的計算機視覺庫之一&#xff0c;提供了多種插值方法供開發者選擇。本文將全面介紹OpenCV中的插值技術&#xff0c;包括各種方法的…

創客匠人解析:身心靈賽道創始人 IP 打造核心策略

在當代社會焦慮情緒蔓延的背景下&#xff0c;身心靈賽道正以萬億級市場規模成為知識變現的新藍海。作為知識變現領域的重要參與者&#xff0c;創客匠人通過服務超 5W 知識博主的實踐經驗&#xff0c;揭示了該賽道中創始人 IP 打造的底層邏輯 ——IP 不僅是形象符號&#xff0c…

Rust 和C++工業機器人實踐

Rust 調用Cursor案例 Cursor 的這些功能可以顯著提升開發效率,減少重復勞動,適合個人開發者和團隊協作使用。 讀取文件內容并處理 使用Cursor讀取文件內容并逐行處理: use std::io::{Cursor, BufRead};let data = "Line 1\nLine 2\nLine 3".as_bytes(); let c…