openCV+python實現影象去霧
阿新 • • 發佈:2018-11-16
Kaiming早在09年以MSRA實習生的身份獲得CVPR best paper,其成果就是給影象去霧。當時並沒有用深度學習,卻能實現讓人震驚的效果。先看下效果:
左邊是原圖,右邊是去霧霾之後的圖。效果還是很驚人的吧。程式碼也非常簡短,如下:
requirements:
opencv3
python3
用法:
python dehaze.py xxx.jpg
import cv2 import math import numpy as np def 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 dark def AtmLight(im,dark): [h,w] = im.shape[:2] imsz = h*w numpx = 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 / numpx; return A def TransmissionEstimate(im,A,sz): omega = 0.95; im3 = 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 transmission 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; def TransmissionRefine(im,et): gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY); gray = np.float64(gray)/255; r = 60; eps = 0.0001; t = Guidedfilter(gray,et,r,eps); return t; def 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 res if __name__ == '__main__': import sys try: fn = sys.argv[1] except: fn = 'demo.jpg' def nothing(*argv): pass src = cv2.imread(fn); I = src.astype('float64')/255; dark = 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();