2016-12-05 133 views
1

我想實現在Matlab三維高斯濾波器 - WITHOUT使用像imfilterimgaussfilt等內置Matlab的過濾功能...3D高斯濾波在Matlab


我有3D數據

RAW(K,K,K) 

說,K = 100,和過濾器寬度爲delta = 5本實施例中。

目前,我有:

Ggrid = -floor(delta/2):floor(delta/2); 
[X Y Z] = meshgrid(Ggrid, Ggrid, Ggrid); 

% Create Gaussian Mask 
GaussM = exp(-(X.^2 + Y.^2 + Z.^2)/(2*delta^2)); 

% Normalize so that total area (sum of all weights) is 1 
GaussM = GaussM/sum(GaussM(:)); 

這給了我維K+1 * K+1 * K+1的3D高斯核。 現在,得到過濾後的數據,我希望做一個像卷積:

FilteredData = conv(RAW,GaussM); 

,但有一個尺寸不匹配。有人能指出我要去哪裏嗎?我假設我在高斯蒙版GaussM中犯了一些錯誤。

回答

1

請勿使用conv,因爲這是用於1D信號。使用convn進行N維過濾,您可以在其中指定任何維度的內核,包括3D。

因此,它只是一個事:

FilteredData = convn(RAW, GaussM); 

還注意到,默認操作是提供一種執行卷積,這意味着輸出的規模將大於輸出原始尺寸爲RAW。爲了確保convn輸出是大小相同的RAW,指定'same'標誌作爲第三個參數爲convn

FilteredData = convn(RAW, GaussM, 'same'); 
+0

然後還有別的東西,你沒有做正確。 'convn'可以舒適地完成3D數據。請發佈確切的錯誤。 – rayryeng

+1

Tnx @rayryeng。 'convn'做了N維的卷積。同樣的標誌保持與(K,K,K)維度的卷積。工作比我想象的要容易得多。 我沒有使用'conv'和'convn'循環。不知道有一面我可以使用的旗幟。 – newbie