2012-12-05 52 views
3

下圖顯示了兩個具有相同半徑的圓形,通過抗鋸齒渲染,只顯示左側圓形水平移動半個像素(注意圓形水平中心位於中間左邊像素,右邊像素邊界)。如何通過scipy執行亞像素精度的圖像互相關

如果我執行互相關,我可以在相關陣列上取最大值的位置,然後計算移位。但由於像素位置總是整數,所以我的問題是:

「如何在Numpy/Scipy中使用互相關的兩幅圖像之間獲得子像素(浮點)偏移?」

在我的腳本中,我使用的是scipy.signal.correlate2dscipy.ndimage.filters.correlate,他們似乎產生相同的結果。

的這裏圓只是一個例子,但我的特定領域的功能往往有子像素的變化,目前只得到整數轉變是給一點效果都沒有那麼好......

任何幫助將是非常感激!

enter image description here

+0

這個問題應該轉移到信號處理? (dsp.stackexchange) – heltonbiker

回答

3

離散交叉相關(由那些實現)只能有單個像素精度。我能看到的唯一解決方案是將您的二維數組插值到更精細的網格(上採樣)。

Here's關於DSP關於互相關前上採樣的一些討論。

+0

我發現接受的答案非常有啓發性。我想我會插入(上採樣)相關結果的一個子陣列(峯值附近)。謝謝! – heltonbiker

+0

您提到了「離散交叉相關」,但您是否意識到可以應用於(離散)2D陣列的任何「非離散交叉相關」? – heltonbiker

+0

@heltonbiker,不,我不知道。但我不是信號處理方面的專家。 – tiago

4

我有一個非常類似的問題,也有轉向的圓圈,偶然發現了Adam Ginsburg的一個叫做'圖像註冊'的優秀Python包。它爲您提供亞像素2D圖像移位,速度相當快。我相信這是一個流行的MATLAB模塊的Python實現,它只在x關聯的峯值附近上採樣圖像。

檢查出來:https://github.com/keflavich/image_registration

我一直在使用 'chi2_shifts.py' 的良好效果。

+0

感謝您的回答!處理這個問題的代碼現在正在開發中,但是瞭解一個「現成的」庫是很好的,以防將來需要再次修補它。 – heltonbiker

相關問題