%=========================================================%
%调用规则:(有雾时调用,否则不调用)
%实际操作时,according to experiments:
%percent=under_50/total
%percent<0.1%,取w=0.6
%percent>0.1%&&percent<1%,取w=0.45
%percenet>1%&&percent<2%,取w=0.3
%else not use haze-free-adjust
%有雾:绘制出的直方图<50的部分<1%
%最后控制台还会输出原图中under_50像素点所占比例
%=========================================================%
%close all
clear all
clc
tic
blockSize=15; %每个block为15个像素 没用
w0=0.6; %0.6 乘积因子用来保留一些雾,1时完全去雾
t0=0.1;
% A=200;
I=imread('sam_4.bmp');
% figure;imshow(I);title('原图');
%I=imread('C:\Users\Zrq\Desktop\同济.jpg');
% h = figure;
%set(gcf,'outerposition',get(0,'screensize'));%获得SystemScreenSize 传递给当前图像句柄gcf的outerposition属性
% subplot(221)%表示3(行数)*2(列数)的图像,1代表所画图形的序号
% imshow(I);
% title('Original Image');
% subplot(223);
grayI=rgb2gray(I);
%rgb2gray是matlab内部一种处理图像的函数,通过消除图像色调和饱和度信息同时保留亮度实现将将RGB图像或彩色图转换为灰度图像,
%即灰度化处理的功能,调用这个功能的格式是I = rgb2gray(RGB),意思是将真彩色图像RGB转换为灰度强度图像I
% imshow(grayI,[]);
% title('原图像灰度图')
% subplot(224);
% imhist(grayI,64);
%统计<50的像素所占的比例
%%%%%%%%%%%%%%%%%%%%%%
[COUNT x]=imhist(grayI);
%imhist是MATLAB图像处理模块中的一个函数,用以提取图像中的直方图信息。
%在matlab 的命令窗口中键入doc imhist或help imhist即可获得该函数的帮助信息。
under_50=0;
for i=0:50
under_50=under_50+COUNT(x==i);
end
under_50
total=size(I,1)*size(I,2)*size(I,3);
percent=under_50/total
%%%%%%%%%%%%%%%%%%%%%%
if(percent>0.02)
w0=0.8;
else if (percent>0.01)
w0=0.3;
else if (percent>0.003)
w0=0.45;
else if (percent>0.0001)
w0=0.55;
else if (percent>0)
w0=0.8;
else if (percent==0)
w0=0.7;
end
end
end
end
end
end
[h,w,s]=size(I);
min_I=zeros(h,w);
%其功能是返回一个m×n×p×...的double类零矩阵。注意:m, n, p,...必须是非负整数,负整数将被当做0看待。
%预分配空间 提高运行效率
%下面取得暗影通道图像
for i=1:h
for j=1:w
dark_I(i,j)=min(I(i,j,:));%取每个点的像素为RGB分量中最低的那个通道的值
end
end
% dark_I=ordfilt2(dark_I,1,ones(9,9),'symmetric'); %最小值滤波
Max_dark_channel=double(max(max(dark_I))) %天空亮度
dark_channel=double(dark_I);
t=1-w0*(dark_channel/Max_dark_channel); %取得透谢分布率图
T=uint8(t*255);
%matlab中uint16的范围是0-65535,uint8的范围是0-255。
%matlab提供强制转换为uint8的函数即uint8(number)。
%但这个函数的做法是把大于255的数全部强制置为255,而小于255的部分则保持原样不变。
%若希望将0-65535的灰度级映射到0-255上,则可采用以下的办法:
%uint8(double(number)/65535*255)
t=max(t,t0);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
I1=double(I);
J(:,:,1) = uint8((I1(:,:,1) - (1-t)*Max_dark_channel)./t);
J(:,:,2) = uint8((I1(:,:,2) - (1-t)*Max_dark_channel)./t);
J(:,:,3) =uint8((I1(:,:,3) - (1-t)*Max_dark_channel)./t);
% subplot(222)
figure;
imshow(J);
%imwrite(J,'F:\Matlab程序合集\2013.6.30海雾图片\渤海\He20130210210.jpg');
% title('Haze-Free Image:');
% figure;
imshow(mat2gray(J));title('物理模型去雾');
imwrite( J,'D:\Polyspace\R2019a\bin\综述\图片2\dcp.jpg');
%subplot(325);
%grayJ=rgb2gray(J);
%imshow(grayJ,[]);
%title('去雾后灰度图')
%imwrite( J,'F:\Matlab程序合集\视频海雾\处理结果\he_143.jpg');
%subplot(326);
%imhist(grayJ,64);
t1=toc
代码来源网络,自用。
DarkChannel.m
function [ dark ] = DarkChannel( img, radius )
%DarkChannel Summary of this function goes here
% Detailed explanation goes here
[x, y, ~] = size(img);
dark = zeros(x, y, class(img));
for i = 1:x
for j = 1:y
patch = img(max(i-radius, 1):min(i+radius, x), ...
max(j-radius, 1):min(j+radius, y), :);
rgb = min(min(patch, [], 1), [], 2);
val = min(rgb);
dark(i, j) = val;
end
end
end
本文档介绍了使用MATLAB实现暗通道算法的过程,代码来源于网络并用于个人学习。详细注释帮助理解算法核心思想。
&spm=1001.2101.3001.5002&articleId=105537712&d=1&t=3&u=e03e3f1d7d5d4223b71a1d3b5b878074)
2007

被折叠的 条评论
为什么被折叠?



