目录
高斯模糊概述
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 变大:
影响的像素区域增大,但计算量也增加。