??歡迎訂閱《從實(shí)戰(zhàn)學(xué)python》專欄,用python實(shí)現(xiàn)爬蟲、辦公自動(dòng)化、數(shù)據(jù)可視化、人工智能等各個(gè)方向的實(shí)戰(zhàn)案例,有趣又有用!??
治愈生活的良方 就是保持對(duì)生活的熱愛
哈嘍,大家好,我是一條。
每次和女朋友出去玩,拍照是必須的,天氣好還行,天氣要是不好,加上我這破手機(jī),那拍的簡直慘不忍睹,自己都不過去。
但是沒什么能難倒程序員的,為了不挨罵,連夜寫出去霧算法,女朋友更崇拜我了!
??本文高能,專業(yè)知識(shí)繁多,小白可以直接文末拿代碼運(yùn)行(每行都有注釋)。
??想深入研究的同學(xué),萬字詳解包教包會(huì)!
??總之,收藏護(hù)體!
話不多說,先看看效果強(qiáng)不強(qiáng)。
自己寫的算法,不調(diào)百度api,nb克拉斯。
應(yīng)用:車牌識(shí)別
應(yīng)用:霧天預(yù)警
應(yīng)用:景物識(shí)別
目前圖像處理技術(shù)已非常火熱,應(yīng)用也非常廣泛。
圖像處理的難度不僅在于成像技術(shù),更在于外界的天氣條件,遇到霧、雨、雪等能見度低的惡劣天氣時(shí),成像會(huì)受到很大影響,其中霧霾天氣屢見不鮮,還使采集到的圖片辨識(shí)度、對(duì)比度、色彩飽和度都大大降低。
霧氣的消除可以從物理去霧和數(shù)字去霧兩個(gè)方向考慮,物理去霧即在成像鏡頭上優(yōu)化,高清去霧的鏡頭成本昂貴,不能廣泛應(yīng)用,所以研究重點(diǎn)在數(shù)字去霧上,即通過后期處理對(duì)圖像進(jìn)行優(yōu)化,從去霧算法提出至今,可用的去霧算法大致可分為基于圖像增強(qiáng)的去霧算法和基于圖像復(fù)原的去霧算法。
本算法基于圖像復(fù)原的暗通道先驗(yàn)去霧算法,在大氣成像模型的基礎(chǔ)上,得出圖像恢復(fù)的基本公式。
暗通道理論指出:在大多數(shù)非空局部區(qū)域中,始終至少有一個(gè)顏色通道的某些像素值較低甚至為0。
公式的關(guān)鍵點(diǎn)在于透射率的計(jì)算,為了改進(jìn)算法,用導(dǎo)向?yàn)V波對(duì)透射率進(jìn)行優(yōu)化。
又因?yàn)樵撍惴ū旧韺?duì)天空部分并不適用,所以考慮對(duì)公式增加參數(shù),二次計(jì)算透射率,完成對(duì)算法的再一次優(yōu)化。
最后再用OpenCV-Python對(duì)去霧算法進(jìn)行具體實(shí)現(xiàn)以及運(yùn)行速度的優(yōu)化。最終能夠?qū)崿F(xiàn)對(duì)絕大多數(shù)的有霧圖片快速去霧。
為了讓領(lǐng)域小白理解接下來我要講的內(nèi)容,需要普及一些基礎(chǔ)知識(shí)。
像素是圖像的基本要素,也是圖像的最小單位。
一張圖片實(shí)際是由很多個(gè)小方格組成,每個(gè)小方格有固定的位置和顏色數(shù)值,這決定了圖片最終呈現(xiàn)的樣子,像素的多少?zèng)Q定了在屏幕上顯示的大小。
如果是黑白圖片,用0-255之間的一個(gè)數(shù)字來表示顏色的深淺明暗,0表示最暗(黑色),255表示最亮(白色)。
如果是彩色圖片,用三個(gè)0-255之間的數(shù)字組成的數(shù)字序列來表示紅綠藍(lán)三種顏色所占的比例,則某一個(gè)位置的像素就可以用數(shù)字序列表示為[24,180,50]。
比如一個(gè)5*4像素的彩色圖像就可以這樣存在計(jì)算機(jī)中。
通道簡單來說就是表示通道表示每個(gè)點(diǎn)能存放多少個(gè)數(shù)。
例如彩色圖像中每個(gè)像素點(diǎn)存放三個(gè)值,即3通道的,黑白圖像每個(gè)像素點(diǎn)存放一個(gè)數(shù)字,即單通道。
圖像的像素點(diǎn)不是0就是1(圖像不是黑色就是白色),圖像像素點(diǎn)占的位數(shù)就是1位,圖像的深度就是1,也稱作位圖。
圖像中的像素介于0-255之間,0表示完全黑色,255表示完全白色,并且在0-255之間插入了255級(jí)灰度。
當(dāng)查看單個(gè)通道時(shí),每個(gè)通道都顯示為灰度圖像而不是黑白圖像。
在通道的灰度圖像中,對(duì)比度應(yīng)與通道顏色的對(duì)比度匹配,它代表了彩色光在整個(gè)圖像上的分布。
因?yàn)橛?個(gè)通道,所以也有3個(gè)灰度圖像。
暗通道是一個(gè)基本假設(shè),即在大多數(shù)非空局部區(qū)域中,始終至少有一個(gè)顏色通道的某些像素值較低。
形成這種現(xiàn)象的原因很多,比如色彩鮮艷的物體的表面,汽車,建筑物或城市的陰影,較暗的物體表面的陰影,這些場景的暗通道始終較暗。
暗通道實(shí)際上使用三個(gè)RGB通道中的最小通道來形成灰度圖像。
作者計(jì)算大量沒有霧的圖像,并找到規(guī)則:
每個(gè)圖像中三個(gè)RGB其中一個(gè)顏色通道具有一個(gè)灰色通道,階值非常低,幾乎接近零。
如果有霧,則有一定的灰色;
如果沒有霧,則有很多黑色(像素接近0)。
共計(jì)算了5,000多個(gè)圖像屬性,基本上都滿足這樣的先驗(yàn)定理。
所以只需分別計(jì)算出三個(gè)通道中RGB的最小值即可。
大氣顆粒的散射是霧霾的主要原因。
無論是用肉眼觀察還是從拍攝的圖像中觀察,有很多霧的場景總是會(huì)受到對(duì)比度降低和視野降低的困擾。
在1925年,Keim和Nemnich等人提出霧圖像的低可見性是由于大氣中空氣中的微粒吸收和散射了光。
1976年,約翰·威利(JohnWiley)等人提出,粒子散射會(huì)導(dǎo)致光在傳輸過程中在目標(biāo)和相機(jī)之間衰減,并增加了一層大氣散射光。
為了解決1999年大霧天能見度差的問題,SrinivasaG和Narasimhan等人建立了數(shù)學(xué)模型來改善霧像的成像過程以及霧像中包含的各種元素。
該模型認(rèn)為,在強(qiáng)散射介質(zhì)中,檢測系統(tǒng)的成像結(jié)果劣化的主要原因有兩個(gè):
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-UrrwKMG3-1630474072464)(file:private/var/folders/j0/jf6_lq_s2wjcqpt53gnd88b80000gn/T/com.kingsoft.wpsoffice.mac/wps-libiao/ksohtml/wps6EBduQ.jpg)]
圖中顯示探測系統(tǒng)成像時(shí)接收到的光源主要來自兩個(gè)部分,
通過此物理模型建立得到霧天成像的數(shù)學(xué)模型為:
該公式的物理意義為經(jīng)過粒子衰減能夠達(dá)到探測系統(tǒng)的那部分光的比例。
大多數(shù)團(tuán)隊(duì)和學(xué)者在通過探測系統(tǒng)獲得含霧圖像并對(duì)其進(jìn)行去霧圖像處理時(shí)均以上述大氣散射模型作為霧天成像的理論模型。
其主要思路是根據(jù)各種先驗(yàn)知識(shí)或者圖像處理手段,從含霧圖像中估計(jì)傳輸函數(shù)或大氣光,將求解得到的參量代入到大氣散射模型中,即可恢復(fù)出目標(biāo)圖像。
在強(qiáng)分散介質(zhì)中,檢測系統(tǒng)成像質(zhì)量的下降主要包括以下兩個(gè)原因:
暗通道先驗(yàn)去霧算法最早由何凱明博士中提出。先驗(yàn)與經(jīng)驗(yàn)相對(duì),就是基于某種經(jīng)驗(yàn)所得出的結(jié)論去研究解決問題的方法,此處就是指何凱明博士統(tǒng)計(jì)了5000多副圖像后得出的先驗(yàn)定理:
在每一幅圖像的RGB三個(gè)顏色通道中,總有一個(gè)通道的灰度值很低,幾乎趨向于0。
可以發(fā)現(xiàn),有霧的時(shí)候會(huì)呈現(xiàn)一定的灰色,而無霧的時(shí)候咋會(huì)呈現(xiàn)大量的黑色(像素為接近0)。如圖:有霧圖片的灰度圖整體呈灰色,無霧圖片的非天空部分呈黑色。
在現(xiàn)實(shí)生活中產(chǎn)生這種現(xiàn)象的原因的有很多且很普遍,例如汽車,建筑物等城市中的陰影,有色物體的表面,比如綠葉,各種鮮艷的花朵,較暗的物體表面,這些場景圖像的RGB顏色通道中,總有一個(gè)通道的灰度值很低。
此處省去推導(dǎo)過程,直接上公式。
在日常生活中,即使是晴空萬里,霧也不是完全不存在的,只是濃度比較低,依然會(huì)影響人們看遠(yuǎn)處的物體;
另外,人眼能感到景深的存在也是因?yàn)殪F。
所以,去霧時(shí)也不能做到絕對(duì),應(yīng)該保留一定程度的霧,通過在式中加入一個(gè)在[0,1]之間的系數(shù)來實(shí)現(xiàn)。
明確需要計(jì)算哪些值。
在實(shí)際中,可以借助于暗通道圖來從有霧圖像中獲取該值。
首先根據(jù)亮度從暗通道圖中獲取前0.1%的像素,
然后在這些位置中,在原始有霧圖像I中尋找對(duì)應(yīng)的具有最高亮度的點(diǎn)的值,作為A值,
最后計(jì)算A的平均值。
大氣光計(jì)算出之后,根據(jù)如下公式,可得到透射率。
理論已經(jīng)完成,咱們直接代碼實(shí)現(xiàn)。
OpenCV主要提供一組通用的基礎(chǔ)結(jié)構(gòu)。
用于開發(fā)人工視覺程序,并改善商業(yè)產(chǎn)品中機(jī)器的感知。
OpenCV庫具有2500多種優(yōu)化算法,包括經(jīng)典和最先進(jìn)的機(jī)器視覺以及機(jī)器學(xué)習(xí)算法。
這些算法可用于檢測和識(shí)別面部,跟蹤移動(dòng)的對(duì)象,提取對(duì)象的三維模型,從立體相機(jī)生成3D點(diǎn)云并組合圖像以生成高分辨率全景圖像。從圖像數(shù)據(jù)庫中查找相似圖像等等。
使用OpenCV的項(xiàng)目已植入街景圖像,在監(jiān)視期間檢測入侵,監(jiān)視采礦設(shè)備,幫助機(jī)器人導(dǎo)航和收集物體,并檢測泳池中的溺水事件等很多。
OpenCV支持各種編程語言,如C++,Python,Java等,OpenCV-Python是OpenCV的PythonAPI,結(jié)合了C++和Python語言的最佳特性。
綜上所述,OpenCV-Python的功能非常強(qiáng)大,所以本文用它來實(shí)現(xiàn)去霧算法。
OpenCV在很多領(lǐng)域都有應(yīng)用,比如圖像分割、物體識(shí)別、動(dòng)作識(shí)別、人臉識(shí)別、結(jié)構(gòu)分析等眾多領(lǐng)域,功能復(fù)雜繁多。在暗通道先驗(yàn)去霧算法中,除去一些計(jì)算函數(shù),最關(guān)鍵的就是OpenCV的形態(tài)學(xué)處理。
形態(tài)變換是對(duì)圖像形狀進(jìn)行的簡單操作,通常是指對(duì)二值圖像進(jìn)行的操作,常見的形態(tài)變換包括腐蝕,膨脹和張開操作。
腐蝕是對(duì)前景中物體邊緣的腐蝕,其腐蝕效果與現(xiàn)實(shí)相同。
其原理為卷積核沿著圖像滾動(dòng),如果相應(yīng)區(qū)域的圖像的像素值是1,則對(duì)應(yīng)于卷積核中心的像素值保持不變,否則將全部變?yōu)?。
在卷積核中,圖像的邊緣,部分為0,則該區(qū)域的部分將全變?yōu)?并保持不變。
膨脹是腐蝕的逆過程,與腐蝕相對(duì),
其原理同樣為卷積核沿著圖像流動(dòng),如與卷積核對(duì)應(yīng)的圖像像素值之一為1,該區(qū)域?qū)⑷孔優(yōu)?,否則保持不變。
進(jìn)行腐蝕操作后再進(jìn)行膨脹操作就是開運(yùn)算
閉與開相對(duì),所以開運(yùn)算的逆過程就是閉運(yùn)算,進(jìn)行膨脹操作后再進(jìn)行腐蝕造作,原理和開運(yùn)算一樣,可以用于去除二值化圖像的背景色噪點(diǎn)。
首先計(jì)算圖像的總像素點(diǎn)數(shù),取其前0.1%。
再按像素值從小到大的順序獲取像素所在位置的下標(biāo),按按照下標(biāo)從霧圖中找到對(duì)應(yīng)位置的三通道值。
這樣就完成了從暗通道圖中按照亮度的大小取前0.1%的像素。然后取這些值的平均值作為大氣光A的值。
代碼如下:
def AtmLight(im,dark): [h,w]=im.shape[:2] #獲取圖像的長寬 imsz=h*w #長*寬得到總像素點(diǎn)個(gè)數(shù) numpx=int(max(math.floor(imsz/1000),1)) #取總個(gè)數(shù)的前0.1% darkvec=dark.reshape(imsz,1); #復(fù)制原圖 imvec=im.reshape(imsz,3); #復(fù)制暗通道圖 darkvec1=np.transpose(darkvec) #橫縱坐標(biāo)互換 indices=darkvec1.argsort(); #按像素值從小到大的順序獲取像素所在位置的下標(biāo) indices=indices[0][imsz-numpx::] #取前0.1%大的 atmsum=np.zeros([1,3]) #一行三列以0填充的矩陣 for ind in range(0,numpx): #按下標(biāo)到原圖找到對(duì)應(yīng)位置的像素值并求和 atmsum=atmsum+imvec[indices[ind]] A=atmsum/numpx; #計(jì)算平均值 return A
依據(jù)公式粗略得到透射率的值,該值有待優(yōu)化,后續(xù)會(huì)處理。
def TransmissionEstimate(im,A,sz): omega=0.95; #聲明參數(shù) im3=np.empty(im.shape,im.dtype); #復(fù)制原圖 for ind in range(0,3): #按公式計(jì)算 im3[:,:,ind]=im[:,:,ind]/A[0,ind] transmission=1-omega*DarkChannel(im3,sz); return transmission
根據(jù)前面得出的恢復(fù)公式進(jìn)行計(jì)算。
def Recover(im, t, A, tx=0.1): res = np.empty(im.shape, im.dtype); t = cv2.max(t, tx); #如果t小于tx,取tx for ind in range(0, 3): #按公式計(jì)算 res[:, :, ind] = (im[:, :, ind] - A[0, ind]) / t + A[0, ind] return res
含天空部分的圖像去霧之后只能觀察到少許的去霧效果,圖像亮度大大降低,且天空部分過度曝光,去霧效果并不理想。
說明此算法本身確實(shí)對(duì)大面積天空部分并不適用。
針對(duì)上文得到的較為粗略的透射率,在本章對(duì)其進(jìn)行優(yōu)化,
何凱明曾提出過軟遮光的方法,該方法雖然獲得的透射率非常精細(xì),但是運(yùn)行速度極慢,成為致命弱點(diǎn)。
在實(shí)際使用中,效果并不理想。所以在本文中使用引導(dǎo)濾波的方法獲得更精準(zhǔn)的透射率。
該方法的核心在于正方形的簡單模糊,而有很多個(gè)快速且獨(dú)立于半徑的算法都可以用于正方形的簡單模糊,使算法的運(yùn)行速度大大提高,可以實(shí)際使用。
原理部分略過,因過于晦澀,需要深入了解的同學(xué)。
def 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_p; mean_II = cv2.boxFilter(im * im, cv2.CV_64F, (r, r)); var_I = mean_II - mean_I * mean_I; a = cov_Ip / (var_I + eps); b = mean_p - a * mean_I; mean_a = cv2.boxFilter(a, cv2.CV_64F, (r, r)); mean_b = cv2.boxFilter(b, cv2.CV_64F, (r, r)); q = mean_a * im + mean_b; return q;
算法對(duì)天空部分的處理效果并不理想,天空部分被和非天空部分會(huì)出現(xiàn)明顯的過渡區(qū)域和過度曝光現(xiàn)象。
這是算法從提出就存在的問題,為了解決這跟問題,從以下兩種思路進(jìn)行優(yōu)化。
在計(jì)算大氣光值時(shí)提到,A是所有按亮度取前0.1%像素點(diǎn)的平局值,由于天空部分的大氣光過大,影響了最后的平均值。
所以考慮設(shè)置一個(gè)最大全球大氣光值作為所有像素點(diǎn)的閾值,如果有像素點(diǎn)的值大于閾值,該值就等于閾值。
這里將閾值設(shè)置為220。
因?yàn)檫@種直接取閾值的方法有些絕對(duì),所以多次實(shí)驗(yàn)之后發(fā)現(xiàn)結(jié)果并無較大改變。
考慮到上面直接取閾值的方法有些絕對(duì),所以想到設(shè)置一個(gè)參數(shù)來重新計(jì)算透射率。
正常情況下,天空部分的大氣光值和A使比較接近的,而只有遠(yuǎn)離天空的地方才能用暗通道先驗(yàn)算法去霧。
所以將符合條件的像素點(diǎn)的值與A相減,如果結(jié)果小于某個(gè)值,認(rèn)為這個(gè)區(qū)域可能是天空,就需要重新計(jì)算透射率。
如果結(jié)果小于某個(gè)值,則認(rèn)為該區(qū)域不是天空,不用重新計(jì)算透射率。
這里的某個(gè)值,設(shè)置為k,每個(gè)像素處的透射率用它來調(diào)節(jié),則改良后的透射率計(jì)算公式為
經(jīng)過實(shí)驗(yàn),該方法對(duì)去霧校果有非常大的改善。
窗口的大小對(duì)去霧效果來說是個(gè)關(guān)鍵的參數(shù)。
從理論角度分析,窗口更大,就有更大的概率包含暗通道,暗通道也就越暗,與無霧圖像的對(duì)比越不明顯,去霧效果也就不好。
實(shí)驗(yàn)得到:窗口越大,去霧的效果越不好。窗口大小在11-51之間去霧效果最好。
ω最初是為考慮維持景深,所以保留一定程度的霧,所以其值越小,保留的霧越多,當(dāng)然去霧效果越不好。
實(shí)驗(yàn)后發(fā)現(xiàn),取0.95最佳。
關(guān)于導(dǎo)向?yàn)V波中的半徑r值,因?yàn)樵谇懊孢M(jìn)行形態(tài)學(xué)處理暗通道的圖像成一塊一塊的。
為了使透射率率更加精準(zhǔn),實(shí)驗(yàn)后發(fā)現(xiàn),r的取值大于等于窗口大小的4倍最好。
源碼下載地址:待審核
完整論文下載地址:待審核
?今天是堅(jiān)持刷題更文的第48/100天
?各位的點(diǎn)贊、關(guān)注、收藏、評(píng)論、訂閱就是一條創(chuàng)作的最大動(dòng)力
為了回饋各位粉絲,禮尚往來,給大家準(zhǔn)備了一條多年積累下來的優(yōu)質(zhì)資源,包括 學(xué)習(xí)視頻、面試資料、珍藏電子書等
大家可以點(diǎn)這里領(lǐng)取
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/118783.html
摘要:很多人可能會(huì)問這個(gè)故事和生成式對(duì)抗網(wǎng)絡(luò)有什么關(guān)系其實(shí),只要你能理解這段故事,就可以了解生成式對(duì)抗網(wǎng)絡(luò)的工作原理。 男:哎,你看我給你拍的好不好?女:這是什么鬼,你不能學(xué)學(xué)XXX的構(gòu)圖嗎?男:哦……男:這次你看我拍的行不行?女:你看看你的后期,再看看YYY的后期吧,呵呵男:哦……男:這次好點(diǎn)了吧?女:呵呵,我看你這輩子是學(xué)不會(huì)攝影了……男:這次呢?女:嗯,我拿去當(dāng)頭像了上面這段對(duì)話講述了一位男...
此專欄文章是對(duì)力扣上算法題目各種方法的總結(jié)和歸納, 整理出最重要的思路和知識(shí)重點(diǎn)并以思維導(dǎo)圖形式呈現(xiàn), 當(dāng)然也會(huì)加上我對(duì)導(dǎo)圖的詳解. 目的是為了更方便快捷的記憶和回憶算法重點(diǎn)(不用每次都重復(fù)看題解), 畢竟算法不是做了一遍就能完全記住的. 所以本文適合已經(jīng)知道解題思路和方法, 想進(jìn)一步加強(qiáng)理解和記憶的朋友, 并不適合第一次接觸此題的朋友(可以根據(jù)題號(hào)先去力扣看看官方題解, 然后再看本文內(nèi)容). 關(guān)...
??蘇州程序大白一文教你學(xué)會(huì)微信小程序開發(fā)??《??記得收藏??》 目錄 ????開講啦?。。?!????蘇州程序大白?????博主介紹?前言?講講專享小程序有什么優(yōu)勢? ?小程序文件分析?事件綁定?圖片問題?輪播圖swiper?自定義組件?生命周期?頁面生命周期?項(xiàng)目制作?緩沖事件?`es7 async`語法 ?觸底事件??下拉刷新頁面??css省略號(hào)??預(yù)覽大圖??購物車模擬??獲取地...
閱讀 1674·2023-04-25 20:36
閱讀 2099·2021-09-02 15:11
閱讀 1227·2021-08-27 13:13
閱讀 2678·2019-08-30 15:52
閱讀 5020·2019-08-29 17:13
閱讀 1025·2019-08-29 11:09
閱讀 1515·2019-08-26 11:51
閱讀 866·2019-08-26 10:56