點擊上方“小白學視覺”,選擇加"星標"或“置頂”
重磅干貨,第一時間送達
前言概述
之前寫了兩篇文章分別是圖像單應性矩陣變換與圖像拼接,圖像拼接中使用單應性矩陣實現圖像特征對齊,從而為圖像拼接特別是無縫拼接打下基礎以下哪種立體匹配算法,看一下上一篇我的圖像拼接效果如下:
經過分析發現:效果不好的原因是像素疊加的時候沒有考慮左右兩側圖像的位置信息,直接通過手動指定了融合區域跟閾值,而不是根據圖像實際位置由圖像生成mask層以下哪種立體匹配算法,根據mask層動態生成融合圖像重疊區域的閾值,如此可以解決融合不夠自然或者看上去拼接效果不好。最終改進之后的兩張圖像拼接效果如下:
是不是一個完美的無縫圖像拼接我說了不算,大家說了算,歡迎留言反饋!
改進思路
想要完美的實現無縫拼接,有兩個關鍵技術點:
之前的實現中圖像對齊跟配準做的不錯,就是最后的拼接效果不好,所以要改進圖像融合,實現無縫融合。這里我觀察了右側圖像透視變換的結果,發現一般都是一個不規則的圖像,以我老家房屋的圖像為例:對齊+透視變換之后如下:
生成的mask圖像如下:
如果想要完美的融合,就不能隨便制定區域融合,而是根據右側透視變換之后的圖像,來生成每一行有多少列是跟左側圖像重疊的,然后自動計算重疊區域大小,計算間隔值,完成最終mask權重圖像生成,如下圖:
代碼實現與步驟
我是一個比較懶的人,代碼已經有注釋了,這里我就不過多解釋,只簡單說一下代碼執行流程。
首先是圖像特征提取與求單應性矩陣,這步可以省略了。代碼可以參考上一篇文章即可。
使用單應性矩陣求得右側變換之后的圖像跟mask
根據mask得權重mask層
最后跟之前的一致,直接融合即可。
特征提取部分代碼,參考之前文章,不寫廢話。融合部分,修改后的代碼如下:
1//?獲取全景圖大小
2int?h?=?max(left.rows,?right.rows);
3int?w?=?left.cols?+?right.cols;
4Mat?panorama_01?=?Mat::zeros(Size(w,?h),?CV_8UC3);
5Rect?roi;
6roi.x?=?0;
7roi.y?=?0;
8roi.width?=?left.cols;
9roi.height?=?left.rows;
10
11//?獲取左側與右側對齊圖像
12left.copyTo(panorama_01(roi));
13Mat?panorama_02;

14warpPerspective(right,?panorama_02,?H,?Size(w,?h));
15imwrite("D:/panorama_02.png",?panorama_02);
16
17//?計算融合重疊區域mask
18Mat?mask?=?Mat::zeros(Size(w,?h),?CV_8UC1);
19generate_mask(panorama_02,?mask);
20
21//?創建遮罩層并根據mask完成權重初始化
22Mat?mask1?=?Mat::ones(Size(w,?h),?CV_32FC1);
23Mat?mask2?=?Mat::ones(Size(w,?h),?CV_32FC1);
24
25//?left?mask
26linspace(mask1,?1,?0,?left.cols,?mask);
27
28//?right?mask
29linspace(mask2,?0,?1,?left.cols,?mask);
30
31//?左側融合

32Mat?m1;
33vector?mv;
34mv.push_back(mask1);
35mv.push_back(mask1);
36mv.push_back(mask1);
37merge(mv,?m1);
38panorama_01.convertTo(panorama_01,?CV_32F);
39multiply(panorama_01,?m1,?panorama_01);
40
41//?右側融合
42mv.clear();
43mv.push_back(mask2);
44mv.push_back(mask2);
45mv.push_back(mask2);
46Mat?m2;
47merge(mv,?m2);
48panorama_02.convertTo(panorama_02,?CV_32F);
49multiply(panorama_02,?m2,?panorama_02);

50
51//?合并全景圖
52Mat?panorama;
53add(panorama_01,?panorama_02,?panorama);
54panorama.convertTo(panorama,?CV_8U);????
55imwrite("D:/panorama.png",?panorama);
測試了一張圖像,特征點匹配效果如下:
拼接融合之后圖像:
說明是真的沒問題了!(邊上還有點黑的,可以直接裁了,比較懶了!)
好消息!
小白學視覺知識星球
開始面向外開放啦
下載1:OpenCV-Contrib擴展模塊中文版教程
在「小白學視覺」公眾號后臺回復:擴展模塊中文教程,即可下載全網第一份OpenCV擴展模塊教程中文版,涵蓋擴展模塊安裝、SFM算法、立體視覺、目標跟蹤、生物視覺、超分辨率處理等二十多章內容。
下載2:Python視覺實戰項目52講
在「小白學視覺」公眾號后臺回復:Python視覺實戰項目,即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計數、添加眼線、車牌識別、字符識別、情緒檢測、文本內容提取、面部識別等31個視覺實戰項目,助力快速學校計算機視覺。
下載3:OpenCV實戰項目20講
在「小白學視覺」公眾號后臺回復:OpenCV實戰項目20講,即可下載含有20個基于OpenCV實現20個實戰項目,實現OpenCV學習進階。
交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫學影像、GAN、算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據研究方向邀請進入相關微信群。請勿在群內發送廣告,否則會請出群,謝謝理解~