圖像拼接算法一般基於如下思路:
- 對每張圖像進行特徵點提取;
- 特徵點匹配;
- 特徵點篩選
- 計算投影矩陣;
- 進行投影變換
- 進行圖像簡單拼接;
- 對重疊部分進行融合;
特徵點提取
選擇不同的特徵點提取算法,會對拼接的結果產生影響。
分別測試了sift,surf,orb對特徵點進行提取,在其他步驟一樣的情況下,最終的拼接效果sift≈surf>orb
特徵點匹配
特徵點篩選
排序篩選:根據匹配度進行排序,選擇前特定數量或者特定百分比的特徵點作爲優秀特徵點。
使用orb特徵,當分別選擇前30%和前50%特徵點的最終效果。
閾值篩選:當匹配度大於一定閾值,認爲該點爲優秀特徵點。
findhomography計算單應性矩陣(3*3)
單應性矩陣(Homography)是一個從一張圖像到另一張圖像映射關係的轉換矩陣(3*3)。
以上圖爲例,點(x1,y1)到點(x2,y2)的單應性變換爲:
相比於使用getPerspectiveTransform根據4個點來獲得投影變換矩陣,findHomography使用優化算法從一系列點中篩選出最優解。
Mat homo = findHomography(imagePoints1, imagePoints2, CV_RANSAC);
計算配準圖的四個頂點座標
在執行投影變換之前,計算投影變換後四個頂點在拼接後圖像的位置,進而得出存放拼接後圖像的尺寸大小。
按照單應性變換公式,求解頂點變換後的座標位置。
例如,以左上角頂點(0,0)爲例,變換後的座標爲:
v2[0] = 0;
v2[1] = 0;
v2[2] = 1;
V2 = Mat(3, 1, CV_64FC1, v2);
V1 = Mat(3, 1, CV_64FC1, v1);
V1 = H * V2;
x = v1[0] / v1[2];
y = v1[1] / v1[2];
執行投影變換
對右邊圖像執行投影變換。
圖像簡單拼接
將左邊圖像覆蓋疊加在右邊圖像上。
左邊爲surf的拼接效果,右邊爲orb的拼接效果
簡單拼接完成後就可以看出最終效果了,簡單拼接錯位嚴重的話,說明特徵點提取步驟就存在問題,融合完成後效果也不會好到哪裏去。
重疊部分融合
左邊爲surf的融合效果,右邊爲orb的融合效果,右邊存在明顯的重影現象,欄杆區域重疊度不好。
圖像融合對重疊部分採用加權融合的方式,在重疊部分由前一幅圖像慢慢過渡到第二幅圖像,非重疊部分直接採用原圖像。
重疊部分的權值公式:
其中x爲當前處理點到重疊區域左邊界距離。
參考:
https://www.cnblogs.com/skyfsm/p/7411961.html
https://blog.csdn.net/weixin_42717395/article/details/85768313