1、二维高斯滤波公式:(μ=0,σ)
G(x,y) = 1/2πσ2·exp(-(x2+y2)/2σ2)
G(x,y)可以分离为:G(x,y) = G(x)·G(y)= 1/2πσ2·exp(-x2/2σ2)·exp(-y2/2σ2),其中系数1/2πσ2可以不考虑,因为在归一化时又将其消掉了。
所以,二维的滤波可以分离为两个一维的滤波。
2、假设灰度图像宽高分别为W、H,二维高斯滤波模板宽高均为m_size,那么二维模板直接卷积计算复杂度为O(W*H*m_size*m_size);
同样采用两次一维(横向、纵向)卷积计算的复杂度为O(W*H*m_szie*2),显然计算复杂度降低,滤波模板阶数越高计算速度的提升越明显。
通常根据3σ原则来计算模板阶数,阶数k = 2*ceil(3σ)+1,因为高斯分布中(μ=0)±3σ几乎涵盖了所有的分布,所以可以根据此规则估算合理的模板阶数(奇数)。
3、代码实现中这里使用了自己创建的二维数组,目的是来比对两种滤波的结果,代码如下:
#include
#include
#include
using namespace std;
double** CreateGaussMap(int map_size, double sigma);
double* CreateGauss(int map_size, double sigma);
void GaussFilter2(int src[9][9], double dst[9][9], double** map);
void GaussFilter(int src[9][9], double dst[9][9], double* map);
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
double** gauss2 = CreateGaussMap(3,0.33);
for (int i=0;i<3;++i) {
for (int j=0;j<3;++j) {
cout<
}
cout<
}
cout<