高斯模糊(高斯平滑)通常用来减少图像噪声以及降低细节层次. 这种模糊技术生成的图像, 其视觉效果就像是经过一个半透明屏幕在观察图像, 这与镜头焦外成像效果散景以及普通照明阴影中的效果都明显不同. 高斯平滑也用于计算机视觉算法中的预先处理阶段, 以增强图像在不同比例大小下的图像效果(参见尺度空间表示以及尺度空间实现). 从数学的角度来看, 图像的高斯模糊过程就是图像与正态分布做卷积. 由于正态分布又叫作高斯分布, 所以这项技术就叫作高斯模糊. 图像与圆形方框模糊做卷积将会生成更加精确的焦外成像效果. 由于高斯函数的傅立叶变换是另外一个高斯函数, 所以高斯模糊对于图像来说就是一个低通滤波器.

机理

高斯模糊是一种图像模糊滤波器, 它用正态分布计算图像中每个像素的变换. N维空间正态分布方程为
java 高斯模糊算法GaussianBlur原理与实践 高斯模糊的应用_正态分布
在二维空间定义为
java 高斯模糊算法GaussianBlur原理与实践 高斯模糊的应用_数字图像处理_02
其中 r 是模糊半径java 高斯模糊算法GaussianBlur原理与实践 高斯模糊的应用_数字图像处理_03, σ 是正态分布的标准偏差. 在二维空间中, 这个公式生成的曲面的等高线是从中心开始呈正态分布的同心圆. 分布不为零的像素组成的卷积矩阵与原始图像做变换. 每个像素的值都是周围相邻像素值的加权平均. 原始像素的值有最大的高斯分布值, 所以有最大的权重, 相邻像素随着距离原始像素越来越远, 其权重也越来越小. 这样进行模糊处理比其它的均衡模糊滤波器更高地保留了边缘效果.

import math
import numpy as np
import scipy.signal
import cv2

def get_cv(r, sigma):
    return 1 / (2 * math.pi * sigma ** 2) * math.exp((-r ** 2) / (2 * sigma ** 2))

def get_kernel():
    radius, sigma = 2, 1.5
    kernel = np.zeros((radius * 2 + 1, radius * 2 + 1))
    for i in range(-radius, radius + 1):
        for j in range(-radius, radius + 1):
            r = (i ** 2 + j ** 2) ** 0.5
            kernel[i + radius][j + radius] = get_cv(r, sigma)
    return kernel / np.sum(kernel)

def convert_2d(r):
    kernel = get_kernel()
    s = scipy.signal.convolve2d(r,kernel,mode='same',boundary='symm')
    return s.astype(np.uint8)

def convert_3d(r):
    s_dsplit = []
    for d in range(r.shape[2]):
        rr = r[:,:,d]
        ss = convert_2d(rr)
        s_dsplit.append(ss)
    s = np.dstack(s_dsplit)
    return s

im = cv2.imread('tetet.jpg')
im_convert_mat = convert_3d(im)
cv2.imshow('gaosi',im_convert_mat)
cv2.imwrite('gaosi.jpg',im_convert_mat)
cv2.waitKey()

java 高斯模糊算法GaussianBlur原理与实践 高斯模糊的应用_正态分布_04


java 高斯模糊算法GaussianBlur原理与实践 高斯模糊的应用_高斯模糊_05