手动实现高斯滤波

使用高斯滤波器( 3 × 3 3\times3 3×3大小,标准差 σ = 1.3 \sigma=1.3 σ=1.3)来对lena.jpg进行降噪处理!

高斯滤波器是一种可以使图像平滑的滤波器,用于去除噪声。可用于去除噪声的滤波器还有中值滤波器,平滑滤波器、LoG滤波器。

高斯滤波器将中心像素周围的像素按照高斯分布加权平均进行平滑化。这样的(二维)权值通常被称为卷积核(kernel)或者滤波器(filter)

但是,由于图像的长宽可能不是滤波器大小的整数倍,因此我们需要在图像的边缘补 0 0 0。这种方法称作Zero Padding。并且权值 g g g(卷积核)要进行归一化操作 ∑   g = 1 \sum\ g = 1  g=1)。

按下面的高斯分布公式计算权值:
g ( x , y , σ ) = 1 2   π   σ 2   e − x 2 + y 2 2   σ 2 g(x,y,\sigma)=\frac{1}{2\ \pi\ \sigma^2}\ e^{-\frac{x^2+y^2}{2\ \sigma^2}} g(x,y,σ)=2 π σ21 e2 σ2x2+y2

标准差 σ = 1.3 \sigma=1.3 σ=1.3 8 − 8- 8近邻高斯滤波器如下:
K = 1 16   [ 1 2 1 2 4 2 1 2 1 ] K=\frac{1}{16}\ \left[ \begin{matrix} 1 & 2 & 1 \\ 2 & 4 & 2 \\ 1 & 2 & 1 \end{matrix} \right] K=161 121242121

# -*- coding: utf-8 -*-
"""
Created on Sat Jul 11 14:53:28 2020

@author: 陨星落云
"""
import imageio
import numpy as np

def GaussianFilter(img):
    
    h,w,c = img.shape
    # 高斯滤波 
    K_size = 3
    sigma = 1.3
    
    # 零填充
    pad = K_size//2
    out = np.zeros((h + 2*pad,w + 2*pad,c),dtype=np.float)
    out[pad:pad+h,pad:pad+w] = img.copy().astype(np.float)
    
    # 定义滤波核
    K = np.zeros((K_size,K_size),dtype=np.float)
    
    for x in range(-pad,-pad+K_size):
        for y in range(-pad,-pad+K_size):
            K[y+pad,x+pad] = np.exp(-(x**2+y**2)/(2*(sigma**2)))
    K /= (sigma*np.sqrt(2*np.pi))
    K /=  K.sum()
    
    # 卷积的过程
    tmp = out.copy()
    for y in range(h):
        for x in range(w):
            for ci in range(c):
                out[pad+y,pad+x,ci] = np.sum(K*tmp[y:y+K_size,x:x+K_size,ci])
    
    out = out[pad:pad+h,pad:pad+w].astype(np.uint8)
    
    return out

if __name__ == "__main__":
    
    # 读取图像
    img = imageio.imread("lena.jpg")
    # 高斯滤波
    imageio.imsave("GaussianFilter.jpg",GaussianFilter(img))

结果:
在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