前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >导向滤波

导向滤波

作者头像
裴来凡
发布2022-05-29 09:44:12
3460
发布2022-05-29 09:44:12
举报
文章被收录于专栏:图像处理与模式识别研究所
代码语言:javascript
复制
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/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 图像处理与模式识别研究所 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档