溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python實(shí)現(xiàn)暗通道去霧算法的示例

發(fā)布時(shí)間:2020-10-21 08:32:17 來源:腳本之家 閱讀:353 作者:zmshy2128 欄目:開發(fā)技術(shù)

何凱明博士的去霧文章和算法實(shí)現(xiàn)已經(jīng)漫天飛了,我今天也就不啰里啰唆,直接給出自己python實(shí)現(xiàn)的完整版本,全部才60多行代碼,簡(jiǎn)單易懂,并有簡(jiǎn)要注釋,去霧效果也很不錯(cuò)。

在這個(gè)python版本中,計(jì)算量最大的就是最小值濾波,純python寫的,慢,可以進(jìn)一步使用C優(yōu)化,其他部分都是使用numpy和opencv的現(xiàn)成東東,效率還行。

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函數(shù)更高效
def guidedfilter(I, p, r, eps):
  '''引導(dǎo)濾波,直接參考網(wǎng)上的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]
  '''計(jì)算大氣遮罩圖像V1和光照值A(chǔ), V1 = 1-t/A'''
  V1 = np.min(m,2)                     #得到暗通道圖像
  V1 = guidedfilter(V1, zmMinFilterGray(V1,7), r, eps)   #使用引導(dǎo)濾波優(yōu)化
  bins = 2000
  ht = np.histogram(V1, bins)               #計(jì)算大氣光照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)          #對(duì)值范圍進(jìn)行限制
   
  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校正,默認(rèn)不進(jìn)行該操作
  return Y
 
if __name__ == '__main__':
  m = deHaze(cv2.imread('land.jpg')/255.0)*255
  cv2.imwrite('defog.jpg', m)

下面給兩個(gè)運(yùn)行效果吧

python實(shí)現(xiàn)暗通道去霧算法的示例

python實(shí)現(xiàn)暗通道去霧算法的示例

python實(shí)現(xiàn)暗通道去霧算法的示例

python實(shí)現(xiàn)暗通道去霧算法的示例

以上就是python實(shí)現(xiàn)暗通道去霧算法的示例的詳細(xì)內(nèi)容,更多關(guān)于python實(shí)現(xiàn)暗通道去霧算法的資料請(qǐng)關(guān)注億速云其它相關(guān)文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI