图像去雾/图像去雨(matlab/python)

简介: 图像去雾/图像去雨(matlab/python)

看到许多小伙伴想进行图像去雨,图像去雾的任务,由于以前进行了此类项目,所以在此书写博客进行交流。

代码获取


去雨前言


从静止图像中去除雨水是一项复杂且具有挑战性的任务。雨滴仅影响图像的很小区域,因此导致确定应考虑哪个区域和不应考虑哪个区域的混乱。在本文中,已经实现了一种新技术,该技术有效地使用L0梯度最小化方法来去除雨像素。


最小化技术可以全局控制图像中产生多少非零梯度。该方法与局部特征无关,而是全局定位重要边缘。保留了这些显着的边缘,并且减少了低振幅和微不足道的细节。以这种方式去除雨像素。最后,使用直方图调整技术增强了雨水去除的图像的强度,以获得更好的对比度图像。实验结果表明,该算法在去除图像去雨方面有良好的效果。


算法流程


ee5266759fa796b9006a9703ce075575_56f5db9fff8c4bc89209600f9c341bc8.png


去雨代码部分


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));
EXPGg = (EXPGg-MIN)/(MAX-MIN); EXPGg=adapthisteq(EXPGg);
B=I(:,:,3);  %取输入图像的B分量
[N1,M1]=size(B);
B0=double(B);  %对B分量进行数据转换,并对其取对数
Blog=log(B0+1);
Bfft2=fft2(B0);  %对B分量进行二维傅里叶变换
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


去雨结果 matlab 展示


67b588c88bd02d5ac04adcff6a37de1d_246e21e03e8e479a8203ecf4cd8037da.png


7ce1bd09d2645dc10b352f8eb4fe5d65_7670942d00684648ba5f2d63a33ce62e.jpeg


770de4e6d68a3c031afe354c792ac2da_2c66287848014f2c9f029b67118840b8.jpeg


35e62a7384dc939078d7a5ad2a5ae69a_b8ffb0a486754b36b1f65e97ed1a813e.png


图像去雾


去雾概述


暗通道先验:首先说在绝大多数非天空的局部区域里,某一些像素总会有至少一个颜色通道具有很低的值,也就是说该区域光强是一个很小的值。所以给暗通道下了个数学定义,对于任何输入的图像J,其暗通道可以用下面的公式来表示:图片其中表示彩色图像每个通道,表示以像素X为中心的一个窗口。要求暗通道的图像是比较容易的,先求出每个像素在3个通道的最小值,存到一个二维Mat中(灰度图),然后做一个最小值滤波,滤波的半径由窗口大小决定,这里窗口大小为,公式表示为,其中表示滤波半径。

图片暗通道先验理论得出的结论,这个我不知道如何证明,不过论文给出了几个原因:

a)汽车、建筑物和城市中玻璃窗户的阴影,或者是树叶、树与岩石等自然景观的投影;

b)色彩鲜艳的物体或表面,在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


#  去雾结果 matlab GUI交互展示:
![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/e08f283e7c6e413c8371b061b76be191.png)
![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/11613eb2945445b49793e3091c1cdc6e.png)
# 结论
**本文只是众多流程的一部分,为目标检测 和其他应用奠定举出。**
**通过将所提算法与经典算法进行验证对比,结果表明本文极端环境下的目标
检测与测距方法具有良好的有效性和可行性。
将处理后的图像输送到目标检测和测距模型,提高了目标检测和测距精度,为自动驾驶主动安全行为决策提供必要的技术支持,使得自动驾驶汽车应用在极端环境变得可行。**
**若果觉得有用的话,请帮忙点赞,也可以私信交流。**
**代码获取**:[全部代码](https://qm.qq.com/cgi-bin/qm/qr?k=-l5P6oI7YkOydUdSszfdHn2qQPBNWfhP&noverify=0&personal_qrcode_source=4)

相关文章
|
1月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
192 0
|
2月前
|
机器学习/深度学习 编解码 并行计算
【改进引导滤波器】各向异性引导滤波器,利用加权平均来实现最大扩散,同时保持图像中的强边缘,实现强各向异性滤波,同时保持原始引导滤波器的低低计算成本(Matlab代码实现)
【改进引导滤波器】各向异性引导滤波器,利用加权平均来实现最大扩散,同时保持图像中的强边缘,实现强各向异性滤波,同时保持原始引导滤波器的低低计算成本(Matlab代码实现)
200 8
|
1月前
|
算法 定位技术 计算机视觉
【水下图像增强】基于波长补偿与去雾的水下图像增强研究(Matlab代码实现)
【水下图像增强】基于波长补偿与去雾的水下图像增强研究(Matlab代码实现)
104 0
|
1月前
|
算法 机器人 计算机视觉
【图像处理】水下图像增强的颜色平衡与融合技术研究(Matlab代码实现)
【图像处理】水下图像增强的颜色平衡与融合技术研究(Matlab代码实现)
|
2月前
|
机器学习/深度学习 编解码 算法
【GUI】通过Hough变换在SEM显微图像上检测滑移线研究(Matlab代码实现)
【GUI】通过Hough变换在SEM显微图像上检测滑移线研究(Matlab代码实现)
141 0
|
1月前
|
机器学习/深度学习 算法 自动驾驶
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
146 8
|
2月前
|
机器学习/深度学习 算法 安全
【图像处理】使用四树分割和直方图移动的可逆图像数据隐藏(Matlab代码实现)
【图像处理】使用四树分割和直方图移动的可逆图像数据隐藏(Matlab代码实现)
159 2
|
2月前
|
机器学习/深度学习 编解码 数据可视化
【能量算子】评估 EEG 中的瞬时能量:非负、频率加权能量算子(Python&Matlab代码实现)
【能量算子】评估 EEG 中的瞬时能量:非负、频率加权能量算子(Python&Matlab代码实现)
|
2月前
|
机器学习/深度学习 编解码 算法
【图像处理】图像的边缘检测(Matlab代码实现)
【图像处理】图像的边缘检测(Matlab代码实现)
212 1
|
2月前
|
传感器 机器学习/深度学习 编解码
使用显著性检测的可见光和红外图像的两尺度图像融合(Matlab代码实现)
使用显著性检测的可见光和红外图像的两尺度图像融合(Matlab代码实现)
126 3

推荐镜像

更多
下一篇
oss云网关配置