高斯卷积的原理及实现(python)

高斯卷积的算法流程:

①对图像进行zero padding

②根据高斯滤波器的核大小和标准差大小实现高斯滤波器

③使用高斯滤波器对图像进行滤波(相乘再相加)

④输出高斯滤波后的图像

高斯卷积核公式:

ux,uy表示中心坐标,中心坐标为(0,0)

x为(-1,1),y为(-1, 1)

而卷积核初始化时坐标只能从(0,0)开始,所以要一一对应上

σ的意义及选取

通过上述的实现过程,不难发现,高斯滤波器模板的生成最重要的参数就是高斯分布的标准差σ。标准差代表着数据的离散程度,如果σ较小,那么生成的模板的中心系数较大,而周围的系数较小,这样对图像的平滑效果就不是很明显;反之,σ较大,则生成的模板的各个系数相差就不是很大,比较类似均值模板,对图像的平滑效果比较明显

import cv2
 
import numpy as np
 
# Gaussian filter
 
def gaussian_filter(img, K_size=3, sigma=1.3):
 
    if len(img.shape) == 3:
 
        H, W, C = img.shape
 
    else:
 
        img = np.expand_dims(img, axis=-1)
 
        H, W, C = img.shape
 
    ## Zero padding
 
    pad = K_size // 2
 
    out = np.zeros((H + pad * 2, W + pad * 2, C), dtype=np.float)
 
    out[pad: pad + H, pad: pad + W] = img.copy().astype(np.float)
 
    ## prepare Kernel
 
    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 /= (2 * np.pi * sigma * sigma)
 
    K /= K.sum()
 
    tmp = out.copy()
 
    # filtering
 
    for y in range(H):
 
        for x in range(W):
 
            for c in range(C):
 
                out[pad + y, pad + x, c] = np.sum(K * tmp[y: y + K_size, x: x + K_size, c])
 
    out = np.clip(out, 0, 255)
 
    out = out[pad: pad + H, pad: pad + W].astype(np.uint8)
 
    return out
 
# Read image
 
img = cv2.imread("../paojie.jpg")
 
# Gaussian Filter
 
out = gaussian_filter(img, K_size=3, sigma=1.3)
 
# Save result
 
cv2.imwrite("out.jpg", out)
 
cv2.imshow("result", out)
 
cv2.waitKey(0)
 
cv2.destroyAllWindows()

参考博客:

https://blog.csdn.net/Ibelievesunshine/article/details/104881204

你可能感兴趣的:(python,opencv,python)