2010-01-12 374 views
1

我有兩個圖像,我試圖共同註冊 - 即,一個可能是一個球在圖片的中心,另一個是在邊緣附近的同一個球,我試圖找到像素麻木,我必須移動第二個圖像,以便球會在同一個地方。 (我實際上使用3D MRI腦掃描,但原理是相同的)。MATLAB的fminsearch函數

我已經寫了一個函數,它可以將球向左,向右,向上或向下移動給定數量的像素,以及另一個函數,該函數比較中間球圖像與翻譯的相關性球在邊緣的圖像。當兩個球位於相同的位置時,相關函數將返回0,其他位置的數字大於0。

我試圖使用fminsearchdocumentation)找到相關函數的最低的最優翻譯(即球在同一個地方被),像這樣:

global reference_im unknown_im; 

starting_trans = [0 0 0]; 
trans_vector = fminsearch(@correlate_images,starting_trans) 

correlate_images.m:

function r = correlate_images(translate) 
global reference_im unknown_im; 

new_im = move_image(unknown_im,translate(1),translate(2),translate(3)); 

% This bit is unimportant to the question 
% but you can see how I calculate my correlation 
r = 1 - corr(reshape(new_im,[],1),reshape(reference_im,[],1)); 

有兩個問題,首先是fminsearch堅持要將平移向量的float值傳遞給correlate_images函數。有什麼方法可以告訴它只有整數是必要的嗎? (我會節約大量的CPU週期!)

其次,當我運行這個程序所產生的trans_vector總是一樣starting_trans - 我想這是因爲沒有最低已經找到了,但有另外一個原因它只是顯然不工作?

非常感謝!

編輯

我發現我的想法是輸出trans_vector總是一樣starting_trans的原因。 fminsearch查看起始值,然後從這裏開始每個方向的小增量,這個小增量總是小於1,這意味着相關的結果將是完美匹配的(因爲move_image將返回與用於子像素移動的輸入圖像)。我將繼續致力於說服matlab僅針對整數值進行fminsearch!

+0

在進一步的研究(http://www.mathworks.se/matlabcentral/newsreader/view_thread/155500)事實證明'fminsearch'不能用於整數問題!因此,我不得不放棄使用這種方法。感謝你的幫助! – 2010-01-13 11:29:12

回答

0

圖像處理工具箱中有一個非常類似的演示,它使用歸一化的互相關函數normxcorr2來執行圖像配準。爲了避免重複同樣的事情,請直接演示:

Registering an Image Using Normalized Cross-Correlation

+0

這應該是非常有用的,謝謝!唯一的問題(正如我在上面提到的mmr),我會(在某個時候)需要考慮旋轉和移動,並且我需要同時進行這兩個操作,所以我不能使用normxcorr2開箱即用。我會在圖像處理工具箱中尋找,但它們可能有一個體面的功能或者兩個!歡呼 – 2010-01-13 10:24:55

+0

@JP:有些技術可以使用傅立葉變換計算圖​​像之間的旋轉配準。它們並不像使用FFT來計算超常位移一樣簡單,但它們工作得很好。我手邊沒有參考資料,但如果您搜索(我喜歡谷歌學者)「圖像註冊」,您可能會發現一些好的想法。 – 2011-02-06 07:25:38

1

首先,我想說Matlab可能不是這個問題的最佳工具。我會看看Elastix,這是一個圍繞ITK中的註冊函數的漂亮的用戶友好包裝。您可以獲得各種註冊技巧,並且這兩個程序的手冊都很好地解釋了圖像註冊的具體細節。

其次,對於這種簡單的平移註冊,您可以使用FFT。正向轉換兩個圖像,將圖像相乘(逐點!即使用A。* B,而不是A * B,因爲這些是不同的操作,首先是你想要的),並且逆時針轉換的來源是您需要的平移量。 Numerical Recipes in C有很好的解釋; here's a link to an index pdf。 FFT版本和直接相關版本之間的速度差異很大; FFT是O(N log N),而相關方法是O(N * M),其中M是搜索鄰域中的像素數。如果要允許搜索整個圖像,則相關性將變爲O(N * N),這將比FFT版本花費更長的時間。將參數從浮點數更改爲整數不會解決問題。

fminsearch函數使用浮點數(如果我能猜出編碼器決策背後的原因),原因是對於不是測試問題的問題(即,體積中的球體),通常需要使用子像素分辨率來執行正確的註冊。查看ITK文檔,瞭解此方法背後的原因。第三,我建議在Matlab中編寫這個程序的好方法(如果你還想這麼做的話!),同時仍然強制整數相關將會避免fminsearch函數,它將要使用浮點數。試試這樣的:

startXPos = -10; %these parameters dictate the size of your search neighborhood 
startYPos = -10; %corresponds to M in the above explanation 
endXPos = 10; 
endYPos = 10; 
optimalX = 0; 
optimalY = 0; 
maxCorrVal = 0; 
for i=startXPos:endXPos 
    for j = startYPos:endYPos 
     %test the correlation of the two images here, where one image is shifted to another 
     currCorrVal = Correlate(image1, image2OffsetByiAndj); 
     if (currCorrVal > maxCorrVal) 
      maxCorrVal = currCorrVal; 
      optimalX = i; 
      optimalY = j; 
     end 
    end 
end 

從這裏,你只需要寫偏移功能。這樣,你就避免了浮動問題,並且你也增加了你的翻譯矢量(我沒有看到任何方式讓這個矢量在你提供的函數中移動,這可能解釋了你的移動不足)。

+0

下面是使用MATLAB進行FFT(也是2D)的一個很好的介紹:http://blogs.mathworks.com/steve/category/fourier-transforms/ – Mikhail 2010-01-12 21:31:09

+0

非常感謝您的詳細回覆!不幸的是,MATLAB在這裏是選擇的工具(這是我作爲物理碩士學生的最後一年實驗的一部分),但Elastix看起來可能對下一個更加開放的項目有用! – 2010-01-13 10:13:54

+0

FFT可能非常有用 - 謝謝!我將不得不調查頻率域在旋轉數據集之間的變化程度...... – 2010-01-13 10:15:57