2009-09-03 67 views
6

這不是一個「編程」的問題。但我相信這是在這個社區廣爲人知和理解的東西。如何乘不同尺寸的兩個圖像的譜?

我有一個圖像,X,和一個更小的圖像,Y,我需要通過自己的FFT乘以卷積兩個。但由於它們的尺寸不一樣,我不知道如何進行頻域倍增。

我對x(這是一個整數矩陣的維數4096 x 4096)的(二維)FFT給出了頻域表示,X(這是一個複數矩陣,我認爲它是維是2048 x 2048)。同樣,我對y(這是一個尺寸爲64 x 64的整數矩陣)的二維FFT,給出了頻域表示,Y(這也是一個複數矩陣,我認爲它的尺寸是32 x 32)

我在Numerical Recipes中使用了fourn函數,所以我的輸入矩陣x和y必須摺疊成一維數組,它們被離散傅立葉變換X代替和Y.問題是,即使這是一個圖像的二維問題,我正在使用一維數組。

如果我試圖將兩個完全相同的圖像進行卷積,x和y。它都將是非常簡單的:

X = FFT(x) 

Y = FFT(y) 

Z = X * Y (term by term multiplication) 

Convolution of x and y = IFFT(Z) 

但是,如果X和Y是不同的長度,我該怎麼做乘法?

一種可能性是襯墊出y以具有相同的尺寸爲×。但是這似乎非常低效。另一種可能是填充Y具有與X相同的尺寸。但我不知道這在頻率空間中意味着什麼。

這是另一種提出這個問題的方法:如果我想使用FFT對兩幅尺寸非常不同的圖像進行卷積處理,以便我們可以對它們的光譜進行乘法運算(頻域表示),那麼我該如何進行乘法運算?

謝謝,

〜邁克爾。

+0

你試圖用這種卷積做什麼?你想計算小圖像y在你的大圖像x上的二維卷積嗎?例如,如果您在大圖像x中搜索小片y,則可以使用卷積來實現y的相關搜索。在傅里葉域中它將更有效率。但是如果這是你的目標,你不會想把它們摺疊成1D。乘以x和y的譜的應用是什麼? – 2009-09-18 19:20:09

回答

6

填充較小的陣列(卷積核,Y你的情況)用零來匹配輸入圖像尺寸(您的矩陣x)是標準的做法。這是效率極其低下的,如果你是在空間域做卷積,但如果你相乘的FFT,這是必要的,並計算填充陣列的FFT的成本是不是太糟糕。

+0

+1(前一段時間)......也可能值得一提的是,填充圖像也很有用。由於FFT呈現週期性圖像,因此卷積可以將邊緣混合在一起。 – tom10 2009-09-11 00:36:42

4

你在思考這兩個頻率間隔正確的需要是相同的。取一維例子(我使用Matlab的語法):

N = 4096; 
M = 64; 

x = randn(N, 1); 
y = hann(M, 'symmetric'); 

zLinear = conv(x,y); 
zCircular = ifft(fft(x) .* fft(y,N)); 

disp(max(abs(zLinear(65:4096) - zCircular(65:4096)))); 

兩種技術之間的差別是〜2E-14,因此舍入誤差。請注意,由於線性和循環卷積之間的差異,您必須跳過前64個採樣。

在zCircular的計算中,音符FFT(Y,N),它是用於計算FFT之前填充了用零Y信號多至N個Matlab的語法。這可能被認爲是在存儲器使用效率低下,而且比較速度:

線性卷積:4096乘法/每64 = 262144乘法補充/添加

循環卷積:4096 + 1的2複數乘法的2點的FFT * 4096個元素+ 1逆FFT
= 3 * 4096 * LOG2(4096)+ 4096×6 = 172032(假設複數乘法6個操作)

基本上,FFT的NlogN速度,即使當需要其中三個,除非M很短,否則會跳過N個卷積運算。

編輯添加速度估計爲2D情況下

值得補充說,對於二維數據的速度上的優勢被放大。 2D FFT採用N * N * log2(N * N)運算,因此N = 4096的3個FFT +複數N^2陣列乘法運算爲1.3e10。但直接卷積是N^2 * M^2 = 6.9e10的操作,大約慢了50倍。