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

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

1 传统型

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

3f3fd4e3285e72f70f176b40ad210bbf.png

Matlab实现代码:

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核数值归一化

7a81adfe7e3ea37ed5054043e7548a9f.png

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

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

2 分解型

我们可以把一个二维Gauss核分解为两个一维高斯核,然后先对行做一次一维卷积,再对这个卷积结果做一次一维列卷积,得到的结果完全一模一样,而开销会小很多。

一维高斯核函数:

5283822a18451e1803befb1af4261f85.png

Matlab代码实现:

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;

2cd5172d28a52e7485decf69f8ce37a4.png

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

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

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

3 递归迭代型

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

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

Forward:

b7ba968f6f95fcd5fc0332bec1f632f8.png

Backward:

e6ac69e1c5ca17663a9a2598ea98ef23.png

90bcc5b177f7bc7b2fdd5796d60070ec.png

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);

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

原文:http://www.cnblogs.com/miki-52/p/5289062.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 一维滤波是一种常用的图像处理方法,可以平滑图像并去除噪声。Matlab中提供了非常简单易用的一维滤波函数。 一维滤波涉及到一个斯核函数,其定义如下: $G(x) = \frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{x^2}{2\sigma^2}}$ 其中,$x$表示距离中心点的偏移量,$\sigma$表示标准差,决定了斯分布曲线的形状。一维滤波的核函数只在一个维度上进行,可以看作是一个垂直于图像的线。将该核函数应用于图像上的每一个像素,计算每个像素的新值,从而实现图像的平滑处理。 在Matlab中,使用“imfilter”函数可以实现一维滤波。具体语法如下: B = imfilter(A, h) 其中,A是需要处理的图像,h是斯核函数。将B赋值为imfilter函数的输出结果,即可得到一维滤波后的图像。 需要注意的是,在使用一维滤波时,应该选择合适的标准差,以达到最佳的平滑效果。过大或者过小的标准差都会导致图像信息的损失,影响图像处理效果。同时,一维滤波也只适用于线性平滑,如果图像中包含了非线性的信息,可能需要使用其他的滤波方法。 ### 回答2: Matlab一维滤波用于对一维信号的平滑处理,主要基于斯分布的特性,可以去除一些随机噪声、提取有效信号等。其数学模型为: G(x)=1/(√2πσ)exp(-(x-μ)²/(2σ²)) 其中G(x)表示斯分布函数,x表示信号的每个数据点,μ代表分布的均值,σ代表方差。在Matlab中,可以采用内置函数gausswin(n,α)生成卷积核,其中n表示生成核的长度,α表示斯窗口的形状。然后,可以使用Matlab内置的卷积函数conv(x,h)对信号进行滤波处理,其中x为原始信号,h为采用gausswin函数生成的卷积核。具体步骤如下: 1. 生成斯窗口 由于斯窗口的形状不同,所得到的滤波效果也不同。常采用默认的形状,例如gausswin(n)生成一个长度为n的斯窗口,默认的窗口形状为α=0.5,也可以手动设定。 2. 原信号与斯窗口卷积 由于Matlab内置的卷积函数是线性卷积函数,而斯函数是非线性函数,因此需要对斯函数进行中心对称化处理。处理方法为将斯窗口翻转一下再与原始信号的卷积,这样可以避免信号边缘的信息丢失。 3. 执行滤波操作 对卷积结果进行滤波操作,可以使用内置函数filter()实现。也可以使用移动平均法或其它滤波方法处理。 4. 画出滤波结果的波形图 为了更直观地了解信号的变化、滤波效果的好坏、优化滤波参数等,需要将滤波后的结果绘制成波形图。 总之,Matlab中的一维滤波是利用斯函数对信号进行平滑处理、去除噪声的算法,在信号处理、图像处理、数据挖掘等领域具有广泛应用。 ### 回答3: 一维滤波是一种常用的信号处理方法,通常用于去除信号中的噪声等干扰。在 MATLAB 中,可以使用 Gausswin 函数生成斯窗口,并使用 conv 函数对信号进行滤波。 具体步骤如下: 1. 生成斯窗口。可以使用 Gausswin 函数,其语法为 w = gausswin(N,alpha),其中 N 表示窗口长度,alpha 表示斯窗口的标准差。例如,可以生成长度为 11,标准差为 2 的斯窗口: w = gausswin(11,2); 2. 对信号进行滤波。可以使用 conv 函数,其语法为 y = conv(x,w),其中 x 表示输入信号,w 表示斯窗口。例如,可以对信号 x 进行滤波: y = conv(x,w); 需要注意的是,在进行卷积操作时需要选择合适的边界条件,以避免滤波后信号长度发生变化。可以使用 padarray 函数在信号两端填充适当的值。 此外,还可以使用 gaussfilt 函数对信号进行滤波,其语法为 y = gaussfilt(x,sigma),其中 x 表示输入信号,sigma 表示滤波器的标准差。例如,可以对信号 x 进行标准差为 2 的滤波: y = gaussfilt(x,2); 总之,一维滤波是一种简单而常用的信号处理方法,可以有效地去除信号中的噪声和干扰。在 MATLAB 中,可以选择使用 Gausswin 函数和 conv 函数或 gaussfilt 函数来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值