import cv2
import numpy as np
def zmMinFilterGray(src,r=7):
return cv2.erode(src,np.ones((2*r+1,2*r+1)))
def guidedfilter(I,p,r,eps):
height,width=I.shape
m_I=cv2.boxFilter(I,-1,(r,r))
m_p=cv2.boxFilter(p,-1,(r,r))
m_Ip=cv2.boxFilter(I*p,-1,(r,r))
cov_Ip=m_Ip-m_I*m_p
m_II=cv2.boxFilter(I*I,-1,(r,r))
var_I=m_II-m_I*m_I
a=cov_Ip/(var_I+eps)
b=m_p-a*m_I
m_a=cv2.boxFilter(a,-1,(r,r))
m_b=cv2.boxFilter(b,-1,(r,r))
return m_a*I+m_b
def Defog(m,r,eps,w,maxV1):
V1=np.min(m,2) # 暗通道图像
Dark_Channel=zmMinFilterGray(V1,7)
cv2.imshow('result',Dark_Channel)
cv2.waitKey(0)
cv2.destroyAllWindows()
V1=guidedfilter(V1, Dark_Channel, r, eps)#引导滤波
bins=2000
ht=np.histogram(V1,bins)
d=np.cumsum(ht[0])/float(V1.size)
for lmax in range(bins-1,0,-1):
if d[lmax]<=0.999:
break
A=np.mean(m,2)[V1>=ht[1][lmax]].max()
V1=np.minimum(V1*w,maxV1)
return V1,A
def deHaze(m,r=81,eps=0.001,w=0.95,maxV1=0.80,bGamma=False):
Y=np.zeros(m.shape)
Mask_img,A=Defog(m,r,eps,w,maxV1)
for k in range(3):
Y[:,:,k]=(m[:,:,k]-Mask_img)/(1-Mask_img/A)#颜色校正
Y=np.clip(Y,0,1)
if bGamma:
Y=Y**(np.log(0.5)/np.log(Y.mean())) # gamma校正
return Y
if __name__=='__main__':
m=deHaze(cv2.imread('C:/Users/xpp/Desktop/Lena.png')/255.0)*255
cv2.imwrite('C:/Users/xpp/Desktop/result.png',m)
算法:导向滤波是使用导向图像作为滤波内容图像,在导向图像上实现局部线性函数表达,实现各种不同的线性变换,输出变形之后的导向滤波图像。
链接:http://kaiminghe.com/
本文分享自 图像处理与模式识别研究所 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!