Python实现何凯明暗通道去雾算法完整代码与优化
本文提供了基于何凯明博士理论的Python暗通道去雾算法完整实现,代码仅60余行且含详细注释。重点解析了计算密集的最小值滤波环节,指出纯Python实现的性能瓶颈,并建议通过C语言扩展或调用OpenCV的erode函数进行优化。文章附带运行效果对比,展示了从原图到去雾后图像的显著改善,适合希望快速掌握该算法原理及工程落地的开发者参考。
Python实现何凯明暗通道去雾算法完整代码与优化
何凯明博士提出的去雾理论与算法实现已在网络上广泛流传。本文不再赘述理论背景,直接提供一份由Python编写的完整实现版本。该实现代码精简,总计仅60余行,并配有简要注释,逻辑清晰易懂,且去雾效果良好。
在该Python实现中,计算量最大的环节是最小值滤波。由于采用纯Python编写,执行速度较慢,建议后续可通过C语言进行性能优化。其余部分均利用numpy和OpenCV库的现有功能,整体运行效率尚可。
import cv2
import numpy as np
def zmMinFilterGray(src, r=7):
'''最小值滤波,r是滤波器半径'''
'''if r <= 0:
return src
h, w = src.shape[:2]
I = src
res = np.minimum(I , I[[0]+range(h-1) , :])
res = np.minimum(res, I[range(1,h)+[h-1], :])
I = res
res = np.minimum(I , I[:, [0]+range(w-1)])
res = np.minimum(res, I[:, range(1,w)+[w-1]])
return zmMinFilterGray(res, r-1)'''
return cv2.erode(src, np.ones((2*r+1, 2*r+1))) #使用opencv的erode函数更高效
def guidedfilter(I, p, r, eps):
'''引导滤波,直接参考网上的matlab代码'''
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 getV1(m, r, eps, w, maxV1): #输入rgb图像,值范围[0,1]
'''计算大气遮罩图像V1和光照值A, V1 = 1-t/A'''
V1 = np.min(m,2) #得到暗通道图像
V1 = guidedfilter(V1, zmMinFilterGray(V1,7), r, eps) #使用引导滤波优化
bins = 2000
ht = np.histogram(V1, bins) #计算大气光照A
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)
V1,A = getV1(m, r, eps, w, maxV1) #得到遮罩图像和大气光照
for k in range(3):
Y[:,:,k] = (m[:,:,k]-V1)/(1-V1/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('land.jpg')/255.0)*255
cv2.imwrite('defog.jpg', m)
以下展示两段运行效果的对比图。




以上即为Python实现何凯明暗通道去雾算法的详细内容,更多关于该技术的资料请关注本站其他相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













