【C++】图像处理中的滤波算法(二)

简介: 总结一下图像处理中常用的几种滤波算法,包括中值、均值、高斯、双边、引导滤波这五种,主要用于图像平滑去噪方面。滤波算法的基本思路,就是采用周边像素,加权平均计算一个新的像素,来缓减噪声对当前像素的影响。

高斯滤波

高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。 [1]  通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。


二维高斯函数:

b174009b3e434a3a90f66273f580f773.png

5*5卷积核:

388831093a5c4f6486f8a29f5429cbc7.png

二维高斯函数公式如下:


388831093a5c4f6486f8a29f5429cbc7.png

二维高斯函数公式如下:

444ccba6b6b94f84a8e6e8aed866cda7.png

opencv提供高斯滤波函数GaussianBlur():

CV_EXPORTS_WvoidGaussianBlur( InputArraysrc, OutputArraydst, Sizeksize,
doublesigmaX, doublesigmaY=0,
intborderType=BORDER_DEFAULT );

C++实现:

#include <iostream>#include <string>#include <opencv2/opencv.hpp>#define GAUSS_NOISE         "GaussNoise_127"#define FILE_TYPE           ".png"#define GAUSS_NOISE_FILE    string(GAUSS_NOISE)+string(FILE_TYPE)#define MEANS               127#define STANDARD_DAV        10#define MAX_KERNEL_SIZE     500#define MAX_SIGMA           255usingnamespacestd;
usingnamespacecv;
staticvoidshowImgPara(Mat&img);
staticvoidshowImgMinMaxMeansStdev(Mat&img);
staticvoidkernelSizeCallBack(int, void*);
staticvoidxSigmaCallBack(int, void*);
staticvoidySigmaCallBack(int, void*);
MatgImgOri, gImgGauss, gImgGaussFilter;
intgKernelSize=11;
intgXSigma=10;
intgYSigma=10;
intmain()
{
/* Original Image */gImgOri=imread("original.png", IMREAD_GRAYSCALE);
if (gImgOri.empty())
    {
cout<<"Cannot find original picture!!"<<endl;
returnfalse;
    }
imshow("imgOri", gImgOri);
//showImgPara(gImgOri);showImgMinMaxMeansStdev(gImgOri);
/* Gauss Noise Picture Create */gImgGauss=imread(GAUSS_NOISE_FILE, IMREAD_GRAYSCALE);
if (gImgGauss.empty())
    {
cout<<"Cannot find noise picture!!"<<endl;
returnfalse;
    }
imshow("imgGauss", gImgGauss);
//showImgPara(gImgGauss);showImgMinMaxMeansStdev(gImgGauss);
/* Gauss filter *///GaussianBlur(gImgGauss, gImgGaussFilter, Size(7, 7), 10, 10);GaussianBlur(gImgGauss, gImgGaussFilter, Size(gKernelSize, gKernelSize), gXSigma, gYSigma);
imshow("Gauss Filter Out", gImgGaussFilter);
showImgMinMaxMeansStdev(gImgGaussFilter);
/* Add Bar */cv::createTrackbar("Kernel Size", "Gauss Filter Out", &gKernelSize, MAX_KERNEL_SIZE, kernelSizeCallBack);
cv::createTrackbar("X Sigma", "Gauss Filter Out", &gXSigma, MAX_KERNEL_SIZE, xSigmaCallBack);
cv::createTrackbar("Y Sigma", "Gauss Filter Out", &gYSigma, MAX_KERNEL_SIZE, ySigmaCallBack);
waitKey(0);
returntrue;
}
staticvoidshowImgPara(Mat&img)
{
cout<<"sizeof(img) is: "<<sizeof(img) <<", img size is: "<<img.size<<endl;
cout<<"rows x cols: ("<<img.rows<<" x "<<img.cols<<")"<<endl;
cout<<"dims: "<<img.dims<<endl;
cout<<"channels: "<<img.channels() <<endl;
cout<<"type: "<<img.type() <<endl;
cout<<"depth:"<<img.depth() <<endl;
cout<<"elemSize:"<<img.elemSize() <<" (Bytes per element)"<<endl;
cout<<"elemSize1:"<<img.elemSize1() <<"(Bytes per channel)"<<endl;
cout<<"step[0]: "<<img.step[0] <<" (Bytes per cows only when 2 dims)"<<endl;
cout<<"step[1]: "<<img.step[1] <<" (Bytes per element only when 2 dims)"<<endl;
cout<<"step1(0): "<<img.step1(0) <<", step1(1): "<<img.step1(1) <<" (step / elemSize1)"<<endl;
cout<<"----showImgPara End----"<<endl;
}
staticvoidshowImgMinMaxMeansStdev(Mat&img)
{
/* Max and Min value and location */doubleminValue, maxValue;
PointminLdx, maxLdx;
minMaxLoc(img, &minValue, &maxValue, &minLdx, &maxLdx, Mat());
cout<<"Min: "<<minValue<<"["<<minLdx<<"]"<<endl;
cout<<"Max: "<<maxValue<<"["<<maxLdx<<"]"<<endl;
/* means and stdev*/Matmeans, stdev;
meanStdDev(img, means, stdev);
cout<<"Means: "<<means.at<double>(0, 0) <<endl;
cout<<"Standard Deviationst: "<<stdev.at<double>(0, 0) <<endl;
cout<<"----showImgMinMaxMeansStdev End----\n"<<endl;
}
staticvoidkernelSizeCallBack(int, void*)
{
if (gKernelSize%2==0)
    {
gKernelSize=gKernelSize+1;
    }
GaussianBlur(gImgGauss, gImgGaussFilter, Size(gKernelSize, gKernelSize), gXSigma, gYSigma);
imshow("Gauss Filter Out", gImgGaussFilter);
showImgMinMaxMeansStdev(gImgGaussFilter);
}
staticvoidxSigmaCallBack(int, void*)
{
GaussianBlur(gImgGauss, gImgGaussFilter, Size(gKernelSize, gKernelSize), gXSigma, gYSigma);
imshow("Gauss Filter Out", gImgGaussFilter);
showImgMinMaxMeansStdev(gImgGaussFilter);
}
staticvoidySigmaCallBack(int, void*)
{
GaussianBlur(gImgGauss, gImgGaussFilter, Size(gKernelSize, gKernelSize), gXSigma, gYSigma);
imshow("Gauss Filter Out", gImgGaussFilter);
showImgMinMaxMeansStdev(gImgGaussFilter);
}
目录
相关文章
|
2月前
|
算法 测试技术 C++
【动态规划算法】蓝桥杯填充问题(C/C++)
【动态规划算法】蓝桥杯填充问题(C/C++)
|
2月前
|
存储 算法 C++
高精度算法(加、减、乘、除,使用c++实现)
高精度算法(加、减、乘、除,使用c++实现)
570 0
高精度算法(加、减、乘、除,使用c++实现)
|
2月前
|
算法 数据处理 C++
c++ STL划分算法;partition()、partition_copy()、stable_partition()、partition_point()详解
这些算法是C++ STL中处理和组织数据的强大工具,能够高效地实现复杂的数据处理逻辑。理解它们的差异和应用场景,将有助于编写更加高效和清晰的C++代码。
29 0
|
2月前
|
存储 算法 决策智能
【算法】博弈论(C/C++)
【算法】博弈论(C/C++)
|
2月前
|
存储 算法 C++
【算法】哈希映射(C/C++)
【算法】哈希映射(C/C++)
|
2月前
|
机器学习/深度学习 人工智能 算法
【算法】最长公共子序列(C/C++)
【算法】最长公共子序列(C/C++)
|
2月前
|
人工智能 算法 BI
一篇带你速通差分算法(C/C++)
一篇带你速通差分算法(C/C++)
|
2月前
|
人工智能 算法 C++
一篇带你速通前缀和算法(C/C++)
一篇带你速通前缀和算法(C/C++)
|
2月前
|
存储 算法 C++
弗洛伊德(Floyd)算法(C/C++)
弗洛伊德(Floyd)算法(C/C++)
|
2月前
|
存储 算法 程序员
迪杰斯特拉(Dijkstra)算法(C/C++)
迪杰斯特拉(Dijkstra)算法(C/C++)