import numpy as np
from scipy import signal
import cv2
import random
import pinghua_zhongzhi ##用于向图像加入噪声
def guideFilter(I, p, winSize, eps, s): #导向滤波
# 输入图像的高、宽
h, w = I.shape[:2]
# 缩小图像
size = (int(round(w * s)), int(round(h * s)))
small_I = cv2.resize(I, size, interpolation=cv2.INTER_CUBIC)
small_p = cv2.resize(I, size, interpolation=cv2.INTER_CUBIC)
# 缩小滑动窗口
X = winSize[0]
small_winSize = (int(round(X * s)), int(round(X * s)))
# I的均值平滑
mean_small_I = cv2.blur(small_I, small_winSize)
# p的均值平滑
mean_small_p = cv2.blur(small_p, small_winSize)
# I*I和I*p的均值平滑
mean_small_II = cv2.blur(small_I * small_I, small_winSize)
mean_small_Ip = cv2.blur(small_I * small_p, small_winSize)
# 方差
var_small_I = mean_small_II - mean_small_I * mean_small_I # 方差公式
# 协方差
cov_small_Ip = mean_small_Ip - mean_small_I * mean_small_p
small_a = cov_small_Ip / (var_small_I + eps)
small_b = mean_small_p - small_a * mean_small_I
# 对a、b进行均值平滑
mean_small_a = cv2.blur(small_a, small_winSize)
mean_small_b = cv2.blur(small_b, small_winSize)
# 放大
size1 = (w, h)
mean_a = cv2.resize(mean_small_a, size1, interpolation=cv2.INTER_LINEAR)
mean_b = cv2.resize(mean_small_b, size1, interpolation=cv2.INTER_LINEAR)
q = mean_a * I + mean_b
return q
if __name__=='__main__': ##启动语句
a= cv2.imread('D:/2.png', cv2.IMREAD_UNCHANGED) # 路径名中不能有中文,会出错,cv2.
image1 = cv2.split(a)[0]#蓝通道
image2 = cv2.split(a)[1]
image3 = cv2.split(a)[2]
image1=pinghua_zhongzhi.salt(image1,300)
image2 = pinghua_zhongzhi.salt(image2, 300)
image3 = pinghua_zhongzhi.salt(image3, 300)
merged = cv2.merge([image1, image2, image3]) # 合并三通道
cv2.imshow("image1", merged)
image1=image1/255.0
image2 = image2 / 255.0
image3 = image3 / 255.0
gf1 = guideFilter(image1, image1, (17,17), 0.01,0.5)
gf2 = guideFilter(image2, image2, (17, 17), 0.01, 0.5)
gf3 = guideFilter(image3, image3, (17, 17), 0.01, 0.5)
#cv2.imshow("增强后图", gf )
gf1 = gf1 * 255
gf1[gf1 > 255] = 255
gf1 = np.round(gf1)
gf1 = gf1.astype(np.uint8)
gf2 = gf2 * 255
gf2[gf2 > 255] = 255
gf2 = np.round(gf2)
gf2 = gf2.astype(np.uint8)
gf3 = gf3 * 255
gf3[gf3 > 255] = 255
gf3 = np.round(gf3)
gf3 = gf3.astype(np.uint8)
merged2 = cv2.merge([gf1, gf2, gf3]) # 合并三通道
cv2.imshow("merged2", merged2)
#cv2.imwrite(r'C:\Users\2.jpg', gf)
cv2.waitKey(0)
cv2.destroyAllWindows()
左边为加了噪声的原图,右面平滑后的图片