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=IoriginalGaussianBlur(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…