1. 图像去雾技术概述
作为一名计算机视觉工程师,我经常需要处理各种恶劣天气条件下的图像增强问题。其中雾霾天气导致的图像质量下降尤为常见——画面发白、对比度降低、细节丢失,就像隔着毛玻璃看世界。今天我要分享三种在MATLAB中实现的主流去雾算法,从传统方法到深度学习方案,都是经过我实际项目验证的可靠方案。
图像去雾的核心挑战在于如何从单张输入图像中估计出雾的分布并逆向恢复清晰图像。这本质上是一个病态问题,因为我们需要从二维观测数据中恢复三维场景信息。目前主流方法主要分为三类:基于物理模型的方法(如暗通道先验)、基于图像增强的方法(如Retinex理论)和基于深度学习的方法。每种方法各有优劣,适用于不同场景。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 暗通道去雾法实现详解
2.1 算法原理与理论基础
暗通道先验是2009年何恺明提出的经典去雾算法,其核心观察非常直观:在无雾的自然图像中,绝大多数局部区域(如15×15像素块)至少有一个颜色通道(R、G或B)的某些像素值非常低,甚至接近于零。这个现象被称为暗通道先验。
数学上表示为:
code复制J_dark(x) = min_{c∈{r,g,b}}( min_{y∈Ω(x)}( J^c(y) ) ) → 0
其中J是清晰图像,Ω(x)是以x为中心的局部区域。
在雾天图像中,由于大气散射效应,这个先验不再成立。我们可以利用这个特性来估计雾的浓度分布。算法流程主要包含四个步骤:暗通道计算、大气光估计、透射率估计和图像恢复。
2.2 MATLAB实现细节
首先实现暗通道计算函数:
matlab复制function dark = dark_channel(img, patch_size)
% 输入校验
if nargin < 2
patch_size = 15; % 默认15x15窗口
end
if mod(patch_size, 2) == 0
patch_size = patch_size + 1; % 确保为奇数
end
% 取RGB三通道最小值
min_rgb = min(img, [], 3);
% 局部最小值滤波(比imfilter更快)
dark = ordfilt2(min_rgb, 1, ones(patch_size));
end
实际使用中发现几个关键点:
- 窗口大小建议15-25像素,太小会导致透射率估计噪声大,太大会丢失细节
- 使用ordfilt2比imfilter快3倍以上,特别是处理大图时
- 输入图像应为double类型且范围在[0,1]
大气光估计通常取暗通道最亮的前0.1%像素的平均值:
matlab复制function A = estimate_atmospheric_light(img, dark)
[h, w] = size(dark);
num_pix
