基于暗通道的去雾算法Dark Prior的Matlab实现

基于暗通道的去雾算法Dark Prior的Matlab实现

Dark Prior算法简介

Dark Prior算法是由何凯明博士于2009年提出的一种图像去雾处理的算法,其主要特点是利用图像的暗通道(Dark Channel)来估计影像的球大气光成分A以及透射率t(x)根据如下公式来还原影像:
I ( z ) = J ( x ) t ( x ) + A ( 1 − t ( x ) ) . I(z) = J(x)t(x)+A(1-t(x)). I(z)=J(x)t(x)+A(1t(x)).
其中,I(x)就是有雾的影像,而J(x)则是我们的目标影像。具体的原理我主要参考的这边博文:DarkPrior原理
其实,里面博主已经给出了他的Dark Prior的代码,但是有点复杂,我没看太懂,就按照他分析的原理自己用matlab写了个代码。反正亲测是可以用的。主要是帮助那些和我一样渴望学习的小白了解一下算法过程的。我用前面那篇博文的博主的图片试了一下,感觉还可以,就是树那幅有点奇怪。另外,那个博主算A的时候是取的窗口内平均值,而不是作者说的最大值,我两个都试了一下,觉得最大值的好一点,反正我代码里面两个都有,大家试验的时候去掉注释就行。另外,本人小白一个,编程能力有限,代码没优化过的,有点慢,还请见谅。
代码:

function darkprior()
w=15;% 窗口宽度,可自己调整
[filename,pathname]=uigetfile({
   '*.png';'*.jpg'},'选择图片');
I=double(imread([pathname,filename]))/255;
figure,subplot(2,2,1),imshow(I,[]);title('原始影像');
I2=zerowith(I,w);%延拓
图像去雾是一种常见的图像增强技术,主要用于消除图像中的雾霾或雾气,提高图像的清晰度和质量。在这里,我将为您介绍一种基于Matlab的图像去雾算法,并附上Matlab实现源代码。 1. 去雾算法原理 去雾算法的基本原理是通过对图像中的颜色和亮度进行调整,减少雾气对图像的影响。去雾算法通常分为两个步骤:1)估计图像中的雾霾密度;2)根据雾霾密度来消除雾霾。 在本文中,我们将介绍Dark Channel Prior去雾算法,它是一种常见且有效的去雾算法。该算法基于图像的暗通道原理,通过计算图像每个像素点的最小值来估计雾霾密度,并使用该密度来消除雾霾。 2. Dark Channel Prior算法流程 Dark Channel Prior去雾算法主要包括以下步骤: (1)计算每个像素点的暗通道值 (2)估计全局雾霾密度 (3)根据雾霾密度和大气光值来消除雾霾 具体实现方法如下: (1)计算每个像素点的暗通道暗通道是指图像中每个像素点在所有颜色通道中的最小值。通过计算每个像素点的暗通道值,我们可以确定这个像素点受到雾霾影响的程度。 (2)估计全局雾霾密度 全局雾霾密度可以通过暗通道值计算得到。我们可以选择一定数量的像素点,并计算它们的暗通道值的平均值来估计全局雾霾密度。 (3)根据雾霾密度和大气光值来消除雾霾 根据估计的雾霾密度和大气光值,我们可以计算每个像素点的透射率,并使用透射率来消除雾霾。 完整的Dark Channel Prior去雾算法实现流程如下: 1. 对输入图像进行预处理,包括图像调整、颜色空间转换等操作。 2. 计算每个像素点的暗通道值,即对每个像素点的RGB值取最小值。 3. 估计全局雾霾密度,即对暗通道图像取前1%的像素点的平均值。 4. 估计大气光值,即对原始图像中具有最高亮度的像素点进行计算。 5. 计算每个像素点的透射率,即根据估计的雾霾密度和大气光值计算。 6. 根据透射率和原始图像计算去雾图像。 3. Matlab实现代码 下面是基于Matlab实现Dark Channel Prior去雾算法代码: ```matlab function dehazed_img = dark_channel_prior(img, omega, t0) % 参数说明: % img:输入待去雾图像 % omega:透射率权值系数,默认为0.95 % t0:透射率阈值,默认为0.1 % 调整图像大小和颜色空间 img = im2double(imresize(img, 0.25)); img_dark = min(img, [], 3); img_hsv = rgb2hsv(img); % 计算暗通道图像 dark_channel = get_dark_channel(img_dark, 15); % 估计全局雾霾密度 atmospheric_light = get_atmospheric_light(dark_channel, img, omega, t0); % 计算透射率 transmission = get_transmission(img_dark, atmospheric_light, omega, t0); % 计算去雾图像 dehazed_img = zeros(size(img)); for i = 1:3 dehazed_img(:,:,i) = (img(:,:,i) - atmospheric_light(i)) ./ max(transmission, 0.1) + atmospheric_light(i); end % 对去雾图像进行颜色空间转换和大小调整 dehazed_img = hsv2rgb(img_hsv(:,:,1), img_hsv(:,:,2), imresize(transmission, size(img(:,:,1)))) .* (1 - imresize(transmission, size(img))) + dehazed_img; dehazed_img = imresize(dehazed_img, 4); dehazed_img = im2uint8(dehazed_img); % 计算暗通道图像 function dark_channel = get_dark_channel(img, patch_size) img_min = ordfilt2(img, 1, ones(patch_size, patch_size), 'symmetric'); dark_channel = img_min; end % 估计全局雾霾密度 function atmospheric_light = get_atmospheric_light(dark_channel, img, omega, t0) [height, width] = size(dark_channel); num_pixels = height * width; num_sample_pixels = floor(num_pixels * omega); [~, indices] = sort(dark_channel(:), 'descend'); indices = indices(1:num_sample_pixels); atmospheric_light = zeros(3, 1); for i = 1:3 atmospheric_light(i) = max(img(:,:,i)(indices)); end end % 计算透射率 function transmission = get_transmission(img_dark, atmospheric_light, omega, t0) transmission = 1 - omega * min(img_dark ./ atmospheric_light, [], 3); transmission(transmission < t0) = t0; end end ``` 在使用该算法时,您可以调整参数omega和t0来获得更好的效果。通过调整这些参数,您可以平衡去雾效果和处理速度之间的关系。 4. 结论 本文介绍了基于MatlabDark Channel Prior去雾算法,该算法可以有效地消除图像中的雾霾,并提高图像的质量和清晰度。通过使用Matlab实现源代码,您可以轻松地应用该算法,并在自己的项目中进行调整和优化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值