matlab做gaussian高斯濾波


原文鏈接:https://blog.csdn.net/humanking7/article/details/46826105

 

 

核心提示
在Matlab中高斯濾波非常方便,主要涉及到下面兩個函數:

函數: fspecial
函數: imfilter
 

代碼實現
 
clear all;
clc;
%----------------------------------------------
%對圖像進行高斯濾波,並顯示圖像
%----------------------------------------------
%讀進圖像
[filename, pathname] = uigetfile({'*.jpg'; '*.bmp'; '*.gif'; '*.png' }, '選擇圖片');
%沒有圖像
if filename == 0
    return;
end
Image = imread([pathname, filename]);
[m, n, z] = size(Image);
%轉換為灰度圖
if z>1
    Image = rgb2gray(Image);
end
sigma = 1;
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

高斯濾波

編輯 討論
高斯濾波是一種線性平滑濾波,適用於消除高斯噪聲,廣泛應用於圖像處理的減噪過程。 [1]   通俗的講,高斯濾波就是對整幅圖像進行 加權平均的過程,每一個像素點的值,都由其本身和鄰域內的其他像素值經過加權平均后得到。高斯濾波的具體操作是:用一個模板(或稱卷積、掩模)掃描圖像中的每一個像素,用模板確定的鄰域內像素的加權平均灰度值去替代模板中心像素點的值。
 
中文名
高斯濾波
外文名
Gaussian filter
定    義
實質上是一種信號的 濾波器
應    用
圖像處理計算機視覺
方    式
離散化窗口滑窗卷積、傅里葉變換

簡介

編輯
高斯濾波實質上是一種信號的濾波器,其用途是信號的平滑處理,人們知道 數字圖像用於后期應用,其噪聲 是最大的問題,由於誤差會累計傳遞等原因,很多 圖像處理教材會在很早的時候介紹Gauss濾波器,用於得到信噪比SNR較高的圖像(反應真實信號)。與此相關的有Gauss-Laplace變換,其實就是為了得到較好的圖像邊緣,先對圖像做Gauss平滑濾波,剔除噪聲,然后求二階導矢,用二階導的過零點確定邊緣,在計算時也是頻域乘積至空域卷積。
濾波器就是建立的一個數學模型,通過這個模型來將圖像數據進行能量轉化,噪聲就是屬於高頻率部分,高斯濾波器平滑處理后降低噪聲的影響。
若使用理想濾波器,會在圖像中產生振鈴現象。采用高斯 濾波器的話,系統函數是平滑的,避免了振鈴現象。

定義

編輯
高斯濾波(Gauss filter)實質上是一種信號的 濾波器,其用途為信號的平滑處理,數字圖像用於后期應用,其噪聲是最大的問題,因為誤差會累計傳遞等原因,大多圖像處理教材會在很早的時候介紹Gauss濾波器,用於得到信噪比SNR較高的圖像(反應真實信號)。高斯平滑濾波器對於抑制服從 正態分布的噪聲非常有效。

原理

編輯
圖像大多數噪聲均屬於高斯噪聲,因此高斯濾波器應用也較廣泛。高斯濾波是一種線性平滑濾波,適用於消除高斯噪聲,廣泛應用於圖像去噪。
可以簡單地理解為,高斯濾波去噪就是對整幅圖像像素值進行加權平均,針對每一個像素點的值,都由其本身值和鄰域內的其他像素值經過加權平均后得到。
高斯濾波的具體操作是:用一個用戶指定的模板(或稱卷積、掩膜)去掃描圖像中的每一個像素,用模板確定的鄰域內像素的加權平均灰度值去替代模板中心像素點的值。 [2]  
一維高斯分布:
二維高斯分布:

應用

編輯
高斯濾波(高斯平滑)是 圖像處理計算機視覺里面最常見的操作。

兩種方式

編輯
在圖像處理中,高斯濾波一般有兩種實現方式,一是用離散化窗口滑窗卷積,另一種通過 傅里葉變換。最常見的就是第一種滑窗實現,只有當離散化的窗口非常大,用滑窗計算量非常大(即使用可分離濾波器的實現)的情況下,可能會考慮基於傅里葉變化的實現方法。

可分離濾波器

編輯
由於高斯函數可以寫成可分離的形式,因此可以采用可分離濾波器實現來加速。所謂的可分離濾波器,就是可以把多維的卷積化成多個一維卷積。具體到二維的高斯濾波,就是指先對行做一維卷積,再對列做一維卷積。這樣就可以將計算復雜度從O(M*M*N*N)降到O(2*M*M*N),M,N分別是圖像和濾波器的窗口大小。

模型建立

編輯
濾波器是建立的一個數學模型,通過它來將圖像數據進行能量轉化,能量低的就排除掉,噪聲屬於低能量部分。編程運算的話就是一個模板運算,拿圖像的八連通區域來說,中間點的像素值就等於八連通區的像素值的均值,這樣達到平滑的效果。假如使用理想濾波器,則會在圖像中產生振鈴現象。如果采用高斯濾波器,系統函數為平滑的,避免了振鈴現象。
由於高斯函數的傅立葉變換仍是 高斯函數, 因此高斯函數能構成一個在頻域具有平滑性能的低通濾波器。可以通過在頻域做乘積來實現高斯濾波。均值濾波是對信號進行局部平均, 以平均值來代表該像素點的灰度值。矩形濾波器(Averaging Box Filter)對這個二維矢量的每一個分量進行獨立的平滑處理。通過計算和轉化 ,得到一幅單位矢量圖。這個 512×512的矢量圖被划分成一個 8×8的小區域 ,再在每一個小區域中 ,統計這個區域內的主要方向 ,亦即將對該區域內點方向數進行統計,最多的方向作為區域的主方向。於是就得到了一個新的64×64的矢量圖。這個新的矢量圖還可以采用一個 3×3模板進行進一步的平滑

 

來源:matlab

  case 'gaussian' % Gaussian filter
     siz   = (p2-1)/2;
     std   = p3;
    
     [x,y] = meshgrid(-siz(2):siz(2),-siz(1):siz(1));
     arg   = -(x.*x + y.*y)/(2*std*std);
     h     = exp(arg);
     h(h<eps*max(h(:))) = 0;
     sumh = sum(h(:));
     if sumh ~= 0,
       h  = h/sumh;
     end;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM