日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MATLAB多算法进行图像去雾处理

發布時間:2023/12/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MATLAB多算法进行图像去雾处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、霧靄的形成機理

霧實際上是由懸浮顆粒在大氣中的微小液滴構成的氣溶膠,常呈現乳白色,其底部位于地球表面,所以也可以看作是接近地面的云。靄其實跟霧區別不大,它的一種解釋是輕霧,多呈現灰白色,與霧的顏色十分接近。廣義的霧包括霧、霾、沙塵、煙等一切導致視覺效果受限的物理現象。由于霧的存在,戶外圖像質量降低,如果不處理,往往滿足不了相關研究、應用的要求。在霧的影響下,經過物體表面的光被大氣中的顆粒物吸收和反射,導致獲取的圖像質量差,細節模糊、色彩暗淡。

2、設計步驟

(一)基于直方圖均衡化的圖像去霧算法

1、轉換為灰度圖像后對圖像進行直方圖均衡

由于直方圖均衡僅限于灰度圖像,所以我們將輸入的RGB圖像先轉變為灰度圖像,再進行圖像增強。簡要過程如圖2-1所示。

圖2-1 RGB轉灰度圖像進行直方圖均衡化過程

(1) 讀入圖像,將彩色圖像進行降維轉換成灰度圖像;

(2) 對灰度圖像的直方圖進行均衡化處理;

(3) 輸出均衡化后的灰色圖像。

接下來我們考慮想要得到彩色圖像,于是從不同空間對圖像進行均衡化處理。

2.1、在RGB空間對圖像進行直方圖均衡(流程如圖2-2)

(1) 讀入圖像,將圖像存儲于RGB空間;

(2) 分別對RGB空間的R、G、B三個分量的灰度直方圖進行均衡化處理;

(3) 輸出圖像。


圖2-2 在RGB空間對圖像進行直方圖均衡

2.2、在HSV空間對圖像進行直方圖均衡(流程如圖2-3)

(1) 讀入圖像,將圖像由RGB空間轉換到HSV空間;

(2) 對HSV空間飽和度和亮度分量(S、V分量)的灰度直方圖進行均衡化處理;

(3) 將圖像由HSV空間轉換到RGB空間并輸出。


圖2-3 在HSI空間對圖像進行直方圖均衡

2.3、在YCrCb空間對圖像進行直方圖均衡(流程如圖2-4)

(1) 讀入圖像,將圖像由RGB空間轉換到YCrCb空間;

(2) 對YCrCb空間亮度分量(Y分量)的灰度直方圖進行均衡化處理;

(3) 將圖像由YCrCb空間轉換到RGB空間并輸出圖像。


圖2-4 在YCrCb空間對圖像進行直方圖均衡

3基于暗通道先驗的圖像去霧算法

根據何凱明的暗通道先驗算法原理,大致的流程如圖2-6所示。


圖2-6 暗通道先驗過程圖

(1)根據原始有霧圖像求暗通道

用for循環求出每個像素RGB分量中的最小值,存入一副和原始圖像大小相同的灰度圖中,然后再對這副灰度圖使用ordfilt2進行最小值濾波,濾波的半徑由窗口大小決定。

(2)求解全局大氣光照

根據原理應該選擇暗通道

內圖像總像素點個數千分之一個最亮的像素點,并記錄這些像素點坐標,再根據這些點的坐標分別在原圖像I的三個通道內找到這些像素點并加和。

考慮到這個思路在MATLAB實現中在尋找這些像素點時,會找到不止1000點,因為在圖像中有很多值相等的像素點;為了方便計算,在求A時取最亮值的點集中的某一個點。

(3)求透射率t(x)

首先設定原始程序中去霧系數w=0.95,根據公式先對透射率有一個預估;接下來利用導向濾波(Guided Filter)來對透射率圖。

