原文鏈接: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;