数字图像处理——图像去雾技术的对比
前言
現代社會的發展總是伴隨著環境的污染,霧霾現象發生越來越頻繁,很大程度上影響我們的生活。霧霾是由空氣中的灰塵和煙霧等小的漂浮顆粒產生的常見大氣現象,這些漂浮的顆粒極大地吸收和散射光,導致拍攝圖像質量下降。在霧霾影響下,視頻監控,遠程感應,自動駕駛等許多實際應用很容易受到威脅,檢測和識別等高級計算機視覺任務很難完成。因此,圖像去霧成為一種越來越重要的技術,有很重要的研究價值,同時也是一項充滿挑戰性的課題。為了解決這一問題,設計圖像復原處理軟件。
要求完成功能
1、 采用直方圖均衡化方法增強霧天模糊圖像,并比較增強前后的圖像
和直方圖:
2、查閱文獻,分析霧天圖像退化因素,設計一種圖像復原方法,對比
該復原圖像與原始圖像以及直方圖均衡化后的圖像;
3、設計軟件界面
一、?課程設計原理及設計方案
1.1 設計原理 ??
由于圖像中存在噪聲等干擾,使得圖像模糊不清。可以采用圖像增強的方
法對原圖像處理,使圖像變得清晰。而直方圖均衡化是- -種常用的圖像增強的
方法。圖像模糊,其圖像的像素分布不均勻,采用直方圖均衡化的方法使其圖
像像素分布均勻,從而達到均衡像素分布增強圖像的目的。
1.1.1直方圖均衡化
對于連續圖像,設r和s分別表示被增強圖像和變換后圖像的灰度。為了簡
單,在下面的討論中,假定所有像素的灰度已被歸- -化了,就是說,當時,
表示黑色;當時,表示白色;變換函數與原圖像概率密度函數之間的關系
為:
????
?
式中: r為積分變量。式(1)的右邊可以看作是r的累積分布函數(CDF),因為CDF是r的函數,并單調地從0增加到1,所以這- -變換函數滿足了前面所述的關于在內單值單調增加,對于,有的兩個條件。由于累積分布函數是r的函數,并且單調的從0增加到1,所以這個變換函數滿足對式(1) 中的r求導,則:
??????
?
再把結果帶入式?
?
正在上傳…重新上傳取消正在上傳…重新上傳取消????則得
?由以上推到可見,變換后的變量s的定義域內的概率密度是均勻分布的
由此可見,用r累積分布函數作為變換函數可產生一幅灰度級分布具有均勻概率密度的圖像。其結果擴展了像素取值的動態范圍。
上面的修正方法是以連續隨機變量為基礎進行討論的。為了對圖像進行數字處理,必須引入離散形式的公式。當灰度級是離散值的時候,可用頻數近似代替概率值,即:
式中,L是灰度級數;是取第 k級灰度值的概率;是在圖像中出現第 k級灰度的次數; N是圖像中像素數。
通常把為得到均勻直方圖的圖像增強技術叫做直方圖均衡化處理或直方圖
線性化處理。式(1)的直方圖均衡化累積分布函數的離散形式可由式(5) 表示:
?
其反變換為
?1.1.2霧天圖像退化模型
在計算機視覺領域,通常使用霧天圖像退化模型來描述霧霾等惡劣天氣條件對圖像造成的影響,該模型是McCartney首先提出。該模型包括衰減模型和環境光模型兩部分。模型表達式為:
I(x)=J(x)e?rd(x)+A(1?e?rd(x))??????(7)
其中,x是圖像像素的空間坐標,H是觀察到的有霧圖像,F是待恢復的無霧圖像,r表示大氣散射系數,d代表景物深度,A是全局大氣光,通常情況下假設為全局常量,與空間坐標x無關。
公式(7)中e?r(dx)e?r(dx)表示坐標空間x處的透射率,我們使用t(x)t(x)來表示透射率,于是得到下面的公式:
I(x)=J(x)t(x)+A(1?t(x))??????(8)
由此可見,圖像去霧過程就是根據I(x)求解J(x)的過程。要求解出J(x),還需要根據I(x)求解出透射率t(x)和全局大氣光A。
實際上,所有基于霧天退化模型的去霧算法就是是根據已知的有霧圖像I(x)求解出透射率t(x)和全局大氣光A。
估計全局大氣光A:
1、暗通道去霧算法中的估計全局大氣光A
先從暗原色通道中選取最亮的0.1%比例的像素電,然后選取原輸入圖像中這些像素具有的最大灰度值作為全局大氣光A。RGB三通道中每一個通道都有一個大氣光值。
2、分塊遞歸思想估計全局大氣光A
先將圖像平均分為四個部分,然后分別求取四個部分中的平均亮度值,選取亮度值最大的塊,將這個塊平均分為四個塊,選取最亮的塊,當分解到塊的大小達到一定閾值時,在這個塊中選取亮度最大的點作為全局大氣光A。
3、亮度最大值作為全局大氣光A
選取輸入圖像中亮度最大的電的灰度值作為全局大氣光A。
4、分段思量估計全局大氣光A
觀察一般的圖像,天空部分一般分配在圖像的上1/3部分,因此將圖像水平分為3個部分,然后在最上的1/3部分使用暗通道估計算法估計全局大氣光。
5、快速估計全局大氣光A
首先求取輸入圖像RGB三通道中的最小值,即求取暗原色通道圖像,然后對暗原色通道圖像進行均值濾波,然后求取其中灰度值最大的點,接著求取輸入圖像RGB三通道中值最大的通道圖像,然后求取出灰度值最大的點,然后將兩個點的灰度值的平均值作為全局大氣光A。
估計透射率t(x):
1、暗通道去霧算法
使用上面的方法先求取出全局大氣光A,然后根據公式(8)可以得出:
t(x)=A?I(x)A?J(x)????(9)
首先可以確定的是t(x)的范圍是[0, 1],I(x)的范圍是[0,255],J(x)的范圍是[0, 255]。A和I(x)是已知的,可以根據J(x)的范圍從而確定t(x)的范圍。已知的條件有:
0≤J(x)≤255,0≤I(x)≤A,0≤J(x)≤A,0≤t(x)≤1?????????(10)
t(x)≥A?I(x)A?0=A?I(x)A=1?I(x)A??????????(11)
結合式(10)和式(11)可得:
1?I(x)A≤t(x)≤1????????????(12)??
因此初略估計透射率的計算公式:
t(x)=1?I(x)A???????????(13)??
為了保證圖片的自然性,增加一個參數w來調整透射率
t(x)=1?wI(x)A??????????????(14)
2、精細化透射率
精細化透射率方法有:軟摳圖、雙邊濾波、導向濾波、恢復無霧圖像。
估計出全局大氣光A和透射率t(x)后,使用公式(14)可以計算得出去霧后的圖像。實踐表明這樣去霧操作后,得到的無霧圖像亮度會偏暗,可以使用自動對比度增強,亮度增強,伽馬校正等圖像處理方法進行處理,以便得效果更佳的無霧圖像。
圖像去霧算法可以分為兩大類:一類是圖像增強;另一類是圖像復原。圖1-1介紹了圖像去霧算法的分類:
圖2-1
二、課程設計的過程和結果
2.1原圖像與直方圖
# -*- coding: utf-8 -*-from PIL import Imagefrom pylab import *# 讀取圖像到數組中,并灰度化im = array(Image.open('train.png').convert('L'))# 直方圖圖像hist(im.flatten(),128)# 顯示show()?原圖像 3-1 ??
直方圖3-2
3.2原圖像與均衡后圖像
import cv2import numpy as npfrom matplotlib import pyplot as pltimg1 = cv2.imread('train.png', 0)# 別忘了中括號 [img],[0],None,[256],[0,256],只有 mask 沒有中括號hist1 = cv2.calcHist([img1], [0], None, [256], [0, 256])img2 = cv2.imread('dehaze.png')color = ('b', 'g', 'r')for i, col in enumerate(color):histr = cv2.calcHist([img2], [i], None, [256], [0, 256])plt.subplot(224), plt.plot(histr, color=col),plt.xlim([0, 256]), plt.title('Histogram')plt.subplot(221), plt.imshow(img1, 'gray'), plt.title('Image1')plt.subplot(222), plt.hist(img1.ravel(), 256, [0, 256]),plt.title('Histogram'), plt.xlim([0, 256])plt.subplot(223), plt.imshow(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)), plt.title('Image2')plt.show()圖3-3
# encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as pltimg_gray = cv2.imread('train.png', cv2.IMREAD_GRAYSCALE) equ = cv2.equalizeHist(img_gray) img2 = cv2.imread('dehaze.png') color = ('b', 'g', 'r') for i, col in enumerate(color):histr = cv2.calcHist([img2], [i], None, [256], [0, 256])plt.subplot(224), plt.plot(histr, color=col),plt.xlim([0, 256]), plt.title('Histogram')plt.subplot(231), plt.imshow(img_gray, cmap=plt.cm.gray), plt.title('img_gray'), plt.axis('off') ?# 坐標軸關閉 plt.subplot(232), plt.imshow(equ, cmap=plt.cm.gray), plt.title('equ'), plt.axis('off') ?# 坐標軸關閉 plt.subplot(233), plt.imshow(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)), plt.title('Image2'), plt.axis('off') plt.subplot(234), plt.hist(img_gray.ravel(), 256), plt.title('img_gray_hist') plt.subplot(235), plt.hist(equ.ravel(), 256), plt.title('equ_hist') plt.subplot(236), plt.hist(img2.ravel(), 256),plt.title('Histogram')plt.show() cv2.waitKey(0) cv2.destroyAllWindows() print(img_gray.shape)?圖3-4
3.3原圖與去霧圖像對比
import cv2 import math import numpy as npdef DarkChannel(im, sz):b, g, r = cv2.split(im)dc = cv2.min(cv2.min(r, g), b)kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (sz, sz))dark = cv2.erode(dc, kernel)return darkdef AtmLight(im, dark):[h, w] = im.shape[:2]imsz = h * wnumpx = int(max(math.floor(imsz / 1000), 1))darkvec = dark.reshape(imsz, 1)imvec = im.reshape(imsz, 3)indices = darkvec.argsort()indices = indices[imsz - numpx::]atmsum = np.zeros([1, 3])for ind in range(1, numpx):atmsum = atmsum + imvec[indices[ind]]A = atmsum / numpxreturn Adef TransmissionEstimate(im, A, sz):omega = 0.95im3 = np.empty(im.shape, im.dtype)for ind in range(0, 3):im3[:, :, ind] = im[:, :, ind] / A[0, ind]transmission = 1 - omega * DarkChannel(im3, sz)return transmissiondef Guidedfilter(im, p, r, eps):mean_I = cv2.boxFilter(im, cv2.CV_64F, (r, r))mean_p = cv2.boxFilter(p, cv2.CV_64F, (r, r))mean_Ip = cv2.boxFilter(im * p, cv2.CV_64F, (r, r))cov_Ip = mean_Ip - mean_I * mean_pmean_II = cv2.boxFilter(im * im, cv2.CV_64F, (r, r))var_I = mean_II - mean_I * mean_Ia = cov_Ip / (var_I + eps)b = mean_p - a * mean_Imean_a = cv2.boxFilter(a, cv2.CV_64F, (r, r))mean_b = cv2.boxFilter(b, cv2.CV_64F, (r, r))q = mean_a * im + mean_breturn qdef TransmissionRefine(im, et):gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)gray = np.float64(gray) / 255r = 60eps = 0.0001t = Guidedfilter(gray, et, r, eps)return tdef Recover(im, t, A, tx=0.1):res = np.empty(im.shape, im.dtype)t = cv2.max(t, tx)for ind in range(0, 3):res[:, :, ind] = (im[:, :, ind] - A[0, ind]) / t + A[0, ind]return resif __name__ == '__main__':import systry:fn = sys.argv[1]except:fn = 'train.png'def nothing(*argv):passsrc = cv2.imread(fn)I = src.astype('float64') / 255dark = DarkChannel(I, 15)A = AtmLight(I, dark)te = TransmissionEstimate(I, A, 15)t = TransmissionRefine(src, te)J = Recover(I, t, A, 0.1)arr = np.hstack((I, J))cv2.imshow("contrast", arr)cv2.imwrite("dehaze.png", J * 255)cv2.imwrite("contrast.png", arr * 255)cv2.waitKey()去霧后效果:
圖3-5
去霧后圖片直方圖:
圖3-6
3.4設計 GUI 界面
界面設計如下:
總結
本文首先對圖像去霧技術做了綜述性的介紹。基于圖像處理的圖像增強方法具有對比度提高顯著、圖像細節突出、視覺效果明顯的特點,該方法已經在實踐中獲得了廣泛的應用。而基于物理模型的圖像復原方法針對性強,得到的復原結果自然,且一般不會有信息損失,該技術必將獲得更大的發展。
此次運用了一個對單圖像去霧的簡單有效的算法,叫暗通道先驗算法。暗通道先驗算法是基于室外圖像統計規律的。應用這個先驗算法模型使對單一圖像進行去霧變得更加簡單有效。由于暗通道檢驗算法是一種統計規律,因此對一些特殊的圖像可能會不適用。對于景物顏色和大氣光差別不大的圖像,暗通道先驗算法就不給力了,特別是對白霧傳輸的估計。
總結
以上是生活随笔為你收集整理的数字图像处理——图像去雾技术的对比的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql gtid 还是pxc_记一次
- 下一篇: 计算机无线局域网毕业论文,谈教学设计《计