2011-10-14 141 views
2

我試圖爲學校項目實施高斯模糊。 我需要讓CPU和GPU實現來比較性能。高斯模糊和FFT

我不太確定我是否理解高斯模糊是如何工作的。所以我的一個問題是 如果我已經正確地理解了它?

繼承人我現在所做的: 我使用維基百科的公式http://en.wikipedia.org/wiki/Gaussian_blur來計算 該過濾器。 對於第2d我採取圖像中的每個像素的RGB,並通過 乘以該像素的RGB和周圍像素與相關的過濾器位置應用該過濾器。 然後將它們相加成爲新的像素RGB值。 對於1d,我首先水平應用濾波器,然後進行濾波,如果我理解正確,應該給出 相同的結果。 此結果與應用2d過濾器時的結果完全相同嗎?

我的另一個問題是關於如何優化算法。 我讀過快速傅立葉變換適用於高斯模糊。 但我無法弄清楚如何與它聯繫。 有人能給我一個正確的方向提示嗎?

謝謝。

回答

5

是的,二維高斯內核是separable,所以你可以將它作爲兩個1D內核來應用。請注意,不能將這些操作「就地」應用 - 但您至少需要一個臨時緩衝區來存儲第一個一維通道的結果。

當你有大的內核時,基於FFT的卷積是一種有用的優化 - 這適用於任何類型的濾波器,而不僅僅是高斯。 「大」的大小取決於您的體系結構,但您可能不希望對比任何比49x49內核更小的內容使用基於FFT的方法。一般的方法是:

  • FFT圖像
  • FFT內核,填充到圖像的大小
  • 相乘兩個在頻域(相當於在空間域中的卷積)
  • IFFT(反向FFT)結果

請注意,如果您將濾波器應用於多個圖像,則只需填充一次填充的內核即可。儘管(一個正向和一個反向),你仍然有至少兩個FFT執行每個圖像,這就是爲什麼這種技術只能成爲大內核內核的計算勝利的原因。

+2

當通過FFT使用快速卷積時,您可能需要將圖像和內核填充到圖像+內核的大小,否則最終可能會在邊緣附近出現圓形環繞瑕疵。 – hotpaw2

+0

可以避免的一種方法是將採樣器尋址模式設置爲「鏡像」紋理。 – bluejamesbond