1、什么是高斯滤波器
其中(x,y)" role="presentation" style=" box-sizing: border-box; outline: 0px; display: inline; line-height: normal; word-spacing: normal; overflow-wrap: break-word; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; ">(x,y)为点坐标,在图像处理中可认为是整数;σσ" role="presentation" style=" box-sizing: border-box; outline: 0px; display: inline; line-height: normal; word-spacing: normal; overflow-wrap: break-word; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; ">σ是标准差。要想得到一个高斯滤波器的模板,可以对高斯函数进行离散化,得到的高斯函数值作为模板的系数。例如:要产生一个3x3的高斯滤波器模板,以模板的中心位置为坐标原点进行取样。模板在各个位置的坐标,如下所示(x轴水平向右,y轴竖直向下)
这样,将各个位置的坐标带入到高斯函数中,得到的值就是模板的系数。对于窗口模板的大小为 (2k+1)x(2k+1),模板中各个元素值的计算公式如下:
2、高斯卷积的可分离性
对图像?(?, ?)与ℎ(?, ?)进行卷积与运算,记边界索引? = (? − 1)/2,即:
3、运算量分析
3.1 直接进行二维卷积
3.2 两次一维卷积
3.3、关于减少运算量的解释
相比于直接使用二维卷积,虽然当卷积函数具有一定对称性时,也具有简化的空间,但是一般而言,直接进行二维卷积是无法进行计算值复用的,这使得二维可分离卷积分离后的运算量更小。
4、高斯滤波器的使用
4.1
int main(void){
// [1] src读入图片 cv::Mat src = cv::imread("Gaussian_pic.jpg"); // [2] dst目标图片 cv::Mat dst; cv::Mat dst2 = src.clone(); // [3] 高斯滤波 sigma越大越平越模糊 myGaussianFilterFast(&src, &dst, 53, 2.0f, 2.0f); // [4] 窗体显示 cv::imshow("src", src); cv::imshow("dst", dst); cv::waitKey(0); cv::destroyAllWindows(); return 0;}
void myGaussianFilterFast(cv::Mat *src, cv::Mat *dst, int n, double sigmaX, double sigmaY){
// [1] 初始化 *dst = (*src).clone(); // [2] 彩色图片通道分离 std::vector<:mat> channels; cv::split(*src, channels);