【图像增强】基于matlab暗通道图像去雾【含Matlab源码 101期】
一、获取代码方式
获取代码方式1:
完整代码已上传我的资源:【图像增强】基于matlab暗通道图像去雾【含Matlab源码 101期】
获取代码方式2:
通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码。
备注:
订阅紫极神光博客付费专栏,可免费获得1份代码(有效期为订阅日起,三天内有效);
二、简介
1 暗通道先验图像去雾方法
1.1 光线透射率模型
光在传播中由于散射使得从光源发出的辐射只有部分能到达接收传感器,其他则被散射到传播介质中。假设距离较小时散射光强与距离是线性关系,当光源距离传感器无限接近时,光的衰减值可近似为:Br,其中β为空气的散射系数;r为光源与传感器间的距离。大气密度均匀时,光线透射率的数学模型为:
式中:D为场景深度;t为光线透射率,用于量化传感器接收光强与光源表面光强间的比例关系,即没有被散射的辐射与光源辐射间的比例关系。
1.2 暗通道先验理论
基于统计大量清晰图像得到的暗通道先验理论是指大部分不含天空的优质图像的所有像素在R,G,B这3个通道中最少存在一个颜色通道灰度值相当低以至趋近于0[5],也就是在一定的微小区域里最小辐射强度值极低。一幅图像J可定义为:
式中:J dark为图像J的暗通道值; J为图像J的c通道灰度值; Q(x) 为以像素x为中心的局部微小区域; y为区域内任一像素。
1.3 暗通道先验图像去雾处理
图像去雾的目标是将传感器接收到的有雾图像利用获得的有用信息通过去雾还原出清晰图像。暗通道先验图像去雾处理是根据暗通道原理获取先验知识,再利用有雾图像退化模型实现图像去雾效果。
1.3.1 图像退化模型
在计算机视觉图形学领域,有雾图像的退化模型为[6]:
式中:l(x)为传感器接收到的场景信号,即输入的有雾影像;场景辐射J(x)为信号处理后的清晰图像;A为环境光照强度;t(x)为大气透射率。J(x)t(x)称为直接衰减项,用来量化场景辐射和传播中的信号损失。A(1-t(x))表示图像接收到的大气散射光强,它是引起色彩偏移和云雾效果的直接原因。
1.3.2 估算环境光照强度
暗通道图像中灰度值越高的区域云雾越厚,在输入图像中位于这部分区域的]像素灰度值越接近于环境光照强度。估算环境光照强度首先需要找到暗通道图像中灰度值最高并占图像总像素数量01%的像素点,记录它们对应的坐标索引,然后根据坐标索引在输入的有雾图像中找到对应像素点,计算有雾图像中对应像素点的灰度平均值作为环境光照强度A。
1.3.3估算大气透射率
使用t’(x)表示以像素x为中心的滤波窗口内的大气透射率,假设它局部不变对式(3)最小值运算,分别计算R,G,B这3个颜色通道中的最小值,即
将3个颜色通道的最小值进行运算,可得出以像素x为中心的滤波窗口内的灰度最小值,即
根据暗通道先验原理和式(2)可以得出:
于是,由式(5)和式(6)计算出大气透射率为:
1.3.4 去雾处理
暗通道先验条件可用来量化云雾厚度和全部像素的辐射还原量,然后恢复出清晰优质的图像。通过式(3)的有雾图像退化模型和环境光照强度A、大气透射率t(x),可进行单幅图像去雾处理,即
2 暗通道先验算法去雾效果优化
本文优化流程如图1所示。当输入图像云雾不均时,其大气透射率图层的灰度信息仅处于有限范围内,而整张图像的辐射还原量将被限制在一定区间里,不能分别准确还原云雾厚薄区域的辐射强度,从而影响图像去雾效果,考虑利用拉伸大气透射率图层对比度的方法来改善云雾厚薄不均时基于暗通道先验得出的无雾图像质量。
图1 基于暗通道先验的图像去雾处理效果优化流程
三、部分源代码
**
%--------------------------------------
clc;
clear;
close all;%% -----------图像去雾算法----------------
%% 加载图片
img = imread('foggy_bench.jpg');
figure;imshow(img);title('雾图');
%% 去雾函数
De_img = anyuanse(img);
figure;imshow(De_img);title('去雾图');
%% 输出结果,分辨率300dpi并保存为tiff图片
imwrite(De_img,'1.tiff','tiff','Resolution',300);
function R = anyuanse(m_img)
% 原始图像win_dark=zeros(img_size ,1);for cc=1:img_sizewin_dark(cc)=1;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
win_dark=reshape(win_dark,h,w);
%计算分块深度darkchannelfor j=1+win_size:w-win_sizefor i=win_size+1:h-win_sizem_pos_min = min(I(i,j,:));for n=j-win_size:j+win_size for m=i-win_size:i+win_sizeif(win_dark(m,n)>m_pos_min)win_dark(m,n)=m_pos_min;endendendendend%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5%图像透射率预处理,深度图反相for cc=1:img_sizewin_dark(cc)=1-win_dark(cc);end%%%%%%%%%%%%%%%%%图像软抠图开始%%%%%%%%%%%%%%%%%%%%%%选定精确dark value坐标
win_b = zeros(img_size,1);for ci=1:hfor cj=1:wif(rem(ci-8,15)<1) %没有余数?if(rem(cj-8,15)<1)win_b(ci*w+cj)=win_dark(ci*w+cj);endendend
end%显示分块darkchannel
neb_size = 9;
win_size = 1;
epsilon = 0.0000001;
%指定矩阵形状
indsM=reshape([1:img_size],h,w);
%计算矩阵L
tlen = img_size*neb_size^2;
row_inds=zeros(tlen ,1);
col_inds=zeros(tlen,1);
vals=zeros(tlen,1);
len=0;
for j=1+win_size:w-win_sizefor i=win_size+1:h-win_sizeif(rem(ci-8,15)<1)if(rem(cj-8,15)<1)continue;endendwin_inds=indsM(i-win_size:i+win_size,j-win_size:j+win_size);win_inds=win_inds(:);%列显示winI=I(i-win_size:i+win_size,j-win_size:j+win_size,:);winI=reshape(winI,neb_size,c); %三个通道被拉平成为一个二维矩阵 3*9win_mu=mean(winI,1)'; %求每一列的均值 如果第二个参数为2 则为求每一行的均值 //矩阵变向量win_var=inv(winI'*winI/neb_size-win_mu*win_mu' +epsilon/neb_size*eye(c)); %求方差winI=winI-repmat(win_mu',neb_size,1);%求离差tvals=(1+winI*win_var*winI')/neb_size;% 求论文所指的矩阵Lrow_inds(1+len:neb_size^2+len)=reshape(repmat(win_inds,1,neb_size),...neb_size^2,1);col_inds(1+len:neb_size^2+len)=reshape(repmat(win_inds',neb_size,1),...neb_size^2,1);vals(1+len:neb_size^2+len)=tvals(:);len=len+neb_size^2;end
end vals=vals(1:len);
row_inds=row_inds(1:len);
col_inds=col_inds(1:len);
%创建稀疏矩阵
A=sparse(row_inds,col_inds,vals,img_size,img_size);
%求行的总和 sumA为列向量
sumA=sum(A,2);
%spdiags(sumA(:),0,img_size,img_size) 创建img_size大小的稀疏矩阵其元素是sumA中的列元素放在由0指定的对角线位置上。
A=spdiags(sumA(:),0,img_size,img_size)-A;%创建稀疏矩阵D=spdiags(win_b(:),0,img_size,img_size);lambda=1;x=(A+lambda*D)\(lambda*win_b(:).*win_b(:));%%%%%%%%%%%%%%%%%%%%%%%%%软图像抠图结束%%%%%%%%%%%%%%%55%去掉0-1范围以外的数alpha=max(min(reshape(x,h,w),1),0);%图像透射率A=220/255; %大气光没有去计算
%去雾for i=1:cfor j=1:hfor l=1:wdehaze(j,l,i)=(I(j,l,i)-A)/alpha(j,l)+A;endend
end
R = dehaze;function R = anyuanse(m_img)
% 原始图像
I=double(m_img)/255;% 获取图像大小
[h,w,c]=size(I);
win_size = 7;
img_size=w*h;
dehaze=zeros(img_size*c,1);
dehaze=reshape(dehaze,h,w,c);win_dark=zeros(img_size ,1);for cc=1:img_sizewin_dark(cc)=1;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
win_dark=reshape(win_dark,h,w);
%计算分块深度darkchannelfor j=1+win_size:w-win_sizefor i=win_size+1:h-win_sizem_pos_min = min(I(i,j,:));for n=j-win_size:j+win_size for m=i-win_size:i+win_sizeif(win_dark(m,n)>m_pos_min)win_dark(m,n)=m_pos_min;endendendendend%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5%图像透射率预处理,深度图反相for cc=1:img_sizewin_dark(cc)=1-win_dark(cc);end%%%%%%%%%%%%%%%%%图像软抠图开始%%%%%%%%%%%%%%%%%%%%%%选定精确dark value坐标
win_b = zeros(img_size,1);for ci=1:hfor cj=1:wif(rem(ci-8,15)<1) %没有余数?if(rem(cj-8,15)<1)win_b(ci*w+cj)=win_dark(ci*w+cj);endendend
end%显示分块darkchannel
neb_size = 9;
win_size = 1;
epsilon = 0.0000001;
%指定矩阵形状
indsM=reshape([1:img_size],h,w);
%计算矩阵L
tlen = img_size*neb_size^2;
row_inds=zeros(tlen ,1);
col_inds=zeros(tlen,1);
vals=zeros(tlen,1);
len=0;
for j=1+win_size:w-win_sizefor i=win_size+1:h-win_sizeif(rem(ci-8,15)<1)if(rem(cj-8,15)<1)continue;endendwin_inds=indsM(i-win_size:i+win_size,j-win_size:j+win_size);win_inds=win_inds(:);%列显示winI=I(i-win_size:i+win_size,j-win_size:j+win_size,:);winI=reshape(winI,neb_size,c); %三个通道被拉平成为一个二维矩阵 3*9win_mu=mean(winI,1)'; %求每一列的均值 如果第二个参数为2 则为求每一行的均值 //矩阵变向量win_var=inv(winI'*winI/neb_size-win_mu*win_mu' +epsilon/neb_size*eye(c)); %求方差winI=winI-repmat(win_mu',neb_size,1);%求离差tvals=(1+winI*win_var*winI')/neb_size;% 求论文所指的矩阵Lrow_inds(1+len:neb_size^2+len)=reshape(repmat(win_inds,1,neb_size),...neb_size^2,1);col_inds(1+len:neb_size^2+len)=reshape(repmat(win_inds',neb_size,1),...neb_size^2,1);vals(1+len:neb_size^2+len)=tvals(:);len=len+neb_size^2;end
end R = dehaze;**
四、运行结果
**
五、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.
【图像增强】基于matlab暗通道图像去雾【含Matlab源码 101期】相关推荐
- 基于Matlab暗通道图像去雾处理
基于Matlab暗通道图像去雾处理 一.简介 何恺明的暗通道先验( dark channel prior)去雾算法是CV界去雾领域很有名的算法,关于该算法的论文"Single lmage H ...
- Python基于OpenCV的图像去雾算法[完整源码&部署教程]
1.图片识别 2.视频展示 [项目分享]Python基于OpenCV的图像去雾算法[完整源码&部署教程]_哔哩哔哩_bilibili 3.算法原理 图像增强算法常见于对图像的亮度.对比度.饱和 ...
- 【Matlab图像融合】小波变换遥感图像融合【含GUI源码 744期】
一.代码运行视频(哔哩哔哩) [Matlab图像融合]小波变换遥感图像融合[含GUI源码 744期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 包子阳,余 ...
- Python暗通道图像去雾
何凯明的经典图像去雾算法,直接上代码啦,理论后续讲解哈~ Python代码如下: #!/usr/bin/env python # -*- coding: utf-8 -*- from PIL impo ...
- c++ opencv编程实现暗通道图像去雾算法_OpenCV图像处理专栏十五 |一种基于亮度均衡的图像阈值分割技术...
前言 对于光照不均匀的图像,用通常的图像分割方法不能取得满意的效果.为了解决这个问题,论文<一种基于亮度均衡的图像阈值分割技术>提出了一种实用而简便的图像分割方法.该方法针对图像中不同亮度 ...
- c++ opencv编程实现暗通道图像去雾算法_OpenCV图像处理专栏十三 | 利用多尺度融合提升图像细节...
前言 今天为大家介绍一个利用多尺度来提升图像细节的算法.这个算法来自于论文<DARK IMAGE ENHANCEMENT BASED ON PAIRWISE TARGET CONTRAST AN ...
- 【MATLAB图像处理实用案例详解(1)】—— 基于直方图优化的图像去雾技术
目录 一.背景意义 二.理论基础 2.1 空域图像増强 2.2 直方图均衡化 三.方法选择 3.1 全局直方图算法 3.2 局部直方图算法 3.3 Retinex算法 四.效果演示 五.完整代码 一. ...
- 图像去雾算法--暗通道先验去雾算法
图像去雾: 在雾天拍摄的图像容易受雾或霾的影响,导致图片细节模糊.对比度低以至于丢失图像重要信息,为解决此类问题图像去雾算法应运而生.图像去雾算法是以满足特定场景需求.突出图片细节并增强图片质量为目的 ...
- 一种基于卷积神经网络的图像去雾研究-含matlab代码
目录 一.绪论 二.去雾卷积网络 2.1 特征提取 2.2 多尺度映射 2.3 局部均值 2.4 非线性回归 三.实验与分析 四.Matlab代码获取 一.绪论 雾是一种常见的大气现象,空气中悬浮的水 ...
- [Python图像识别] 四十六.图像预处理之图像去雾详解(ACE算法和暗通道先验去雾算法)
该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...
最新文章
- Java Web整合开发(42) -- Petstore
- android将拦截短信通过邮箱发送,网易邮箱Android客户端推出 加速布局移动互联网...
- web前端数组处理之数组去重
- Xtrabackup的“流”及“备份压缩”功能
- QSlider QLCDNumber 最常用的函数和 信号槽 (以后用到在加)
- R语言第四讲 之R语言数据类型
- Java 获取文件的上级目录
- pandas入门(2)
- oracle什么时候使用静态监听,Oracle监听之动态监听与静态监听特点
- TensorFlow by Google Machine Learning Foundations: Ep #8 - Tokenization for Natural Language Process
- 第一个JAVA实战项目!
- python爬取同花顺_python 同花顺
- 怎样停止魅族系统的推送服务器,实测可行!如何关闭魅族flyme系统的自带应用推送-魅蓝屏蔽设置...
- SpringBoot+支付宝支付(沙箱)
- 电脑安装android2.0,应用多开 这才是最适用电脑的安卓—凤凰系统2.0
- NFS4.1规范研究:session
- 获取选中状态复选框的值并添加id
- hdu 4607 Park Visit(树上最长链)
- 杰米棋牌开发商打造经典棋牌游戏
- Java Web之Ajax
热门文章
- python实现推荐系统(一)
- 解决@media screen (自适应)IE浏览器不兼容问题
- iphone 开发设置tableview 初始位置。
- 20200708每日一句
- 190707每日一句,一堂重要的人生之课Let it go, 穷则变变则通
- 计算机和机械交叉学科会议期刊,机器视觉相关的研究团队
- Atitit layout art 布局的艺术目录1. SpringLayout 类 弹簧布局管理器 12. BoxLayout( html默认布局) 11.SpringLayout
- Atitit.词法分析的理论原理 part2
- atitit.二维码生成总结java zxing
- paip.广告过滤系统 php 实现