一文理解什么是高斯模糊

3441

目录

高斯模糊概述

cv2.GaussianBlur() 函数

参数说明

注意:高斯核必须是奇数

示例代码

最佳实践

对比均值模糊

高斯模糊的特点

高斯模糊的计算

1.高斯核的数学公式

(1) 一维高斯函数

(2) 二维高斯函数

2.高斯核的计算方法

(1) 高斯核的计算

(2) 如何用 OpenCV 生成高斯核

3. 高斯模糊的卷积计算

4.小总结

高斯模糊概述

高斯模糊(Gaussian Blur)是一种常见的图像处理技术,它通过卷积操作对图像进行平滑处理,从而减少噪声或细节。它的核心思想是使用**高斯核(Gaussian Kernel)**对图像进行加权平均,使图像中的像素值在一定范围内平滑过渡。

cv2.GaussianBlur() 函数

在 OpenCV 中,cv2.GaussianBlur() 用于对图像进行高斯模糊处理,其基本格式如下:

cv2.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]]) -> dst

参数说明

src:输入图像(可以是灰度图或彩色图)

ksize:高斯核的大小(通常是奇数,如 (3,3)、(5,5))

sigmaX:X 方向的标准差(控制模糊程度,值越大模糊越强)

sigmaY(可选):Y 方向的标准差,默认情况下 sigmaY=sigmaX

borderType(可选):边界填充方式,默认 cv2.BORDER_DEFAULT

注意:高斯核必须是奇数

为什么呢?如下:

中心对称性:高斯滤波的核心是以中心像素为基准,均匀向四周扩散。如果是偶数,则无法确定一个对称的中心点。

卷积计算方便:高斯核是用于卷积运算的,奇数尺寸可以保证左右上下对称,避免边界偏移问题。

OpenCV 规范:OpenCV 规定 ksize 必须为奇数,确保滤波核的正确性。

示例代码

import cv2

# 读取图像

img = cv2.imread("example.jpg")

# 应用高斯模糊

blurred = cv2.GaussianBlur(img, (5,5), 0) # 核大小 (5,5),sigmaX=0 自动计算

# 显示结果

cv2.imshow("Original", img)

cv2.imshow("Gaussian Blur", blurred)

cv2.waitKey(0)

cv2.destroyAllWindows()

参数作用ksize控制模糊区域的大小(必须是奇数)sigmaX控制模糊强度(越大越模糊)

最佳实践

ksize=(3,3) or (5,5): 轻度模糊,适用于去噪。

ksize=(7,7) or (9,9): 强烈模糊,适用于背景模糊处理。

我的原图

在使用高斯模糊核为(5,5)时如下

在使用高斯模糊核为(19,19)时如下

对比均值模糊

对比项均值模糊(cv2.blur)高斯模糊(cv2.GaussianBlur)计算方式取邻域所有像素的平均值取邻域像素的加权均值(中心点权重更高)权重分布所有像素权重相同遵循高斯分布,中心像素权重大,边缘小平滑效果模糊较强,但容易产生人工感更自然,边缘过渡平滑去噪能力适用于简单噪声,容易丢失细节适用于高斯噪声,保留更多图像结构计算速度计算简单,速度快计算复杂,速度较慢

高斯模糊的特点

去噪与平滑:相比均值模糊(cv2.blur),高斯模糊对边缘保留得更好。

参数可控:可以通过 sigmaX 和 ksize 控制模糊程度。

常用于图像处理:

降噪(如人脸识别前的预处理)

生成模糊效果

作为 Canny 边缘检测的预处理步骤

高斯模糊的计算

1.高斯核的数学公式

高斯模糊的核心是 高斯核(Gaussian Kernel),它是基于 二维高斯函数(Gaussian Function) 生成的权重矩阵,用于对图像进行卷积操作,从而达到平滑和降噪的效果。

(1) 一维高斯函数

高斯函数的标准公式如下:

其中:

x 表示距离中心点的像素偏移量

(标准差)控制模糊程度,值越大,模糊越强

e 是自然对数的底数,约等于 2.718

这个公式描述的是一维高斯分布,它在 x = 0 处的值最大,然后随着 x 远离中心逐渐减小,形成钟形曲线。

可视化效果:

(2) 二维高斯函数

对于图像处理,我们需要二维高斯分布,其公式为:

其中:

x,y 是像素相对于核中心的偏移量

控制模糊程度

分母部分 确保总和归一化,使得整个核的权重和为1

可视化效果:

这个公式的结果是一个 二维钟形曲面,即中心值最大,四周逐渐减小。

形成的高斯核是对称的,保证了平滑效果不会偏向某个方向。

等高线图(可以理解为俯视图)

2.高斯核的计算方法

高斯模糊的核心是生成高斯核(权重矩阵),这个矩阵的每个元素都是由高斯函数计算得到的数值,然后用它对图像做卷积运算。

(1) 高斯核的计算

以一个 5×5 高斯核为例,设定 ,我们可以计算出如下的权重矩阵:

然后,将这些值归一化(即使所有数加起来等于 1),得到:

特点:

核心区域(中间部分)的值较大,代表影响权重更高。

外围区域的值较小,表示远离中心的像素影响较小。

这个矩阵对整张图像进行卷积操作,计算每个像素的新值。

(2) 如何用 OpenCV 生成高斯核

可以用 OpenCV 的 cv2.getGaussianKernel() 生成一维高斯核:

import cv2

import numpy as np

# 生成 5x1 的高斯核(sigma=1)

gaussian_kernel = cv2.getGaussianKernel(5, 1)

print(gaussian_kernel)

输出:

[[0.05448868] [0.24420134] [0.40261995] [0.24420134] [0.05448868]]

要 2D 高斯核,可以使用:

kernel_2d = gaussian_kernel @ gaussian_kernel.T

print(kernel_2d)

这段代码直接加进去就好了,不影响输出

输出:

[[0.00296902 0.01330621 0.02193823 0.01330621 0.00296902] [0.01330621 0.0596343 0.09832033 0.0596343 0.01330621] [0.02193823 0.09832033 0.16210282 0.09832033 0.02193823] [0.01330621 0.0596343 0.09832033 0.0596343 0.01330621] [0.00296902 0.01330621 0.02193823 0.01330621 0.00296902]]

这里的 @ 是矩阵乘法,相当于计算二维高斯核。

3. 高斯模糊的卷积计算

高斯模糊的实现方式是用高斯核对图像进行卷积操作:

I(x,y): 原始图像的像素值(输入图像)。I′(x,y): 模糊后的图像的像素值(输出图像)。G(i,j): 高斯核(滤波器),是一个二维矩阵,表示权重分布。k: 高斯核的半径,决定了邻域的大小(通常为 (2k+1)×(2k+1) 的矩阵)。i,j: 遍历高斯核的索引。

对于图像中的每个像素点 (x,y),通过高斯核 G(i,j) 在其邻域内滑动,计算该像素及其周围像素的加权平均值。权重由高斯核 G(i,j) 提供,距离中心越近的像素权重越大,距离越远的像素权重越小。最终,模糊后的像素值 I′(x,y) 是邻域内所有像素值的加权和。

4.小总结

概念说明高斯函数控制模糊程度的数学模型,形成钟形曲线二维高斯核计算高斯权重的矩阵,决定像素的模糊程度高斯卷积使用高斯核与图像做卷积,实现模糊效果关键参数sigma 控制模糊程度,ksize 决定卷积窗口大小(必须为奇数)

如果 sigma 变大:

高斯分布更宽,导致模糊程度更强。

如果 ksize 变大:

影响的像素区域增大,但计算量也增加。