原文链接:https://blog.csdn.net/humanking7/article/details/46826105
函数: fspecial
函数: imfilter
代码实现
clc;
%----------------------------------------------
%对图像进行高斯滤波,并显示图像
%----------------------------------------------
%读进图像
[filename, pathname] = uigetfile({'*.jpg'; '*.bmp'; '*.gif'; '*.png' }, '选择图片');
if filename == 0
return;
end
[m, n, z] = size(Image);
if z>1
Image = rgb2gray(Image);
end
gausFilter = fspecial('gaussian', [5,5], sigma);
gaus= imfilter(Image, gausFilter, 'replicate');
%显示图像-----------------------
figure(1)
subplot(1,2,1);
imshow(Image);
title('原图像');
subplot(1,2,2);
imshow(gaus);
title('滤波后');
————————————————
版权声明:本文为CSDN博主「祥知道」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/humanking7/article/details/46826105
来源:https://www.cnblogs.com/miki-52/p/5289062.html 待验证
Gauss滤波快速实现方法(转)
二维高斯函数具有旋转对称性,处理后不会对哪一个方向上的边缘进行了过多的滤波,因此相对其他滤波器,具有无法比拟的优越性。但是传统Gauss滤波随着图像尺寸的增加,运算复杂度呈平方上涨,因此需要对其优化改进。下面,分别介绍传统型,分解型和递归迭代型三种实现方法。
1 传统型
Gauss滤波首先需要构建一个Gauss滤波核,公式为:
Matlab实现代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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次加法运算,运算复杂度是很高的。
2 分解型
我们可以把一个二维Gauss核分解为两个一维高斯核,然后先对行做一次一维卷积,再对这个卷积结果做一次一维列卷积,得到的结果完全一模一样,而开销会小很多。
一维高斯核函数:
Matlab代码实现:
1
2
3
4
5
6
7
8
9
10
11
12
|
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大小)
一维卷积原理和二维卷积一样,只不过我们只需要将同一行或同一列上的数据,按位置一一加权求和,再把“和”赋给中心元素。
对于一个2048*2048的图像,需要进行41918464次乘法运算,和41918464次加法运算。相比传统运算量,只是前者的1/2.4985。如果遇到频繁计算Gauss滤波的算法,后者明显比前者速度快很多。
3 递归迭代型
第二种方法较第一种方法,虽然有了较大改善,但是任然复杂度较高。这里再介绍一种更快速的逼近Gauss滤波方法。
具体步骤分为两步:首先对图像做一次前向滤波,其次,对图像再做一次后向滤波。
Forward:
Backward:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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); |
来源:https://baike.baidu.com/item/高斯滤波/9032353?fr=aladdin
简介
编辑定义
编辑原理
编辑应用
编辑两种方式
编辑可分离滤波器
编辑模型建立
编辑来源:matlab
std = p3;
[x,y] = meshgrid(-siz(2):siz(2),-siz(1):siz(1));
arg = -(x.*x + y.*y)/(2*std*std);
h(h<eps*max(h(:))) = 0;
if sumh ~= 0,
h = h/sumh;
end;