游乐游手机版
首页/AI教程/文章详情

图像去雾去雨去噪综合处理技术方法详解

时间:2026-06-08 15:25
图像去雨采用L0梯度最小化方法保留显著边缘、平滑雨痕,再经直方图调整提升对比度;图像去雾基于暗通道先验估计大气光和透射率,通过引导滤波优化透射图。处理后的图像输入目标检测与测距模型,精度明显提升,适用于极端环境下的自动驾驶。

先聊聊背景。许多同行在从事图像去雨、图像去雾等视觉任务时,常常面临同样的痛点——算法处理后要么过度平滑导致细节丢失,要么残留明显的雨痕或雾迹。此前我正好在该方向做了大量实践,现将完整的思路与代码整理成文,希望能为正在探索的你提供切实帮助。

图像去雨技术前言

从单张静态图像中去除雨滴,听起来似乎容易,实际操作却极具挑战。雨点覆盖的像素区域通常非常微小,这引发了一个核心难题——究竟应该处理哪些像素,哪些又应当完整保留?目前基于FFT的去雨方法虽然不少,但效果往往参差不齐。本文另辟蹊径,采用L0梯度最小化方法,专门针对雨像素进行去除,同时避免破坏图像中原本重要的边缘结构。

具体而言,该方案具备以下三大显著优势:

  1. L0最小化技术能够在全局尺度上控制图像中的非零梯度数量,它不会纠缠于局部微小变化,而是精准关注那些真正显著的边缘结构。
  2. 显著边缘得以完整保留,而低幅度的琐碎细节(例如雨痕)则被有效平滑。这正是实现高质量去雨的核心机制。
  3. 最后通过直方图调整技术,恢复去雨后的图像强度,从而获得更佳的对比度表现。实验验证表明,该流程在去除雨水方面具有显著效果。

去雨算法流程

去雨代码实现(MATLAB)

clear;
close all;
I=imread('youwutu.jpg'); %读入图像
R=I(:,:,1);% 取输入图像的R分量
[N1,M1]=size(R);
R0=double(R);% 对R分量进行数据转换,并对其取对数
Rlog=log(R0+1);
Rfft2=fft2(R0);% 对R分量进行二维傅里叶变换
sigma=250;% 形成高斯滤波函数
F = zeros(N1,M1);
for i=1:N1
    for j=1:M1
        F(i,j)=exp(-((i-N1/2)^2+(j-M1/2)^2)/(2*sigma*sigma));
    end
end
F=F./(sum(F(:)));
Ffft=fft2(double(F)); %对高斯滤波函数进行二维傅里叶变换
DR0=Rfft2.*Ffft;%对R分量与高斯滤波函数进行卷积运算
DR=ifft2(DR0);
DRdouble=double(DR); %在对数域中,用原图像减去低通滤波后的图像,得到高频增强图像
DRlog=log(DRdouble+1);
Rr=Rlog-DRlog;
G=I(:,:,2); % 取输入图像的G分量
[N1,M1]=size(G);
G0=double(G);%对G分量进行数据转换,并对其取对数
Glog = log(G0+1);
Gfft2=fft2(G0);%对G分量进行二维傅里叶变换
sigma=250;
for i=1:N1
    for j=1:M1
        F(i,j)=exp(-((i-N1/2)^2+(j-M1/2)^2)/(2*sigma*sigma));
    end
end
F = F./(sum(F(:)));
Ffft=fft2(double(F));%对高斯滤波函数进行二维傅里叶变换
DG0=Gfft2.*Ffft;%对高斯滤波函数进行二维傅里叶变换
DG=ifft2(DG0);
DGdouble=double(DG); %在对数域中,用原图像减去低通滤波后的图像,得到高频增强图像
DGlog=log(DGdouble+1);
Gg=Glog-DGlog;
EXPGg=exp(Gg); %取反对数,得到增强后的图像分量
MIN = min(min(EXPGg)); %对增强后的图像进行对比度拉伸增强
MAX = max(max(EXPGg));

去雨效果MATLAB实验结果

图像去雾技术

去雾算法原理概述

去雾技术的理论基础是暗通道先验理论。简而言之,在绝大多数非天空的局部区域中,至少有一个颜色通道上存在某些像素的值极低——意味着该区域的光照强度非常小。基于这一观察,我们可以对“暗通道”给出如下数学定义:对于任意输入图像J,其暗通道的计算公式为:

其中c代表彩色图像的各个通道,Ω(x)表示以像素x为中心的某个局部窗口区域。

暗通道图的计算步骤并不复杂:首先求出每个像素在三个颜色通道上的最小值,将其存储为一个二维矩阵(即灰度图),随后执行一次最小值滤波。滤波半径由所选窗口大小决定,窗口大小设为……相应的公式为:……其中r代表滤波半径。

关于暗通道先验为何成立,相关论文给出了以下几条合理阐述:

  • 汽车、建筑物、城市玻璃窗的阴影,以及树叶、树木、岩石等自然景观所形成的投影区域;
  • 色彩鲜艳的物体或表面——如绿色的草地、树木、植被,红色或黄色的花朵、叶片,以及蓝色的水面——这些物体在RGB三个通道中总有一个或两个通道的值非常低。

去雾代码实现

计算雾化图像的暗通道

def DarkChannel(img, size=15):
    """
    暗通道的计算主要分成两个步骤:
    1.获取BGR三个通道的最小值
    2.以一个窗口做MinFilter
    ps.这里窗口大小一般为15(radius为7)
    获取BGR三个通道的最小值就是遍历整个图像,取最小值即可
    """
    r, g, b = cv2.split(img)
    min_img = cv2.min(r, cv2.min(g, b))
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (size, size))
    dc_img = cv2.erode(min_img, kernel)
    return dc_img

