快速高斯滤波、高斯模糊、高斯平滑(二维卷积分步为一维卷积)

高斯滤波(Gauss Filter)是线性滤波中的一种。在OpenCV图像滤波处理中,高斯滤波用于平滑图像,或者说是图像模糊处理,因此高斯滤波是低通的。其广泛的应用在图像处理的减噪过程中,尤其是被高斯噪声所污染的图像上。
高斯滤波的基本思想是: 图像上的每一个像素点的值,都由其本身和邻域内其他像素点的值经过加权平均后得到。其具体操作是,用一个核(又称为卷积核、掩模、矩阵)扫描图像中每一个像素点,将邻域内各个像素值与对应位置的权值相称并求和。从数学的角度来看,高斯滤波的过程是图像与高斯正态分布做卷积操作。
注意: 高斯滤波是将二维高斯正态分布放在图像矩阵上做卷积运算。考虑的是邻域内像素值的空间距离关系,因此对彩色图像处理时应分通道进行操作,也就是说操作的图像原矩阵时用单通道数据,最后合并为彩色图像。

本章节仅讨论快速高斯滤波的实现,如对高斯滤波的基本原理和实现不理解的,可以先看之前的一篇
OpenCV高斯滤波器详解及代码实现

一、高斯函数分离特性

这里写图片描述
可以看到,高斯二维公式可以推导为X轴与Y轴上的一维高斯公式。而图形矩阵是二维的,高斯滤波就是将核范围中的各个点的坐标带入高斯二维公式,得出在核矩阵上的空间分布特性,这些特性将作为权值反应在核矩阵的各个点上。最终使用核与图像矩阵作卷积运算得到处理图像。

在之前的那篇高斯滤波文章上,采用的二维方式实现的。假设一张单通道图片大小(M*N),核大小(size*size),核上的(size*size)个点都将被计算权值。最终实现的复杂度为 (M*N*size*size)。
而如果将二维分步成X轴Y轴的一维处理。在X轴上计算size个点,Y轴上size个点。其复杂度将优化到 (M*N*size*2).
注意:先使用X轴方向(Y轴方向)对整个图像矩阵作卷积,再在Y轴方向(X轴方向)对整个图像矩阵作卷积。

二、高斯二维的空间分布

二维高斯是构建高斯滤波器的基础。可以看到,G(x,y)在x轴y轴上的分布是一个突起的帽子的形状。这里的sigma可以看作两个值,一个是x轴上的分量sigmaX,另一个是y轴上的分量sigmaY。对图像处理可以直接使用sigma并对图像的行列操作,也可以用sigmaX对图像的行操作,再用sigmaY对图像的列操作。它们是等价的。
当sigmaX和sigmaY取值越大,整个形状趋近于扁平;当sigmaX和sigmaY取值越小,整个形状越突起。
假设核大小为(size*size),那么核上(size*size)个点都将计算权值。
这里写图片描述

三、高斯二维分步为X轴Y轴的高斯一维

假设一个(3*3)的核,在X轴(k方向)上
这里写图片描述

在Y轴(l方向)上

### 高斯噪声积核的概念 高斯滤波是一种基于高斯函数构建的线性平滑滤波器,主要用于减少图像中的随机噪声。其核心在于使用一个二维高斯分布作为权重矩阵来计算邻域像素值的加权平均[^1]。 具体来说,高斯积核是一个由高斯函数离散化得到的小矩阵,用于表示不同位置处的重要性程度。当应用于图像时,中心点附近的像素会被赋予更高的权重,而远离中心的位置则逐渐减小影响力度。这种特性使得高斯模糊能够在保持边缘信息的同时有效地去除高频成分如椒盐噪音或者服从正态分布的其他形式干扰信号[^2]。 ### 实现方法 为了实现高效的高斯滤波操作,通常会采用分策略: #### 计算一维高斯系数 先创建一个大小为 \(N\) 的向量 `gaussianKernel` 来存储沿单一方向的一维高斯响应: ```cpp std::vector<float> gaussianKernel(int N, float sigma){ std::vector<float> kernel(N); double sum = 0; int center = floor((double)(N-1)/2); // 中心索引 for (int i=0; i<N ; ++i){ kernel[i]=exp(-pow(i-center,2)/(2*pow(sigma,2))); sum +=kernel[i]; } // 归一化 for(auto& k : kernel){ k /=sum; } return kernel; } ``` #### 应用分离式两遍扫描法 利用可分离性质简化多维度空间内的复杂度问题,即分别沿着水平轴和垂直轴执行两次独立的一维卷积过程即可达到相同效果。 ```cpp void applyGaussianBlur(const cv::Mat &inputImage,cv::Mat &outputImage,float sigma,int radius){ auto gaussX = gaussianKernel(radius*2+1,sigma); outputImage.create(inputImage.size(), inputImage.type()); // Horizontal pass cv::sepFilter2D(inputImage,outputImage,-1, gaussX,cv::noArray(), cv::Point(-1,-1),0,cv::BORDER_DEFAULT); // Vertical pass cv::sepFilter2D(outputImage,outputImage,-1, cv::noArray(),gaussX, cv::Point(-1,-1),0,cv::BORDER_DEFAULT); } ``` 上述代码片段展示了如何通过OpenCV库完成高效且精确的高斯模糊处理流程[^3]。 ### 应用场景 高斯滤波广泛应用于计算机视觉领域,特别是在预处理阶段用来改善后续算法性能方面表现突出。例如,在物体检测之前进行适当强度下的柔化能够帮助减轻光照变化带来的负面影响;另外还可以辅助边界提取任务中降低细碎轮廓的影响从而提高识别精度等.
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值