【图像去雾】基于多尺度引导过滤的实时图像和视频去雾(Matlab实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码实现


💥1 概述

一、引言

在户外拍摄的图像和视频常常受到雾气的影响,导致画面清晰度下降、色彩暗淡、对比度降低,细节信息大量丢失,这不仅严重影响视觉观感,还限制了其在诸多领域的应用,如安防监控、智能交通、遥感测绘以及户外摄影等。基于多尺度引导过滤的实时图像和视频去雾技术应运而生,旨在高效、精准地还原雾气笼罩下的清晰场景,为后续的图像分析、目标识别与视频处理提供高质量的素材。

二、雾气形成原理与降质模型

雾气是由悬浮在空气中的微小水滴或冰晶组成,光线在穿过雾气时会发生散射、吸收等复杂光学现象。在图像形成过程中,雾气使得场景辐射度发生改变,进而可以用大气散射模型来描述雾天图像的降质过程,理解这一模型是后续去雾算法设计的关键基础。

三、多尺度引导过滤原理

1. 引导图像滤波:引导图像滤波(Guided Image Filtering,GIF)是一种基于局部线性模型的边缘保持滤波技术。它利用一幅引导图像的结构信息来对目标图像进行滤波处理,使得滤波后的目标图像既能去除噪声、平滑区域,又能很好地保留边缘细节。其核心思想是假设滤波输出在局部窗口内与引导图像呈线性关系,通过最小化代价函数求解线性系数,进而得到滤波结果。 2. 多尺度策略:引入多尺度分析是为了更好地应对不同尺寸、不同频率的雾气成分。在基于多尺度引导过滤的去雾方法中,将输入的雾天图像分解为多个尺度,例如通过高斯金字塔等方法构建不同分辨率的图像层。在每个尺度上分别应用引导图像滤波,低尺度图像能够捕捉到图像的大致轮廓和低频信息,对大区域的雾气进行初步估计与去除;高尺度图像聚焦于细节恢复,利用引导滤波精准地还原边缘和纹理等高频细节,各尺度处理结果再进行融合,充分发挥不同尺度的优势,以实现更全面、精准的去雾效果。

四、算法实现步骤

1. 大气光值估计:一般选取雾天图像中亮度值较高的像素点,通过一定的统计方法,如排序选取最亮的一定比例像素,计算其平均亮度作为大气光值A。这一步骤的准确性对后续透射率估计与最终去雾效果影响较大。 2. 透射率初步估计:基于大气散射模型,利用估计出的大气光值,对雾天图像进行简单变换,初步得到透射率的粗估计值t0(x)。 3. 多尺度引导滤波细化透射率:将雾天图像与初步估计的透射率分别构建多尺度表示,在每个尺度上以雾天图像为引导图像,对透射率粗估计值进行引导滤波细化,得到不同尺度下更为精准的透射率估计值ti(x),其中i表示不同尺度。

五、优势与应用前景

1. 优势:去雾效果好:通过多尺度分析与引导滤波相结合,既能有效去除雾气,又能精细还原图像和视频的细节、纹理与色彩,视觉效果接近自然场景。实时性强:上述的优化措施使得该技术能够在较短时间内处理一帧图像或视频片段,满足安防监控、无人驾驶等对实时性要求苛刻的应用场景。适应性广:对不同浓度、不同类型的雾气均有较好的处理能力,无论是薄霭还是浓雾,都能实现较为理想的去雾效果。 2. 应用前景:智能安防:在监控摄像头拍摄的视频中实时去除雾气,使安保人员能清晰识别潜在威胁,如可疑人员、车辆等,提升安防效率。自动驾驶:为自动驾驶车辆的视觉系统提供清晰的路况图像,辅助车辆准确感知周围环境,及时避开障碍物,保障行车安全。 遥感与测绘:处理受云雾影响的遥感影像,获取更准确的地表信息,用于土地利用监测、地理信息更新等。户外直播与摄影:让主播和摄影师在雾天也能拍摄出高质量的视频和照片,提升观众的观看体验与作品艺术价值。

六、挑战与改进方向

1. 挑战:复杂场景适应性有限:在一些存在强光反射、大面积相似纹理或运动物体的复杂场景下,算法可能出现误判,导致去雾效果不佳,如将水面反光误当作雾气处理,或运动物体边缘模糊。 计算资源需求仍较高:尽管采取了优化措施,对于高分辨率、高帧率的视频去雾,特别是在资源有限的嵌入式设备上,计算资源的消耗仍是一个瓶颈。 2. 改进方向:场景感知与自适应调整:引入更多的场景分析模块,能够自动识别复杂场景类型,动态调整算法参数,如透射率估计策略、滤波尺度等,提高算法适应性。轻量化算法设计:进一步研究如何在保证去雾效果的前提下,精简算法结构,降低对计算资源的依赖,开发适用于移动端、嵌入式系统等低功耗设备的去雾算法。

七、结论

基于多尺度引导过滤的实时图像和视频去雾技术为雾天视觉信息处理提供了强有力的手段,在多个领域展现出巨大的应用潜力。尽管目前还面临一些挑战,但随着算法的不断改进与硬件技术的协同发展,有望实现更高效、更智能的去雾处理,推动相关产业的进步与创新。

📚2 运行结果

部分代码:

clc;clear

addpath('Code/') 

%% Parameters
ST = 1;
threshold = 0.05;

r1 =[360 640];
r0 = [720 1280];

r = 16;
rr = 1;
hei = 36;
wid = 64;

N = boxfilter(ones(hei,wid), r);
NN = boxfilter(ones(hei, wid), rr); % the size of each local patch; N=(2r+1)^2 except for boundary pixels.

time = 0;
nFrames = 1;

%% Load video
path = 'Data/Ship_input/';
video_path = dir(fullfile(path, '*.png'));

save_path = 'Output/Ship_proposed/';

%% Read Frame
RGB0 = imread(fullfile(path, video_path(1).name));
% RGB0 = imresize(RGB0, r0, 'bilinear');

tic;
RGB0 = im2double(RGB0);
I0 = rgb2gray(RGB0);
I1 = impyramid(I0,'reduce');
I2 = impyramid(I1,'reduce');
I3 = impyramid(I2, 'reduce');

I_previous = I0;

%% Initilialized results
gamma = 1.0;

[I_initial, t0_rough, A]  = pyramid_dehazing(RGB0, I0, I1, I2, threshold, ST, gamma);

imwrite(I_initial, strcat(save_path, video_path(1).name));

time = time + toc;
nFrames=nFrames+1;
subplot(1,2,1);imshow(RGB0);title('Input');
subplot(1,2,2);imshow(I_initial);title('Output');
drawnow;

%% Process full-video

for ii = 2 : length(video_path)
    RGB0 = imread(fullfile(path, video_path(ii).name));
%     RGB0 = imresize(RGB0, r0, 'bilinear');
        
    tic;
    RGB0 = im2double(RGB0);
    I0 = rgb2gray(RGB0);
    
    I1 = impyramid(I0,'reduce');
    I2 = impyramid(I1,'reduce');
    I3 = impyramid(I2, 'reduce');
    
    
    %% Temporal coherence
    diff = (I0 * 255.0 - I_previous * 255.0).^2;

    w = exp(-1 * diff / 100);
    w = mean(w(:));
       
    t0_previous = t0_rough;
    I_previous = I0;

    if w >= 0.85
        t0 = fast_gradient_2(I0, t0_previous, N, NN);
        t0 = max(t0, 0.05);
        
        result_previous = (RGB0 - A)./ t0 + A;
        
        result = result_previous;
    else
        I_dv = get_size_image_i(I2, threshold, ST);
        [u,v]=size(I_dv);
        A0 = mean(maxk(I_dv(:),round(u * v * 0.05)));
        A0 = min(A0, 0.99);
        A = (1 - w) * A0 + w * A;
        
        if w < 0.5
            [result, t0_rough] = pyramid_dehazing_w_A(RGB0, I0, I1, I2, A, gamma);
        else
            t0 = fast_gradient_2(I0, t0_previous, N, NN);
            t0 = max(t0, 0.05);

            result_previous = (RGB0 - A)./ t0 + A;

            result = result_previous;
        end
    end
              
    nFrames=nFrames+1;
    time=time+toc;
    
    imwrite(result, strcat(save_path, video_path(ii).name));

🎉3 参考文献

文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。

[1]李波,胡红萍,杨正民.基于超像素分割的暗通道先验图像去雾算法[J/OL].测试技术学报,1-9[2025-03-28].http://kns.cnki.net/kcms/detail/14.1301.TP.20250320.1406.005.html.

[2]姚兆汝,孙航,任东,等.双向映射与物理负相关的航空图像去雾算法[J/OL].航空学报,1-13[2025-03-28].http://kns.cnki.net/kcms/detail/11.1929.V.20250319.1113.008.html.

🌈4 Matlab代码实现

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值