以原始圖像的其中一個通道為引導圖,使得透射率圖的細節更加準確。而為了提高計算速度,在導向濾波中使用盒子濾波器(Box filter),其本質是通過下采樣減少像素點,計算后再進行上采樣恢復到原有的尺寸大小。

(4)求解無霧圖像

根據公式


求解出去霧的圖像即可。在初始程序中采用

為標準計算。

4、設計結果與分析

(一)基于直方圖均衡化的圖像去霧算法

直方圖均衡化是圖像增強中的一種常用方法,該算法以概率論為基礎,基于空間不變思想,運用灰度運算來實現直方圖的變換,從而達到增強圖像的目的,更適合于景物深度變化很小的圖像。分為全局直方圖均衡化算法和局部直方圖均衡化算法(在本次實驗中局部均衡方法去霧效果比較差,所以不對該方法進行贅述)。

全局直方圖均衡化算法實現簡單,對單景深圖像的復原效果較好,但對于場景深度多變的圖像的復原效果好,但是對于場景深度多變的額圖像,這種方法就很難反映圖像中局部景物深度的變化。

采用局部增強方法可以使圖像的每一個區域的對比度都能得到很大的改善,但是同時這種方法也將灰度變化緩慢的區域,如天空等也進行了誤增強,從而導致景物影像因許多噪聲的干擾而表現得不自然。

原始有霧圖像如圖3-1所示。


(a) 有霧圖像1


(b) 有霧圖像2

圖3-1 有霧圖像

對全局均衡結果圖的效果進行分析(程序zft.m):

對有霧圖像RGB通道進行均衡化處理后融合的圖像效果最好,清晰度較高,且顏色較符合地物顏色,但天空處有較多的塊狀噪聲,且樹葉產生了較大的畸變,結果如圖3-1。

圖3-1 對RGB通道進行均衡化處理結果


圖3-2 對RGB通道進行均衡化結果及其直方圖前后對比

將只對HSI空間的亮度分量[I通道]和對HSI空間的亮度、飽和度分量[I、S通道]進行均衡化,通道進行的均衡化處理的圖像顏色對比度明顯發生的變化,第二種顏色過于鮮艷而發生畸變,第一種較RGB均衡方式的顏色對比度較差,且樹葉處畸變較差結果如圖3-3。


圖3-3 對HSI通道進行均衡化處理結果


圖3-4 對HSI通道進行均衡化前后結果對比及其直方圖

對YCrCb空間的亮度分量[Y通道]進行均衡處理,所得圖像在天空處處理的較差,有大片空白,但是對于樹葉的處理較其他幾種方式都好,結果如圖3-5。


圖3-5 對YCrCb通道進行均衡化處理結果


圖3-6 對YCrCb通道進行均衡化結果前后對比及其直方圖

當考慮將RGB圖像轉變為灰度圖像在進行直方圖均衡化的結果如圖3-7所示,


圖3-7 對灰度進行均衡化結果前后對比及其直方圖


圖3-8 對灰度進行均衡化結果前后對比及其直方圖

如果忽略灰度圖直方圖均衡化的視覺效果問題,在去霧效果方面灰度變換的結果還是比較好的。

接著再使用有霧圖像2的直方圖均衡化,結果如圖3-9所示,


圖3-8 對灰度進行均衡化結果前后對比及其直方圖

由于有霧圖像2在前景處沒有霧的影響,在整體圖像增強后雖然也起到了一定去霧的目的,但是圖像效果不太好。

總的來說,直方圖均衡化的方法對灰度變化不大的樹葉和天空處理效果較差,但是對于建筑物等灰度變化較大的區域效果還是不錯的。

直方圖均衡化通過使用累積函數對灰度值進行“調整”以實現對比度的增強。具體說來,即把原圖像對應的灰度直方圖從比較集中的灰度區間通過一定的轉換變成在全部灰度范圍內的均勻分布。就是對圖像進行非線性拉伸,重新分配圖像像素值,使一定灰度范圍內的像素數量大致相同。