估算全局大气光值

def GetAtmo(img, percent=0.001):
    """
    1.计算有雾图像的暗通道
    2.用一个Node的结构记录暗通道图像每个像素的位置和大小,放入list中
    3.对list进行降序排序
    4.按暗通道亮度前0.1%(用percent参数指定百分比)的位置,在原始有雾图像中查找最大光强值
    """
    mean_perpix = np.mean(img, axis=2).reshape(-1)
    mean_topper = mean_perpix[:int(img.shape[0] * img.shape[1] * percent)]
    return np.mean(mean_topper)

估算透射率图

def GetTrans(img, atom, w):
    """
    w为去雾程度,一般取0.95
    w的值越小,去雾效果越不明显
    """
    x = img / atom
    t = 1 - w * DarkChannel(x, 15)
    return t
    
def GuidedFilter(p, i, r, e):
    """
    :param p: input image
    :param i: guidance image
    :param r: radius
    :param e: regularization
    :return: filtering output q
    """
    # 1
    mean_I = cv2.boxFilter(i, cv2.CV_64F, (r, r))
    mean_p = cv2.boxFilter(p, cv2.CV_64F, (r, r))
    corr_I = cv2.boxFilter(i * i, cv2.CV_64F, (r, r))
    corr_Ip = cv2.boxFilter(i * p, cv2.CV_64F, (r, r))
    # 2
    var_I = corr_I - mean_I * mean_I
    cov_Ip = corr_Ip - mean_I * mean_p
    # 3
    a = cov_Ip / (var_I + e)
    b = mean_p - a * mean_I
    # 4
    mean_a = cv2.boxFilter(a, cv2.CV_64F, (r, r))
    mean_b = cv2.boxFilter(b, cv2.CV_64F, (r, r))
    # 5
    q = mean_a * i + mean_b
    return q

上述代码同样提供了Python版本实现。

去雾结果(MATLAB GUI交互展示)

总结与展望

本文所述方法仅是整个技术链条中的一个环节,其核心目的在于为目标检测及其他高级视觉应用奠定坚实基础。通过将所提算法与经典方法进行对比验证,实验结果表明:在极端恶劣环境下,本文的图像去雨去雾结合目标检测与测距方案具有良好的有效性和可行性。经过预处理的图像输入到目标检测和测距模型后,检测精度显著提升,从而为自动驾驶车辆的主动安全行为决策提供了必要的技术支撑,也使得自动驾驶汽车在极端环境下的安全运行成为可能。

来源:https://cloud.tencent.com.cn/developer/article/2683880
上一篇合成雨雾道路天气图像数据集与代码 下一篇AI Agent从聊天框迁移至本地工程流的可复用落地框架
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Kimi App手机电脑联动下载安装及浏览器兼容教程
AI教程 · 2026-06-09

Kimi App手机电脑联动下载安装及浏览器兼容教程

本文介绍了Kimi智能助手从手机端到电脑端的下载与安装方法,重点阐述了不同平台(包括iOS、Android、Windows、macOS)的获取途径。同时,详细说明了如何通过浏览器直接访问网页版,并针对主流浏览器的兼容性进行了分析,旨在帮助用户根据自身设备选择最便捷、稳定的使用方式。

HeyGen稳定安装步骤:先配置创意团队环境再注册开通
AI教程 · 2026-06-09

HeyGen稳定安装步骤:先配置创意团队环境再注册开通

HeyGen的稳定安装与高效使用,关键在于前期团队环境的统一规划与后期账号流程的顺畅完成。团队需明确设计规范、素材管理及权限分工,为工具运行打下基础。随后,通过官方渠道完成注册、验证及订阅开通,确保服务稳定。最后进行基础功能测试与团队培训,即可快速投入实际创作流程。

Mochi 1从零搭建本地服务与工作流导入指南
AI教程 · 2026-06-09

Mochi 1从零搭建本地服务与工作流导入指南

本文介绍了在成功完成Mochi1本地服务的基础搭建后,如何继续处理工作流导入这一关键后续步骤。内容涵盖工作流文件准备、导入操作的具体流程、常见问题的排查与解决,以及导入后的配置优化与测试验证,旨在帮助用户将预设的自动化流程顺利集成到本地环境中,确保工具发挥完整效能。

InvokeAI Linux用户安装配置与节点处理指南
AI教程 · 2026-06-09

InvokeAI Linux用户安装配置与节点处理指南

本文详细介绍了在Linux系统上安装和配置InvokeAI的完整流程。内容涵盖从环境准备、依赖安装到模型下载与加载的关键步骤,并重点解析了核心组件“处理节点”的安装与使用方法。指南旨在帮助用户顺利完成部署,并理解其工作流程,以便更好地利用这一AI图像生成工具进行创作。

Dify保姆级部署指南:服务安装与模型接入下载
AI教程 · 2026-06-09

Dify保姆级部署指南:服务安装与模型接入下载

本文详细介绍了开源AI应用开发平台Dify的部署流程。内容涵盖从服务器环境准备、Docker安装、Dify核心服务启动,到如何接入OpenAI、Azure等云端大模型API,以及如何配置Ollama等本地模型。最后,还提供了使用ModelScope社区下载特定模型文件并集成到本地环境中的具体操作方法,旨在帮助用户快速搭建属于自己的AI应用开发与测试平台。