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校正,預設不進行該操作
cv2.imwrite('defog.jpg', m)
目前還沒有測試執行怎樣,參考自: 瞎搞系列 暗通道去霧
基於暗通道先驗的去霧演算法實際上是一種統計演算法,發現了無霧影象中區域性存在一些畫素,這些畫素至少有乙個顏色通道的亮度值非常非常低 但是當影象區域白色的時候,這種演算法則存在缺陷 在計算機圖形學中,存在乙個比較重要的模型,這種模型的廣泛應用於霧圖中 其中i x 表示觀測到的亮度,j x 表示恢復後的...
暗通道去霧演算法的python實現
import cv2 as cv import numpy as np import matplotlib.pyplot as pyplot def darkchannel for i in range 0,rows 1 for j in range 0,cols 1 min rgb img arr...
暗通道先驗原理 DCP去霧演算法
一 霧圖形成模型 變形 c為r g b三通道。二 dark channel prior 統計規律 對於乙個無霧影象,每個區域性區域很可能至少乙個顏色通道會有很低的值,或黑色東西。非天空區域 每個區域性區域都總有一些很暗的東西。dark object subtraction 利用全圖最暗點來去除全域性...