通過使用累積函數對灰度值進行“調整”以實現對比度的增強,一定程度上使暗的地方更暗、亮的地方更亮,從而在視覺上達到去霧的效果。

但是上面的去霧效果僅僅局限于灰度圖片,而不能直接對彩色圖像進行處理。經過上述直方圖處理后,達到均衡化圖像的目的,但是圖像會在原圖基礎上失真,即整幅圖像的顏色發生改變,有時會嚴重偏離去霧的初衷。

(二)基于暗通道先驗的圖像去霧算法

1、實驗過程結果圖

(1)根據原始有霧圖像求暗通道


圖4-1 有霧圖像1的暗通道圖像


圖4-2 有霧圖像2的暗通道圖像

通過兩幅圖的暗通道圖像尤其是有霧圖像2中可以看出在近距離的樹葉處非常的暗,通過該暗通道圖像去估算大氣光照和透射率,建立模型就可以很好地在去霧的同時盡可能保留無霧區域的特征細節。

(2)求解全局大氣光照

求解有圖像1和2的大氣光照數A:


(3)求透射率


圖4-3 圖像1的透射率圖

圖4-4 圖像2的透射率圖

通過兩幅圖像透射率圖可以看出利用導向濾波函數求得的透射率圖像較為精細,也符合大氣物理退化模型中的情況。

(4)求解無霧圖像


圖4-5 圖像1的去霧圖像

有霧圖像1的去霧結果相較于使用直方圖均衡化中效果最好的對于RGB通道進行直方圖均衡化處理結果來說,去霧的程度更大,顏色更加真實,特征細節處的保持的也較好。去霧后的圖像會比原始的暗,因此在處理完后最好進行一定的曝光增強,但由于視覺上的效果還不錯,我們選擇不進行其他操作以免影響去霧效果的觀察。

圖4-6 圖像2的去霧圖像

圖4-6更加能夠突出暗通道先驗算法去霧的優點,對于無霧區域的處理將區別于有霧區域,可以減小本身不需要去霧圖像區域的改變。

2、影響暗通道先驗算法去霧效果的參數研究

計算的標準參數值如下表所示:

1去霧系數ω0.95
2濾波窗口大小(形成暗通道的濾波半徑)r9
3透射率窗口大小(導向半徑)R80
4透射率下限值0.1
5eps

(1)去霧系數ω

粗透射率為


越大,去霧程度越大,圖像對比度顯得越暗;反之越小,去霧越不徹底,圖像越泛白。一般取

5對比兩種去霧算法


直方圖均衡化暗通道先驗
優點對去霧圖像沒有要求不僅在物理上有效,而且能夠處理包括在霧濃度很大情況下的遠距離物體;可以減小無霧區域的變樣
缺點去霧后的圖像或為灰色圖像或產生顏色失真,去霧效果不穩定得到的去霧圖像比較暗,無法處理大面積天空或類似區域


直方圖均衡化對于灰度圖像去霧效果比較好,而暗原色先驗對于彩色圖像去霧效果比較明顯,圖像中的特征得到很好的增強,使人們能夠很好的觀測圖像給予的信息,并作出正確的判斷。暗原色先驗明顯的去除霧的干擾,提高圖像的清晰度,增強圖像色彩和細節,復原得到高質量的圖像。

雖然原始圖像受霧影響模糊不清、顏色不真實的圖像,但經過暗通道先驗算法處理后在細節上更清晰,顏色更真實,視覺效果更令人滿意。這種算法適合以上各種場景的圖像去霧,無論霧的分布均勻與否,霧的濃度薄或濃,場景中深度變壞如何,都能有效地去除圖像中霧,有效地提高了圖像的清晰度。從而很大程度上提高了霧天的能見度。但是該算法存在一定的局限性,暗原色先驗是一種統計的結果,是對大量戶外無霧照片的統計結果,如果目標場景內在的就和大氣光類似,比如雪地、白色背景墻、大海等,則由于前提條件就不正確,因此一般無法獲得滿意的效果,而對于一般的風景照片這個算法能處理的不錯。另外,由于景物退化與場景深度呈非線性關系,由此帶來的最大問題是很難保證建立的景物退化模型的正確性和寬適性。目前,大多數的圖像復原方法都建立在大氣散射模型的基礎上,并受到了此類模型的限制。

