#导向滤波
#细节增强,变暗,可以进行拉伸
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()