高斯滤波python实现可以任意设置高斯核大小和方差

高斯滤波是一种线性平滑滤波器,对于服从正态分布的噪声有很好的抑制作用。在实际场景中,我们通常会假定图像包含的噪声为高斯白噪声,所以在许多实际应用的预处理部分,都会采用高斯滤波抑制噪声。

高斯核计算方式:

                                          

公式中前一部分常数可以忽略不计,因为最后都是要进行归一化的。

python代码如下

import cv2
import numpy as np

class Gaussian:
    def __init__(self, source_img, k, sigma):
        self.source_img = cv2.imread(source_img)
        self.k = k
        self.sigma = sigma
    def Gaussian_Filter(self):
        if len(self.source_img.shape) == 3:
            hight, width, coner = self.source_img.shape
        else:
            self.source_img = np.expand_dims(self.source_img, axis=-1)
            hight, width, coner = self.source_img.shape
        #图像填充
        edge = self.k // 2
        out_img = np.zeros((hight + edge * 2, width + edge*2, coner),dtype=np.float)
        out_img[edge:edge+hight, edge:edge + width] = self.source_img.copy().astype(np.float)
        #卷积核计算
        kenerl = np.zeros((self.k, self.k), dtype=np.float)
        for x in range(-edge, -edge + self.k):
            for y in range(-edge, -edge + self.k):
                kenerl[y + edge, x + edge] = np.exp(-((x - edge -1)**2)  + ((y - edge -1)**2)) / (2 * self.sigma**2)
        kenerl /= kenerl.sum()  #归一化
        #滤波
        tmp = out_img.copy()
        for y in range(hight):
            for x in range(width):
                for c in range(coner):
                    out_img[edge + y, edge + x, c]= np.sum(kenerl * tmp[ y:y + self.k, x: x + self.k, c] )

        out_img = np.clip(out_img, 0, 255)
        out_img =out_img[edge:edge+hight, edge:edge+width].astype(np.uint8)
        cv2.imwrite('gauss.jpg', out_img)

if __name__=="__main__":
    img = './example.jpg' #滤波的图片
    k = 5 #卷积核的大小
    sigma = 1.6 #方差
    gauss = Gaussian(img, k, sigma)
    gauss.Gaussian_Filter()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值