导向滤波

#导向滤波
#细节增强,变暗,可以进行拉伸
import numpy as np
from scipy import signal
import cv2
def integral(image):
    rows,cols = image.shape
    #行积分运算
    inteImagec = np.zeros((rows,cols),np.float32)
    for r in range(rows):
        for c in range(cols):
            if c == 0:
                inteImagec[r][c] = image[r][c]
            else:
                inteImagec[r][c] = inteImagec[r][c-1]+image[r][c]
    #列积分运算
    inteImage = np.zeros(image.shape,np.float32)
    for c in range(cols):
        for r in range(rows):
            if r == 0:
                inteImage[r][c] = inteImagec[r][c]
            else:
                inteImage[r][c] = inteImage[r-1][c]+inteImagec[r][c]
    #上边左边补0
    inteImage_0 = np.zeros((rows+1,cols+1),np.float32)
    inteImage_0[1:rows+1,1:cols+1] = inteImage
    return inteImage_0
def fastMeanBlur(image,winSize,borderType = cv2.BORDER_DEFAULT):
    halfH = int((winSize[0] - 1)/2)
    halfW = int((winSize[1] - 1)/2)
    ratio = 1.0/(winSize[0]*winSize[1])
    #边界扩充
    paddImage = cv2.copyMakeBorder(image,halfH,halfH,halfW,halfW,borderType)
    #图像积分
    paddIntegral = integral(paddImage)
    #图像的高、宽
    rows,cols = image.shape
    #均值滤波后的结果
    meanBlurImage = np.zeros(image.shape,np.float32)
    r,c = 0,0
    for h in range(halfH,halfH+rows,1):
        for w in range(halfW,halfW+cols,1):
            meanBlurImage[r][c]=(paddIntegral[h+halfH+1][w+halfW+1]+paddIntegral[h-halfH][w-halfW]-
                    paddIntegral[h+halfH+1][w-halfW]-paddIntegral[h-halfH][w+halfW+1])*ratio
            c+=1
        r+=1
        c=0
    return meanBlurImage
def guidedFilter(I,p,winSize,eps):
    rows,cols = I.shape
    mean_I = fastMeanBlur(I,winSize,cv2.BORDER_DEFAULT)
    mean_p = fastMeanBlur(p,winSize,cv2.BORDER_DEFAULT)
    Ip = I*p
    mean_Ip = fastMeanBlur(Ip,winSize,cv2.BORDER_DEFAULT)
    cov_Ip = mean_Ip - mean_I*mean_p
    mean_II = fastMeanBlur(I*I,winSize,cv2.BORDER_DEFAULT)
    var_I = mean_II - mean_I*mean_I
    a = cov_Ip/(var_I+eps)
    b = mean_p - a*mean_I
    mean_a = fastMeanBlur(a,winSize,cv2.BORDER_DEFAULT)
    mean_b = fastMeanBlur(b,winSize,cv2.BORDER_DEFAULT)
    q = mean_a*I+mean_b
    return q

if __name__ =='__main__':
    image = cv2.imread('E:/sy2/5/img7.jpg',cv2.IMREAD_GRAYSCALE)
    cv2.imshow('image',image)
    #将灰度值归一化
    image_0_1 = image/255.0
    result = guidedFilter(image_0_1,image_0_1,(17,17),pow(0.2,2.0))
    cv2.imshow('guidedFilter',result)
    result = result*255
    result[result>255] = 255
    result = np.round(result)
    resultp = result.astype(np.uint8)
    cv2.imshow('resultp',resultp)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值