- 操作系統:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 編程語言:C++11
算法描述
注冊模塊實現了參數化圖像配準。所實現的方法是直接對齊(direct alignment),即,它直接使用像素值來計算一對圖像之間的配準,與基于特征的配準方法相對。該實現基本上遵循了[254]中對應的部分。
基于特征的方法在嘗試配準在不同光照條件或曝光時間下拍攝的圖像,或當圖像僅部分重疊時,相比基于像素的方法具有一些優勢。另一方面,與基于特征的方法相比,基于像素的方法的主要優勢在于,對于某些圖像(在相似光照條件下拍攝且具有顯著重疊的圖像),其精度更高,這是因為我們使用了圖像中所有可用的信息,從而能夠實現亞像素精度。這對于某些應用(如多幀去噪或多幀超分辨率)尤其重要。
事實上,基于像素和基于特征的配準方法可以相互補充:一個應用程序可以首先使用特征獲得粗略的配準,然后在圖像的重疊區域上使用基于像素的方法來細化配準。所開發的代碼允許這種使用場景。
該模塊實現了從抽象類 cv::reg::Map 或 cv::reg::Mapper 派生的類。前者對兩個參考幀之間的坐標變換進行建模,而后者封裝了一種調用方法的方式,該方法計算兩個圖像之間的映射(Map)。盡管目標是實現基于像素的方法,但該模塊可以擴展以支持其他能夠計算圖像間變換的方法(基于特征的方法、光流等)。
每個從 Map 派生的類實現了一種運動模型,如下所示:
MapShift:對簡單的平移進行建模。
MapAffine:對仿射變換進行建模。
MapProjec:對投影變換進行建模。
MapProject 也可以用于對仿射運動或平移進行建模,但它的一些操作成本更高,這就是定義另外兩個類的原因。
從 Mapper 派生的類有:
MapperGradShift:基于梯度的對齊,用于計算平移。它產生一個 MapShift(兩個參數,對應于平移向量)。
MapperGradEuclid:基于梯度的對齊,用于歐幾里得運動,即旋轉和平移。它計算三個參數(角度和平移向量),盡管結果為了方便存儲在 MapAffine 對象中。
MapperGradSimilar:基于梯度的對齊,用于計算相似性變換,即在歐幾里得運動的基礎上增加了縮放。它計算四個參數(兩個用于反對稱矩陣,兩個用于平移向量),盡管結果為了更好的方便性存儲在 MapAffine 對象中。
MapperGradAffine:基于梯度的對齊,用于仿射運動模型。參數數量為六個,結果存儲在 MapAffine 對象中。
MapperGradProj:基于梯度的對齊,用于計算投影變換。參數數量為八個,結果存儲在 MapProject 對象中。
MapperPyramid:它使用高斯金字塔實現分層運動估計。它的構造函數接受任何實現 Mapper 接口的其他對象作為參數,并且正是該 mapper 被 MapperPyramid 在金字塔的每個尺度上調用。
如果圖像之間的運動不是非常小,使用這些類的正常方式是創建一個 MapperGrad* 對象并將其用作創建 MapperPyramid 的輸入,然后調用 MapperPyramid 來執行計算。然而,如果圖像之間的運動足夠小,我們可以直接使用 MapperGrad* 類。另一種可能性是先使用基于特征的方法進行粗略配準,然后通過 MapperPyramid 或直接使用 MapperGrad* 對象進行細化。mappers 的 “calculate” 方法接受運動的初始估計作為輸入。
在決定使用哪個 MapperGrad 時,我們必須考慮到,參數更多的 mappers 可以處理更復雜的運動,但涉及更多的計算,因此速度更慢。此外,如果我們對序列遵循的運動模型有信心,增加超出我們需要的參數數量會降低精度:最好使用我們能用的最少自由度數量。
在模塊測試中有示例,展示了如何使用任何已實現的 mappers 來配準一對圖像。