图像平滑:导向滤波(python程序)

11 篇文章 0 订阅
9 篇文章 1 订阅
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()

在这里插入图片描述
左边为加了噪声的原图,右面平滑后的图片

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值