5.31. 位移比對¶
範本比對回答的是 這個圖塊在影格中的何處;相似度評分回答的是 這兩張影像整體上有多相像。介於兩者之間的是另一個問題:這兩個影格顯示的是同一個場景,但在它們之間相機(或場景)移動了——移動了多少? 這就是 位移 問題,而 image 模組以單一的相位相關方法來解決它。
5.31.1. 相位相關位移¶
find_displacement() 使用 相位相關(一種頻域方法,對每張影像執行快速傅立葉轉換(FFT)、對其相位進行交叉相關、並在結果中定位峰值)來估計兩張相同尺寸影像之間的剛性對齊。峰值位置就是使兩張影像對齊的平移量:
d = img.find_displacement(template)
print("shift:", d.x_translation, d.y_translation,
" response:", d.response)
回傳的 Displacement 帶有 x_translation 與 y_translation——各軸上的像素位移——外加 response,一個從 0.0 到 1.0 的信心分數,其中 1.0 代表完美的峰值。過濾掉低於 response > 0.3 的偵測結果,可以捨棄相位相關從未找到乾淨峰值的虛假結果。
在預設模式下,rotation 與 scale 分別為 0.0 與 1.0;它們只有在 logpolar=True 時才會取得實際值(見下文)。
此方法帶有兩個實務上的限制。第一個是 二的次方維度:作為相位相關核心的 FFT 在 32×32、64×64 與 128×128 這類尺寸下最快——而在相機上也只有這些尺寸完全受支援。最乾淨的設定方式是直接以其中一種尺寸擷取,作法是將解析度以元組形式傳給 framesize():
csi0.framesize((64, 64))
若應用程式需要從較大的影格取得位移,則改為從它所在意的區域中裁切出一個二的次方的圖塊,並對該圖塊執行比對器。
第二個是 相同尺寸的輸入:roi 與 template_roi 必須選取完全相同的寬度與高度,否則比對器會拒絕該呼叫。來自同一台相機、相同設定的兩次擷取會自動滿足此條件;而一個擷取影格與一張載入的參考影像比較時,兩者都需要先裁切成相符的二的次方圖塊。
5.31.2. 透過對數極座標處理旋轉與縮放¶
預設模式只找出 平移。當兩個影格還在繞某個選定中心的 旋轉 上、或繞同一中心的 縮放 上有所不同時,對每張影像的 對數極座標 重新投影執行相位相關,會將那些參數轉換為對數極座標系統中的平移——而這正是同一個相位相關比對器所能還原的:
d = img.find_displacement(template, logpolar=True)
print("rotation rad:", d.rotation,
" scale:", d.scale,
" response:", d.response)
在 logpolar=True 時,此方法會針對對數極座標投影後的影像(而非原始影像)執行相同的比對流程。結果的 rotation 與 scale 欄位會被填入回傳:rotation 是兩個影格之間以弧度表示的角度,scale 是兩者之間的縮放係數。在此模式下 x_translation 與 y_translation 會變得沒有意義(沿對數極座標軸的平移並不對應到來源中的線性平移)。
fix_rotation_scale=True 關鍵字涵蓋介於兩者之間的情況:兩張影像在平移與旋轉/縮放 兩方面 都有所不同,而應用程式在修正旋轉與縮放之後只需要 平移。比對器會先執行對數極座標處理以還原旋轉與縮放,將其逆變換套用到其中一張影像上,然後執行平移處理以還原剩餘的位移。此旗標只有在 logpolar=False 時才有意義——它要求平移模式的比對器先剝除旋轉/縮放。
極座標轉換中的模式——笛卡兒座標 → 極座標 → 比對——正是 find_displacement() 在 logpolar=True 時於單一呼叫中所做的事。應用程式在啟動時儲存一個參考的對數極座標圖塊,對每個即時影格進行擷取與對數極座標轉換,而此方法便還原出它們之間的旋轉與縮放差異。對於需要旋轉與縮放不變追蹤器的應用程式——一個在接近目標時相機會傾斜並變焦的對接機器人、一個需要知道影像相對於參考如何旋轉的穩定雲台——這就是標準的建構方式。
5.31.3. 經典用途¶
find_displacement() 最常見的用途是在處理移動相機的流程中進行 影格對影格的運動估計。相機在第 N 個影格擷取一個小型的二的次方圖塊,在第 N+1 個影格擷取相同尺寸的圖塊,對這兩者執行 find_displacement(),並讀出它們之間的像素位移。此位移就是兩次擷取之間相機(或場景,取決於以誰的參考座標為準)的估計運動,可用於:
光流式感測——一架朝下相機的懸停無人機,利用每影格的位移來估計其橫向運動,並將其回饋給飛行控制器。
影像穩定——將連續影格之間的位移從擷取的影像中減去,再加以記錄或傳輸,產生更平順的視訊串流。
檢測對齊——一台沿輸送帶移動的掃描相機,利用每影格的位移將每個影格與下一個影格對齊,並建構出整個零件的拼接視圖。
上述每一個應用程式都採取相同的形式:擷取、位移、累積成一個持續更新的估計值、再次擷取。