6、附錄(源代碼)

1、aft.m

%利用直方圖均衡化去霧

%===========================================================

close all;

clear all;

wu=imread('E:\Report\課程設計\圖片\2.bmp');

%--------------------------------------------------------------------------

%對飽和度與亮度進行直方圖均衡處理

%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每個通道進行直方圖均衡處理

% R:紅色

% G:綠色

% B:藍色

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的亮度進行直方圖均衡處理

%y:顏色的亮度,

%Cb:藍色的濃度偏移成分

%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);

%將彩色圖像轉換為灰度圖像后,再做直方圖均衡處理

whole=rgb2gray(wu);

W=histeq(whole);

%--------------------------------------------------------------------------

% 結果顯示

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

%暗通道去霧算法

%===========================================================

%暗原色去霧算法是建立在戶外自然場景暗通道優先法則的基礎上的去霧方法

%其實就是解一個方程: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; %去霧系數

dehaze = zeros(h,w,c); %初始化結果圖像

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; %透射率預估

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獲得更為精細的透射率圖

t0=0.1; %設置閾值

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; %無霧圖像恢復

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(導向濾波函數)

%===========================================================

%引導圖:I(灰度圖/單通道圖像)

%輸入圖像:p(灰度圖/單通道圖像)

%本地窗口半徑:r

%正規化參數: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; %協方差

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(盒子濾波函數)

%===========================================================

%輸入:imSrc

%給定的滑動窗口大小:r

%===========================================================

function imDst = boxfilter(imSrc,r)

[hei,wid] = size(imSrc);

imDst = zeros(size(imSrc)); %初始化

%--------------------------------------------------------------------------

imCum = cumsum(imSrc,1); %y軸累計求和,將每一行的數值一次累加到下一行

%y軸方向差異

imDst(1:r+1,:) = imCum(1+r:2*r+1,:);

%將imCum中的1+r到2*r+1行數據復制到imDst函數中的1到r+1行

imDst(r+2:hei-r,:) = imCum(2*r+2:hei,:)-imCum(1:hei-2*r-1,:);

%將imCum中的2*r+2到hei行數據依次減去1到hei-2*r-1行的值

%把最終結果存放到函數imDst的r+2到hei-r行

imDst(hei-r+1:hei,:) = repmat(imCum(hei,:),[r,1])-imCum(hei-2*r:hei-r-1,:);

%使用repmat函數將imCum變為r*1的格式

%然后減去函數imCum中從hei-2*r到hei-r-1行的數值

%得到的結果放入imDst的hei-r+1到hei行位置

%--------------------------------------------------------------------------

imCum = cumsum(imDst,2); %x軸累計求和,將每一列的數值一次累加到下一列

%y軸方向差異

imDst(:, 1:r+1) = imCum(:,1+r:2*r+1);

%將imCum中的1+r到2*r+1列數據復制到imDst函數中的1到r+1列

imDst(:, r+2:wid-r) = imCum(:,2*r+2:wid)-imCum(:,1:wid-2*r-1);

%將imCum中的2*r+2到hei列數據依次減去1到hei-2*r-1列的值

%把最終結果存放到函數imDst的r+2到hei-r列

imDst(:, wid-r+1:wid) = repmat(imCum(:,wid),[1,r])-imCum(:,wid-2*r:wid-r-1);

%使用repmat函數將imCum變為r*1的格式

%然后減去函數imCum中從hei-2*r到hei-r-1列的數值

%得到的結果放入imDst的hei-r+1到hei列位置

end

總結

以上是生活随笔為你收集整理的MATLAB多算法进行图像去雾处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。