MATLAB多算法进行图像去雾处理
1、霧靄的形成機(jī)理
霧實際上是由懸浮顆粒在大氣中的微小液滴構(gòu)成的氣溶膠,常呈現(xiàn)乳白色,其底部位于地球表面,所以也可以看作是接近地面的云。靄其實跟霧區(qū)別不大,它的一種解釋是輕霧,多呈現(xiàn)灰白色,與霧的顏色十分接近。廣義的霧包括霧、霾、沙塵、煙等一切導(dǎo)致視覺效果受限的物理現(xiàn)象。由于霧的存在,戶外圖像質(zhì)量降低,如果不處理,往往滿足不了相關(guān)研究、應(yīng)用的要求。在霧的影響下,經(jīng)過物體表面的光被大氣中的顆粒物吸收和反射,導(dǎo)致獲取的圖像質(zhì)量差,細(xì)節(jié)模糊、色彩暗淡。
2、設(shè)計步驟
(一)基于直方圖均衡化的圖像去霧算法
1、轉(zhuǎn)換為灰度圖像后對圖像進(jìn)行直方圖均衡
由于直方圖均衡僅限于灰度圖像,所以我們將輸入的RGB圖像先轉(zhuǎn)變?yōu)榛叶葓D像,再進(jìn)行圖像增強(qiáng)。簡要過程如圖2-1所示。
圖2-1 RGB轉(zhuǎn)灰度圖像進(jìn)行直方圖均衡化過程
(1) 讀入圖像,將彩色圖像進(jìn)行降維轉(zhuǎn)換成灰度圖像;
(2) 對灰度圖像的直方圖進(jìn)行均衡化處理;
(3) 輸出均衡化后的灰色圖像。
接下來我們考慮想要得到彩色圖像,于是從不同空間對圖像進(jìn)行均衡化處理。
2.1、在RGB空間對圖像進(jìn)行直方圖均衡(流程如圖2-2)
(1) 讀入圖像,將圖像存儲于RGB空間;
(2) 分別對RGB空間的R、G、B三個分量的灰度直方圖進(jìn)行均衡化處理;
(3) 輸出圖像。
圖2-2 在RGB空間對圖像進(jìn)行直方圖均衡
2.2、在HSV空間對圖像進(jìn)行直方圖均衡(流程如圖2-3)
(1) 讀入圖像,將圖像由RGB空間轉(zhuǎn)換到HSV空間;
(2) 對HSV空間飽和度和亮度分量(S、V分量)的灰度直方圖進(jìn)行均衡化處理;
(3) 將圖像由HSV空間轉(zhuǎn)換到RGB空間并輸出。
圖2-3 在HSI空間對圖像進(jìn)行直方圖均衡
2.3、在YCrCb空間對圖像進(jìn)行直方圖均衡(流程如圖2-4)
(1) 讀入圖像,將圖像由RGB空間轉(zhuǎn)換到Y(jié)CrCb空間;
(2) 對YCrCb空間亮度分量(Y分量)的灰度直方圖進(jìn)行均衡化處理;
(3) 將圖像由YCrCb空間轉(zhuǎn)換到RGB空間并輸出圖像。
圖2-4 在YCrCb空間對圖像進(jìn)行直方圖均衡
3基于暗通道先驗的圖像去霧算法
根據(jù)何凱明的暗通道先驗算法原理,大致的流程如圖2-6所示。
圖2-6 暗通道先驗過程圖
(1)根據(jù)原始有霧圖像求暗通道
用for循環(huán)求出每個像素RGB分量中的最小值,存入一副和原始圖像大小相同的灰度圖中,然后再對這副灰度圖使用ordfilt2進(jìn)行最小值濾波,濾波的半徑由窗口大小決定。
(2)求解全局大氣光照
根據(jù)原理應(yīng)該選擇暗通道
內(nèi)圖像總像素點個數(shù)千分之一個最亮的像素點,并記錄這些像素點坐標(biāo),再根據(jù)這些點的坐標(biāo)分別在原圖像I的三個通道內(nèi)找到這些像素點并加和。
考慮到這個思路在MATLAB實現(xiàn)中在尋找這些像素點時,會找到不止1000點,因為在圖像中有很多值相等的像素點;為了方便計算,在求A時取最亮值的點集中的某一個點。
(3)求透射率t(x)
首先設(shè)定原始程序中去霧系數(shù)w=0.95,根據(jù)公式先對透射率有一個預(yù)估;接下來利用導(dǎo)向濾波(Guided Filter)來對透射率圖。
以原始圖像的其中一個通道為引導(dǎo)圖,使得透射率圖的細(xì)節(jié)更加準(zhǔn)確。而為了提高計算速度,在導(dǎo)向濾波中使用盒子濾波器(Box filter),其本質(zhì)是通過下采樣減少像素點,計算后再進(jìn)行上采樣恢復(fù)到原有的尺寸大小。
(4)求解無霧圖像
根據(jù)公式
求解出去霧的圖像即可。在初始程序中采用
為標(biāo)準(zhǔn)計算。
4、設(shè)計結(jié)果與分析
(一)基于直方圖均衡化的圖像去霧算法
直方圖均衡化是圖像增強(qiáng)中的一種常用方法,該算法以概率論為基礎(chǔ),基于空間不變思想,運用灰度運算來實現(xiàn)直方圖的變換,從而達(dá)到增強(qiáng)圖像的目的,更適合于景物深度變化很小的圖像。分為全局直方圖均衡化算法和局部直方圖均衡化算法(在本次實驗中局部均衡方法去霧效果比較差,所以不對該方法進(jìn)行贅述)。
全局直方圖均衡化算法實現(xiàn)簡單,對單景深圖像的復(fù)原效果較好,但對于場景深度多變的圖像的復(fù)原效果好,但是對于場景深度多變的額圖像,這種方法就很難反映圖像中局部景物深度的變化。
采用局部增強(qiáng)方法可以使圖像的每一個區(qū)域的對比度都能得到很大的改善,但是同時這種方法也將灰度變化緩慢的區(qū)域,如天空等也進(jìn)行了誤增強(qiáng),從而導(dǎo)致景物影像因許多噪聲的干擾而表現(xiàn)得不自然。
原始有霧圖像如圖3-1所示。
(a) 有霧圖像1
(b) 有霧圖像2
圖3-1 有霧圖像
對全局均衡結(jié)果圖的效果進(jìn)行分析(程序zft.m):
對有霧圖像RGB通道進(jìn)行均衡化處理后融合的圖像效果最好,清晰度較高,且顏色較符合地物顏色,但天空處有較多的塊狀噪聲,且樹葉產(chǎn)生了較大的畸變,結(jié)果如圖3-1。
圖3-1 對RGB通道進(jìn)行均衡化處理結(jié)果
圖3-2 對RGB通道進(jìn)行均衡化結(jié)果及其直方圖前后對比
將只對HSI空間的亮度分量[I通道]和對HSI空間的亮度、飽和度分量[I、S通道]進(jìn)行均衡化,通道進(jìn)行的均衡化處理的圖像顏色對比度明顯發(fā)生的變化,第二種顏色過于鮮艷而發(fā)生畸變,第一種較RGB均衡方式的顏色對比度較差,且樹葉處畸變較差結(jié)果如圖3-3。
圖3-3 對HSI通道進(jìn)行均衡化處理結(jié)果
圖3-4 對HSI通道進(jìn)行均衡化前后結(jié)果對比及其直方圖
對YCrCb空間的亮度分量[Y通道]進(jìn)行均衡處理,所得圖像在天空處處理的較差,有大片空白,但是對于樹葉的處理較其他幾種方式都好,結(jié)果如圖3-5。
圖3-5 對YCrCb通道進(jìn)行均衡化處理結(jié)果
圖3-6 對YCrCb通道進(jìn)行均衡化結(jié)果前后對比及其直方圖
當(dāng)考慮將RGB圖像轉(zhuǎn)變?yōu)榛叶葓D像在進(jìn)行直方圖均衡化的結(jié)果如圖3-7所示,
圖3-7 對灰度進(jìn)行均衡化結(jié)果前后對比及其直方圖
圖3-8 對灰度進(jìn)行均衡化結(jié)果前后對比及其直方圖
如果忽略灰度圖直方圖均衡化的視覺效果問題,在去霧效果方面灰度變換的結(jié)果還是比較好的。
接著再使用有霧圖像2的直方圖均衡化,結(jié)果如圖3-9所示,
圖3-8 對灰度進(jìn)行均衡化結(jié)果前后對比及其直方圖
由于有霧圖像2在前景處沒有霧的影響,在整體圖像增強(qiáng)后雖然也起到了一定去霧的目的,但是圖像效果不太好。
總的來說,直方圖均衡化的方法對灰度變化不大的樹葉和天空處理效果較差,但是對于建筑物等灰度變化較大的區(qū)域效果還是不錯的。
直方圖均衡化通過使用累積函數(shù)對灰度值進(jìn)行“調(diào)整”以實現(xiàn)對比度的增強(qiáng)。具體說來,即把原圖像對應(yīng)的灰度直方圖從比較集中的灰度區(qū)間通過一定的轉(zhuǎn)換變成在全部灰度范圍內(nèi)的均勻分布。就是對圖像進(jìn)行非線性拉伸,重新分配圖像像素值,使一定灰度范圍內(nèi)的像素數(shù)量大致相同。
通過使用累積函數(shù)對灰度值進(jìn)行“調(diào)整”以實現(xiàn)對比度的增強(qiáng),一定程度上使暗的地方更暗、亮的地方更亮,從而在視覺上達(dá)到去霧的效果。
但是上面的去霧效果僅僅局限于灰度圖片,而不能直接對彩色圖像進(jìn)行處理。經(jīng)過上述直方圖處理后,達(dá)到均衡化圖像的目的,但是圖像會在原圖基礎(chǔ)上失真,即整幅圖像的顏色發(fā)生改變,有時會嚴(yán)重偏離去霧的初衷。
(二)基于暗通道先驗的圖像去霧算法
1、實驗過程結(jié)果圖
(1)根據(jù)原始有霧圖像求暗通道
圖4-1 有霧圖像1的暗通道圖像
圖4-2 有霧圖像2的暗通道圖像
通過兩幅圖的暗通道圖像尤其是有霧圖像2中可以看出在近距離的樹葉處非常的暗,通過該暗通道圖像去估算大氣光照和透射率,建立模型就可以很好地在去霧的同時盡可能保留無霧區(qū)域的特征細(xì)節(jié)。
(2)求解全局大氣光照
求解有圖像1和2的大氣光照數(shù)A:
(3)求透射率
圖4-3 圖像1的透射率圖
圖4-4 圖像2的透射率圖
通過兩幅圖像透射率圖可以看出利用導(dǎo)向濾波函數(shù)求得的透射率圖像較為精細(xì),也符合大氣物理退化模型中的情況。
(4)求解無霧圖像
圖4-5 圖像1的去霧圖像
有霧圖像1的去霧結(jié)果相較于使用直方圖均衡化中效果最好的對于RGB通道進(jìn)行直方圖均衡化處理結(jié)果來說,去霧的程度更大,顏色更加真實,特征細(xì)節(jié)處的保持的也較好。去霧后的圖像會比原始的暗,因此在處理完后最好進(jìn)行一定的曝光增強(qiáng),但由于視覺上的效果還不錯,我們選擇不進(jìn)行其他操作以免影響去霧效果的觀察。
圖4-6 圖像2的去霧圖像
圖4-6更加能夠突出暗通道先驗算法去霧的優(yōu)點,對于無霧區(qū)域的處理將區(qū)別于有霧區(qū)域,可以減小本身不需要去霧圖像區(qū)域的改變。
2、影響暗通道先驗算法去霧效果的參數(shù)研究
計算的標(biāo)準(zhǔn)參數(shù)值如下表所示:
| 1 | 去霧系數(shù)ω | 0.95 |
| 2 | 濾波窗口大小(形成暗通道的濾波半徑)r | 9 |
| 3 | 透射率窗口大小(導(dǎo)向半徑)R | 80 |
| 4 | 透射率下限值 | 0.1 |
| 5 | eps |
(1)去霧系數(shù)ω
粗透射率為
越大,去霧程度越大,圖像對比度顯得越暗;反之越小,去霧越不徹底,圖像越泛白。一般取
5對比兩種去霧算法
| 直方圖均衡化 | 暗通道先驗 | |
| 優(yōu)點 | 對去霧圖像沒有要求 | 不僅在物理上有效,而且能夠處理包括在霧濃度很大情況下的遠(yuǎn)距離物體;可以減小無霧區(qū)域的變樣 |
| 缺點 | 去霧后的圖像或為灰色圖像或產(chǎn)生顏色失真,去霧效果不穩(wěn)定 | 得到的去霧圖像比較暗,無法處理大面積天空或類似區(qū)域 |
直方圖均衡化對于灰度圖像去霧效果比較好,而暗原色先驗對于彩色圖像去霧效果比較明顯,圖像中的特征得到很好的增強(qiáng),使人們能夠很好的觀測圖像給予的信息,并作出正確的判斷。暗原色先驗明顯的去除霧的干擾,提高圖像的清晰度,增強(qiáng)圖像色彩和細(xì)節(jié),復(fù)原得到高質(zhì)量的圖像。
雖然原始圖像受霧影響模糊不清、顏色不真實的圖像,但經(jīng)過暗通道先驗算法處理后在細(xì)節(jié)上更清晰,顏色更真實,視覺效果更令人滿意。這種算法適合以上各種場景的圖像去霧,無論霧的分布均勻與否,霧的濃度薄或濃,場景中深度變壞如何,都能有效地去除圖像中霧,有效地提高了圖像的清晰度。從而很大程度上提高了霧天的能見度。但是該算法存在一定的局限性,暗原色先驗是一種統(tǒng)計的結(jié)果,是對大量戶外無霧照片的統(tǒng)計結(jié)果,如果目標(biāo)場景內(nèi)在的就和大氣光類似,比如雪地、白色背景墻、大海等,則由于前提條件就不正確,因此一般無法獲得滿意的效果,而對于一般的風(fēng)景照片這個算法能處理的不錯。另外,由于景物退化與場景深度呈非線性關(guān)系,由此帶來的最大問題是很難保證建立的景物退化模型的正確性和寬適性。目前,大多數(shù)的圖像復(fù)原方法都建立在大氣散射模型的基礎(chǔ)上,并受到了此類模型的限制。
6、附錄(源代碼)
1、aft.m
%利用直方圖均衡化去霧
%===========================================================
close all;
clear all;
wu=imread('E:\Report\課程設(shè)計\圖片\2.bmp');
%--------------------------------------------------------------------------
%對飽和度與亮度進(jìn)行直方圖均衡處理
%h:色度
%s:飽和度
%v:亮度
hsv=rgb2hsv(wu);
wu1=rgb2gray(wu);
h=hsv(:,:,1);
s=hsv(:,:,2);
v=hsv(:,:,3);
S=histeq(s);
V=histeq(v);
result_hsv=hsv2rgb(h,S,V);
%--------------------------------------------------------------------------
% 對RGB每個通道進(jìn)行直方圖均衡處理
% R:紅色
% G:綠色
% B:藍(lán)色
r=wu(:,:,1);
g=wu(:,:,2);
b=wu(:,:,3);
R=histeq(r);
G=histeq(g);
B=histeq(b);
result_rgb=cat(3,R,G,B);%將RGB三個分量放入一個矩陣
result_rgb1=rgb2gray(result_rgb);
%--------------------------------------------------------------------------
% 對YCbCr的亮度進(jìn)行直方圖均衡處理
%y:顏色的亮度,
%Cb:藍(lán)色的濃度偏移成分
%Cr:紅色的濃度偏移成分
ycbcr=rgb2ycbcr(wu);
y=ycbcr(:,:,1);
cb=ycbcr(:,:,2);
cr=ycbcr(:,:,3);
Y=histeq(y);
result_ycbcr=ycbcr2rgb(cat(3,Y,cb,cr));%%將RGB三個分量放入一個矩陣
result_ycbcr1=rgb2gray(result_ycbcr);
%將彩色圖像轉(zhuǎn)換為灰度圖像后,再做直方圖均衡處理
whole=rgb2gray(wu);
W=histeq(whole);
%--------------------------------------------------------------------------
% 結(jié)果顯示
figure(1)
subplot(2,2,1),imshow(wu),title('原始圖像')
subplot(2,2,2),imshow(result_hsv),title('HSV')
subplot(2,2,3),imhist(wu1);
subplot(2,2,4),imhist(result_hsv1);
figure(2)
subplot(2,2,1),imshow(wu),title('原始圖像')
subplot(2,2,2),imshow(result_rgb),title('RGB')
subplot(2,2,3),imhist(wu1);
subplot(2,2,4),imhist(result_rgb1);
figure(3)
subplot(2,2,1),imshow(wu),title('原始圖像')
subplot(2,2,2),imshow(result_ycbcr),title('YCbCr')
subplot(2,2,3),imhist(wu1);
subplot(2,2,4),imhist(result_ycbcr1);
figure(4)
subplot(2,2,1),imshow(wu),title('原始圖像')
subplot(2,2,2),imshow(W),title('灰度圖像直方圖均衡化')
subplot(2,2,3),imhist(wu1);
subplot(2,2,4),imhist(W);
2、antongd.m
%暗通道去霧算法
%===========================================================
%暗原色去霧算法是建立在戶外自然場景暗通道優(yōu)先法則的基礎(chǔ)上的去霧方法
%其實就是解一個方程:I(x)=J(x)t(x)+A(1-t(x))
%其中I(x)是受到霧氣污染的圖像,J(x)是我們需要求的去霧后的圖像
%t(x)是天空中云層的透射分布率,A是天空的亮度
%===========================================================
close all;
clear all;
I = double(img_name)/255;
[h,w,c] = size(I); %獲取圖像大小
w0 = 0.95; %去霧系數(shù)
dehaze = zeros(h,w,c); %初始化結(jié)果圖像
win_dark = zeros(h,w); %初始化暗影通道圖像
%--------------------------------------------------------------------------
%計算暗通道
%將三個通道中最暗的值賦給win_dark(i,j),使得三維圖變成了二維圖
for i=1:h
for j=1:w
win_dark(i,j) = min(I(i,j,:));
end
end
win_dark = ordfilt2(win_dark,1,ones(9,9),'symmetric'); %9*9最小值濾波
%--------------------------------------------------------------------------
%計算大氣亮度A
dark_channel = win_dark;
A = max(max(dark_channel));
[i0,j0] = find(dark_channel==A);
i = i0(1);
j = j0(1);
A = mean(I(i,j,:));
%--------------------------------------------------------------------------
%計算透射率t(x)
transmission = 1-w0*win_dark/A; %透射率預(yù)估
gray_I = I(:,:,3); %這里gray_I可以是RGB圖像中任何一個通道
p = transmission; %透射率圖
r = 50;
eps = 10^-3;
transmission_filter = guidedfilter(gray_I,p,r,eps);
%用guided filter對trasmission map做soft matting獲得更為精細(xì)的透射率圖
t0=0.1; %設(shè)置閾值
t1 = max(t0,transmission_filter);
%--------------------------------------------------------------------------
for i=1:c
for j=1:h
for l=1:w
dehaze(j,l,i)=(I(j,l,i)-A)/t1(j,l)+A; %無霧圖像恢復(fù)
end
end
end
%--------------------------------------------------------------------------
%顯示圖像
figure
subplot(121)
imshow(win_dark);title('暗通道')
subplot(122)
imshow(t1);title('透射率圖')
figure
subplot(121)
imshow(I);title('去霧前')
subplot(122)
imshow(dehaze);title('去霧后')
3、guidedfilter.m
%guided filter(導(dǎo)向濾波函數(shù))
%===========================================================
%引導(dǎo)圖:I(灰度圖/單通道圖像)
%輸入圖像:p(灰度圖/單通道圖像)
%本地窗口半徑:r
%正規(guī)化參數(shù):eps
%==========================================================================
function q = guidedfilter(I,p,r,eps)
[hei,wid] = size(I);
N = boxfilter(ones(hei,wid),r); % the size of each local patch;
%N=(2r+1)^2 except for boundary pixels.
mean_I = boxfilter(I,r)./N;
mean_p = boxfilter(p,r)./N;
mean_Ip = boxfilter(I.*p,r)./N;
cov_Ip = mean_Ip-mean_I.*mean_p; %協(xié)方差
mean_II = boxfilter(I.*I,r)./N;
var_I = mean_II-mean_I.*mean_I; %方差
a = cov_Ip./(var_I+eps);
b = mean_p-a.*mean_I;
mean_a = boxfilter(a,r)./N;
mean_b = boxfilter(b,r)./N;
q = mean_a.*I+mean_b;
end
4、boxfilter.m
%boxfilter(盒子濾波函數(shù))
%===========================================================
%輸入:imSrc
%給定的滑動窗口大小:r
%===========================================================
function imDst = boxfilter(imSrc,r)
[hei,wid] = size(imSrc);
imDst = zeros(size(imSrc)); %初始化
%--------------------------------------------------------------------------
imCum = cumsum(imSrc,1); %y軸累計求和,將每一行的數(shù)值一次累加到下一行
%y軸方向差異
imDst(1:r+1,:) = imCum(1+r:2*r+1,:);
%將imCum中的1+r到2*r+1行數(shù)據(jù)復(fù)制到imDst函數(shù)中的1到r+1行
imDst(r+2:hei-r,:) = imCum(2*r+2:hei,:)-imCum(1:hei-2*r-1,:);
%將imCum中的2*r+2到hei行數(shù)據(jù)依次減去1到hei-2*r-1行的值
%把最終結(jié)果存放到函數(shù)imDst的r+2到hei-r行
imDst(hei-r+1:hei,:) = repmat(imCum(hei,:),[r,1])-imCum(hei-2*r:hei-r-1,:);
%使用repmat函數(shù)將imCum變?yōu)閞*1的格式
%然后減去函數(shù)imCum中從hei-2*r到hei-r-1行的數(shù)值
%得到的結(jié)果放入imDst的hei-r+1到hei行位置
%--------------------------------------------------------------------------
imCum = cumsum(imDst,2); %x軸累計求和,將每一列的數(shù)值一次累加到下一列
%y軸方向差異
imDst(:, 1:r+1) = imCum(:,1+r:2*r+1);
%將imCum中的1+r到2*r+1列數(shù)據(jù)復(fù)制到imDst函數(shù)中的1到r+1列
imDst(:, r+2:wid-r) = imCum(:,2*r+2:wid)-imCum(:,1:wid-2*r-1);
%將imCum中的2*r+2到hei列數(shù)據(jù)依次減去1到hei-2*r-1列的值
%把最終結(jié)果存放到函數(shù)imDst的r+2到hei-r列
imDst(:, wid-r+1:wid) = repmat(imCum(:,wid),[1,r])-imCum(:,wid-2*r:wid-r-1);
%使用repmat函數(shù)將imCum變?yōu)閞*1的格式
%然后減去函數(shù)imCum中從hei-2*r到hei-r-1列的數(shù)值
%得到的結(jié)果放入imDst的hei-r+1到hei列位置
end
總結(jié)
以上是生活随笔為你收集整理的MATLAB多算法进行图像去雾处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 牛逼!用文言文来编程,97 年 CMU
- 下一篇: WindowsAPI详解——GetCur