2016-08-23 47 views
1

我有一個處理大量2d灰度圖像的程序,並且在處理每個圖像(Matlab 2015b)時,目前多次使用imgaussfilt()。就運行時間而言,這證明是非常昂貴的。我有幾個較大的西格馬值的例子,它似乎更昂貴(即imgaussfilt(image,[1,40])... imgaussfilt(image,[10,15]))。MATLAB:二維圖像的快速大西格瑪平滑

有沒有人知道任何更快的版本/方法高斯平滑?

我已經嘗試過使用FFT/IFFT方法,但是這似乎需要比原生MATLAB imgaussfilt()功能更長的時間。

也嘗試了先後在X和Y維上運行高斯平滑,但這需要比本地imgaussfilt()功能稍長一些。

不同的平滑方法也可以很好地工作,還有其他方法是否快得多? (嘗試imboxfilt()...只稍快,不如)。

在此先感謝

+0

你有沒有試過用高斯內核的'imfilter'? 'imfilter'使用英特爾集成性能基元進行高效過濾。 – rayryeng

+0

爲什麼需要在處理一幅圖像時多次應用此濾鏡?也許你可以在一開始就使用它只有一次適當的大小 –

+0

@rayryeng我試着imfilter與高斯內核 - 是相當快,但仍然比imgaussfilt() – user3470496

回答

0

一個最便宜的平滑方法,我能想到的是,簡單地相鄰像素的平均值:

A(i,j) = (A(i-1,j) + A(i+1,j) + A(i,j-1) + A(i,j+1) + w*A(i,j))/(4+w); 

其中w=4是您所選擇的一些加權因子。您可以在陣列circshift轉移:

A(i-1,j) = circshift(A(i,j), [1 0]); 

等假設您存儲圖像的所有N陣列中的A(x,y,N),完整Matlab的命令是:

A = (w*A + circshift(A, [-1 0 0]) + circshift(A, [1 0 0]) + circshift(A, [0 -1 0]) + circshift(A, [0 1 0]))/(4+w); 
1

從你的描述看來,你正在使用高度各向異性的過濾器,在這裏[1,40]或[10,15]。如果情況確實如此,那麼您的每個過濾器都與另一個過濾器無關,我建議使用積分圖像進行圖像平均。相關的matlab函數是integralimage和integralfilter。這不是高斯平滑,而是盒式過濾器。但是,一旦對輸入圖像進行計算,積分圖像可以重複用於許多不同的濾波,並且濾波效果的強度與內核大小(!)無關,這可能不是imgaussfilter的情況。但是,也許你應該注意圖像邊界的效果。

+0

通過選擇框篩選器的正確大小,可以近似高斯模糊的效果。建議使用盒式過濾器的漂亮觀察。 +1。 – rayryeng