图像处理:从数学出发,深刻了解高斯模糊——高斯卷积核
图像处理:从数学出发,深刻了解高斯模糊——高斯卷积核
高斯模糊是一种常用的图像处理技术,通过将图像与高斯核进行卷积来达到模糊效果。本文从数学角度深入解析了高斯模糊的原理,包括一维、二维和多维高斯卷积核的计算方法,并提供了具体的代码实现。
如果你把所有的错误都关在门外时,
真理也要被关在门外面了。
If you shut your door to all errors truth will be shut out.
——《飞鸟集》
前言
高斯模糊(Gaussian Blur)是一种常用的图像处理技术,它通过将图像与高斯核(Gaussian Kernel)进行卷积来达到模糊效果。高斯模糊可以平滑图像,去除噪声和细节,同时保留重要的结构信息。
实现高斯模糊有以下步骤:
创建高斯核:高斯核是一个二维数组,其元素值由高斯函数计算得出。高斯函数是一个钟形曲线,其形状由标准差(sigma)决定。标准差越大,高斯函数的曲线越宽,模糊效果越强。
卷积:将图像与高斯核进行卷积,图像的每个像素与其周围的像素进行加权平均,得到一个新的像素值。高斯核的每个元素值对应于图像的每个像素与其周围的像素的权重。
前导知识
高斯模糊背后的数学原理,可以直接跳转到二维高斯卷积核
线性代数:理解矩阵和向量操作,包括矩阵乘法和向量点积。
概率论和统计学:理解概率分布,特别是正态分布(高斯分布)。
微积分:理解积分和微分,特别是多重积分。
数值计算:理解数值方法,特别是数值积分和数值微分。
协方差
对于二维随机变量
,数学期望
只反映了
与
各自的平均值,而方差
反映的是
与
各自偏离平均值的程度,它们都没有反映
与
的关系。考虑到实际情况中随机变量之间往往相互影响,引入“协方差”概念:
设二维随机变量
,称
为随机变量
与
的协方差,记作
。
对于二维连续型随机变量
对于二维离散型随机变量
随机变量
与
之间的相关系数:
由以下性质:
- 如果
与
相互独立,则 - 的充要条件是存在常数
使得概率
协方差矩阵
设
维随机变量
的 1 + 1 阶混合中心矩存在
则称矩阵
为
维随机变量
的协方差矩阵,且由性质易得
是一个对称矩阵,处于主对角线上的元素即为各个变量的方差,其他位置则是不同变量两两之间的协方差.
协方差矩阵给出了
维随机变量的全部方差及协方差,利用协方差矩阵,我们可以引入
维正态分布的概率密度
多维高斯分布函数
对于
维随机变量
,平均值
,协方差矩阵
,有高斯分布:
记为
。
满足以下性质:
维随机变量
服从
维正态分布的充要条件是
的任意线性组合
服从一维正态分布,其中
不全为零
若
服从
维正态分布,设
是
的线性函数,则
服从
维正态分布
设
服从
维正态分布,则
相互独立的充要条件是
两两不相关
高斯卷积核
了解了多元高斯分布函数之后,我们便可以很容易算出高斯模糊中高斯卷积的卷积核,例如
一维高斯卷积核
一维高斯卷积很少出现在图像处理中,但是广泛应用于音频信号降噪,自然语言处理中词频滤波和降噪等等
为了便于计算,计算机采用标准正态分布
,此时协方差矩阵为 1 x 1 矩阵,值为1 。有一维高斯分布密度函数:
此时有:
对结果进行处理,以便计算机计算:将
项全部约掉,为了获取大小为
的卷积核,我们可以让
的各项同除以
,并四舍五入或向下、向上取整,保证处理后的卷积核最外层值为 1。最后进行归一化处理:
保证
举个例子:
,各项同除
,向上取整得到
- 归一化
代码实现
def get_kernel_1d(kernel_size, sigma):
kernel = []
for i in range(kernel_size):
value = (math.exp(-int(i - (kernel_size - 1) / 2) ** 2 / (2 * sigma ** 2)) / math.exp( - ((kernel_size - 1) / 2) ** 2 / (2 * sigma ** 2)))
kernel.append(math.ceil(value))
kernel = [x / sum(kernel) for x in kernel]
return kernel
运行结果
3,1
[0.25, 0.5, 0.25]
5,2
[0.125, 0.25, 0.25, 0.25, 0.125]
- 该代码有考虑方差不为1的情况,需要注意的是:sigma也就是方差不能为0,不然函数不收敛
二维高斯卷积核
对于二维随机变量
有协方差矩阵:
其中,
表示
的相似程度,当
完全独立时,
协方差矩阵行列式
,其逆矩阵为:
此时,
因此,可以得出二维随机变量
的概率密度函数:
有了概率密度函数,我们只需要带入离散值譬如
,便可以计算出对应位置的值,得到任意大小的高斯卷积核。一般来说,我们采用的向量之间两两正交,即所有的
,协方差矩阵为对角线矩阵
代码实现
def get_kernel_2d(kernel_size, sigma_1, sigma_2, mu_1, mu_2, p):
kernel = [[0 for _ in range(kernel_size)] for _ in range(kernel_size)]
first = math.exp(-(((kernel_size - 1) / 2 - mu_1) ** 2 / (sigma_1 ** 2) + ((kernel_size - 1) / 2 - mu_2) ** 2 / (sigma_2 ** 2) + 2 * p * ((kernel_size - 1) / 2 - mu_1) * ((kernel_size - 1) / 2 - mu_2) / (sigma_1 * sigma_2)))
for i in range(kernel_size):
for j in range(kernel_size):
x_i = i - (kernel_size - 1) / 2
x_j = j - (kernel_size - 1) / 2
value = math.exp(-((x_i - mu_1) ** 2 / (sigma_1 ** 2) + (x_j - mu_2) ** 2 / (sigma_2 ** 2) - 2 * p * (x_i - mu_1) * (x_j - mu_2) / (sigma_1 * sigma_2)))
kernel[i][j] = math.ceil(value / first)
# summation = sum(sum(kernel, []))
# kernel = [[x / summation for x in row] for row in kernel]
return kernel
注意,为了便于观察结果,代码中归一化操作被注释掉了
运行结果
kernel = get_kernel_2d(3, 1,1,0,0,0 )
print(kernel)
[[1, 3, 1], [3, 8, 3], [1, 3, 1]]
------------------------------------------
kernel1 = get_kernel_2d(3, 3,1,0,0,0 )
print(kernel1)
[[1, 3, 1], [2, 4, 2], [1, 3, 1]]
------------------------------------------
kernel2 = get_kernel_2d(3, 3,1,0,0,0.5 )
print(kernel2)
[[2, 4, 1], [2, 5, 2], [1, 4, 2]]
- 与通常使用的卷积核不同,这段代码考虑了sigma_1与sigma_2不同的情况,即:服从椭圆高斯分布,在不同方向上保留原图像的细节不同。
- 通过修改p值,可以更改x、y的相关系数,在三维空间中表现为椭圆高斯分布旋转的角度.需要注意的是:p的值必须在-1到1之间,否则函数值超出了概率函数的约束,会出现非常诡异的结果
图像来源-Gaussian function学习_二维高斯函数-CSDN博客
多维高斯卷积核
三维甚至更高维度的高斯卷积核被运用于三维图像处理,如医学图像处理(如MRI和CT扫描)、生物医学图像处理(如细胞图像)等。它可以用于平滑三维图像,去除噪声和细节,同时保留重要的结构信息
从这里开始,计算将变得相当复杂。涉及到三维,甚至更高维度,我们必须借助线性代数以及计算机的力量,矩阵的计算量可是随着维度的增加而指数级上升的。
根据上面的式子:
求多维高斯卷积核需要实现:
- 矩阵乘法
- 矩阵行列式
- 矩阵转置
- 求逆矩阵
- 求代数余子式
- 求伴随矩阵
- 求协方差
- 求协方差矩阵
该部分不是本文重点,且具体实现过程相当复杂,故不详细展开
参考文章:
[1] 韩旭里,谢永钦. 概率论与数理统计[M]. 2018.
[2] Chuong B. Do. The Multivariate Gaussian Distribution[J]. 2010.
[3] OpenCV--Python 图像平滑之高斯平滑、均值平滑. CSDN博客. 2021.
[4] Gaussian function学习_二维高斯函数-CSDN博客.2019.