【3.15】matlab 高斯滤波,快速滤波

Gauss滤波快速实现方法(转)

  二维高斯函数具备旋转对称性,处理后不会对哪个方向上的边缘进行了过多的滤波,所以相对其余滤波器,具备没法比拟的优越性。可是传统Gauss滤波随着图像尺寸的增长,运算复杂度呈平方上涨,所以须要对其优化改进。下面,分别介绍传统型,分解型和递归迭代型三种实现方法。算法

  

1 传统型

  Gauss滤波首先须要构建一个Gauss滤波核,公式为:函数

Matlab实现代码:post

dSigma =0.8;
fK1=1.0/(2*dSigma*dSigma);
fK2=fK1/pi;
iSize = 5;
step = floor(iSize/2 + 0.5);
for i = 1 : iSize
    x=i-step;
    fTemp=fK2*exp(-x*x*fK1);
    for j = 1 : iSize
        y=j-step;
        model(x+step,y+step)=fTemp*exp(-y*y*fK1);
    end
end
dSum = sum(sum(model));
model = model/dSum;                     %Gauss核数值归一化

  

  

图1 Gauss滤波核(5*5大小)优化

  接下来就是将输入图像和滤波核进行卷积操做。其实质就是对原始图像进行加权求和,把这个“和”赋给中心像素。对于一个2048*2048的图像,须要进行104734756次乘法运算,和104734756次加法运算,运算复杂度是很高的。orm

2 分解型

  

  咱们能够把一个二维Gauss核分解为两个一维高斯核,而后先对行作一次一维卷积,再对这个卷积结果作一次一维列卷积,获得的结果彻底如出一辙,而开销会小不少。blog

一维高斯核函数:递归

  Matlab代码实现:get

dSigma =0.8;
fK1=1.0/(2*dSigma*dSigma);
fK2=fK1/pi;
iSize = 5;
step = floor(iSize/2 + 0.5);
for i = 1 : iSize
    x=i-step;
    fTemp=fK2*exp(-x*x*fK1);
    model(1,x+step) = fTemp;
end
dM = sum(model);
model = model / dM;

  

图2 一维高斯滤波核(1*5大小)it

  一维卷积原理和二维卷积同样,只不过咱们只须要将同一行或同一列上的数据,按位置一一加权求和,再把“和”赋给中心元素。io

  对于一个2048*2048的图像,须要进行41918464次乘法运算,和41918464次加法运算。相比传统运算量,只是前者的1/2.4985。若是遇到频繁计算Gauss滤波的算法,后者明显比前者速度快不少。

3 递归迭代型

  第二种方法较第一种方法,虽然有了较大改善,可是任然复杂度较高。这里再介绍一种更快速的逼近Gauss滤波方法。

     具体步骤分为两步:首先对图像作一次前向滤波,其次,对图像再作一次后向滤波。

  Forward:

  Backward:

qFactor = 5;
b0Coeff = 1.57825 + (2.44413 * qFactor) + (1.4281 * qFactor * qFactor) + (0.422205 * qFactor * qFactor * qFactor);
b1Coeff = (2.44413 * qFactor) + (2.85619 * qFactor * qFactor) + (1.26661 * qFactor * qFactor * qFactor);
b2Coeff = (-1.4281 * qFactor * qFactor) + (-1.26661 * qFactor * qFactor * qFactor);
b3Coeff = 0.422205 * qFactor * qFactor * qFactor;
normalizationCoeff = 1 - ((b1Coeff + b2Coeff + b3Coeff) / b0Coeff);
vDenCoeff = [b0Coeff, -b1Coeff, -b2Coeff, -b3Coeff] / b0Coeff;
vXSignal = zeros(61, 1);
vXSignal(31) = 10;
vYSignal = filter(normalizationCoeff, vDenCoeff, vXSignal);
vYSignal = filter(normalizationCoeff, vDenCoeff, vYSignal(end:-1:1));
figure();
plot(vYSignal);

  

参考资料:Recursive implementation of the Gaussian filter。 Ian T. Young,1995

     http://dsp.stackexchange.com/questions/22075/recursive-implementation-of-the-gaussian-filter

相关文章
相关标签/搜索