按通道去霧

2021-09-01 11:24:33 字數 2180 閱讀 9910

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 利用全圖最暗點來去除全域性...