![]() |
![]() |

1.1概念定義
我們這里想要實現的圖像拼接,既不是如題圖1和2這樣的“圖片藝術拼接”,也不是如圖3這樣的“顯示拼接”,而是實現類似“BaiDU全景”這樣的全部的或者部分的實際場景的重新回放。
對於圖像拼接的流程有很多定義方式,本教程中主要介紹實現主流方法,總結梳理如下:
圖像采集->投影變換->特征點匹配->拼接對准->融合->反投影
圖像采集不僅僅指的是普通的圖像數據的獲取。為了能夠拼接過程能夠順利進行、拼接結果能夠滿足要求,我們在采集圖像的時候就使用了一些方法、固化了一些參數;
投影變換為了采集的圖像能夠方便拼接,我們需要將各個圖片變換到統一的平面上去。而變換的依據就是在圖像采集的設定下來的采集方法。
特征點匹配是先進的特征尋找方法,一般是SHIFT/SURF/ORB,簡單介紹模板匹配。所謂“特征點”,就是這樣同樣的一個點,在不同的圖片上面都會顯示為同樣的特征。那么如果掌握了足夠的可信度高的特征點,就可以將圖片中各個物體變換到同意的平面上去。RANSAC特征點提純也是較為重要的內容。
拼接對准是圖像拼接的核心部分,就是根據前面尋找到的匹配關系,將投影變換后的圖片再次變換並合並成一張圖片。需要注意的是,當大量圖片拼接的時候,會出現錯誤累積的情況,我們采用“光束平差法”應對;同時還有插值計算的相關內容。
圖像融合是用來消除由於幾何校正、動態的場景或光照變化引起的相鄰圖像間的強度或顏色不連續問題,也就是縫隙消除。我們介紹一種復雜的方法和一種直接的方法,用於不同的情況。
反投影沒有名字聽起來那么玄乎,實際上就是將拼接的結果重新生成的過程。一般還是生成圖片,但是也可以變成其它的類型。
1.2國內外研究現狀
關於圖像拼接的方法國內外已有不少的論文發表,其算法大致可分為基於模型的方法、基於變換域的方法、基於灰度相關的方法和基於特征的方法,而如何提高圖像拼接的效率,減少處理時間和增強拼接系統的適應性一直是研究的重點。
(歷史有興趣可以看,不影響主要內容學習)1996年,微軟研究院的瓦chadrSezhski提出了一種ZD空間八參數投影變換模型,采用Lvenebegr一Marquadrt迭代非線性最小化方法(簡稱L一M算法)求出圖像間的幾何變換參數來進行圖像配准。這種方法在處理具有平移、旋轉、仿射等多種變換的待拼接圖像方面效果好,收斂速度快,因此成為圖像拼接領域的經典算法。
2000年,shmuelPeleg等人在瓦chardszeliski的基礎上作了進一步的改進,提出了自適應圖像拼接模型,根據相機的不同運動而自適應選擇拼接模型,通過把圖像分成狹條進行多重投影來完成圖像的拼接。這一研究成果推動了圖像拼接技術的進一步的發展,從此自適應問題成為圖像拼接領域新的研究熱點。匹茲堡大學的SevketGumustekin對消除在固定點旋轉攝像機拍攝自然景物時形成的透視變形和全景圖像的拼接進行了研究。通過標定攝像機來建立成像模型,根據成像模型將捕獲到的圖像投影到統一的高斯球面上,從而得到拼接圖像。這種方法拼接效果好、可靠性高,但是要求對攝像機進行精確的標定,同時要求攝像機透鏡本身的畸變參數引起的圖像變形可以忽略不計。
1975年,Kuglni和Hines提出了相位相關法,利用傅立葉變換將兩幅待配准的圖像變換到頻域,然后利用互功率譜直接計算出兩幅圖像間的平移矢量。1987年,DeCasrt斷口Mornadi提出了擴展相位相關法,利用傅立葉變換的性質能夠實現具有旋轉和平移變換的圖像的配准。隨着快速傅立葉變換算法的提出以及信號處理領域對傅立葉變換的成熟應用,Rdedy和chatterji提出了基於快速傅立葉變換F(FT一basde)的方法,利用極坐標變換和互功率譜,對具有平移、旋轉和縮放變換的圖像都能夠實現精確配准。相位相關法計算簡單精確,但要求待配准圖像之間有較大重疊比例,同時計算量和適用范圍與圖像的大小有很大關系。除了傅立葉變換外,人們還選擇更可靠、更符合人眼視覺生理特征的Gbaor變換和小波變換進行圖像匹配。基於灰度相關的方法是以兩幅圖像重疊部分所對應在RGB或CMY顏色系統中灰度級的相似性為准則尋找圖像的配准位置。常用的算法有比值匹配法、塊匹配法和網格匹配法。比值匹配法是從一幅圖像的重疊區域中部分相鄰的兩列上取出部分像素,然后以它們的比值作為模板,在另一幅圖像中搜索最佳匹配,這種算法計算量較小,但精度低;塊匹配法是以一幅圖像重疊區域中的一塊作為模板,在另一幅圖像中搜索與此模板最相似的匹配塊,這種算法精度較高,但計算量過大;網格匹配法嗜先進行粗匹配,每次水平或垂直移動一個步長,記錄最佳匹配位置,然后再進行精確匹配,每次步長減半,循環此過程直至步長減為O,這種算法較前兩種運算量有所減小,但如果粗匹配步長過大會造成較大的誤差。基於特征的方法首先從待匹配圖像中提取特征集,利用特征的對應關系進行匹配。基於特征的方法利用了圖像的顯著特征,具有計算量小,速度快的特點,對與圖像的畸變、噪聲、遮擋等具有一定的魯棒性,但是它的匹配性能在很大程度上取決於特征提取的質量。提出了一種輪廓的圖像匹配方法,采用LOG算子提取出兩幅圖像的特征輪廓,用鏈碼來表示輪廓,根據相同輪廓的鏈碼差分值不變的特性找出對應輪廓,從而確定圖像間的變換關系。這種方法在特征輪廓的提取上容易受到噪聲的干擾,其計算量隨着輪廓數量的增多而增長。使用HarriS檢測器提取興趣點,通過計算歸一化相關系數,沿極線尋找一幅圖像中興趣點的對應點,然后使用第三幅圖像來得到更准確的對應;Jnae提出了基於小波變換的分層圖像匹配算法,在分解后的每一層圖像中提取興趣點進行匹配,用並行策略提高了計算速度。
圖像匹配算法經過幾十年的發展已經取得了很大的進展,但由於拍攝環境復雜多變,現在還沒有一種算法能夠解決所有圖像的匹配問題。現有的幾種方法各有其優缺點,如果能綜合利用這些方法的優點將會取得更好的匹配結果。
(應該整理出最新的知識 以及經典的綜述)
(這里要注意學習)軟件方面,以微軟研究院“Image Composite Editor”(下稱ICE)效果最好,我判斷ICE的作者很可能就是圖像拼接相關論文的作者,或者至少是在其指導下完成的。ICE基本是將論文中的特性全部都體現出來了。
正是因為ICE的優良特性(和不開源性),我一般將其作為圖像拼接的“驗證工具”來使用。
1.3圖像拼接技術的廣泛運用
![]() |
1)消費類VR
虛擬現實技術(Virtual Reality)就是利用計算機構建一個逼真的虛擬環境,即以仿真的方式給人們創造一個反映實體對象變化及其相互作用的三維世界,使得人們能夠通過使用專用設備,就能像在自然環境中一樣對虛擬環境中的實體進行觀察與控制。
(TIP 注意,這里就是“反投影”的一個靈活使用。拼接的結果最后不是以單幅圖片顯示出來的,而是處理以后,通過VR雙屏幕顯示出來的。所謂“反”指的就是逆過程)
2)遙感技術
隨着航空航天技術的發展,偵察衛星或航空遙感器能夠實時獲得目標的高清晰圖像。為了擴大視野,提高分辨率,獲得質量更高、位置更精確的信息,需要將來自不同傳感器的兩幅或多幅遙感圖像拼接成一幅影像圖。下圖所示,是由多幅遙感圖像拼接成的月球表面拼接圖像。
3)醫學方面
在醫學領域,從CT圖像、X光照片到人體的細胞照片,醫學對圖像的質量和處理手段都有極高的要求,許多圖像處理技術也是在解決醫學圖像問題的過程中產生的。全景圖由於其寬視角的特點也被應用在醫學領域。在遠程會診中,把拍攝的序列病理圖片拼接成全景圖,不僅可以使遠程終端用戶能夠看到當地醫院的完整“現場”,還能在當地醫院再現觀測病理切片時的“現場”,這對於病理切片存檔、病理研究學習等都有着重要的意義。
在超聲檢查中,超聲圖像的質量直接影響着醫生對病情的診斷,由於普通超聲探頭較小,對大的組織器官和病變難以在一個斷面顯示,利用圖像拼接技術可以將探頭連續移動時的圖像拼接成為寬視角的全景圖,就可以顯示出組織的完整結構,為診斷提供更好的依據。
在外科手術中,由於缺少對視網膜整體狀況進行檢查的工具,視網膜激光手術的成功率很低。Alican Charles等人提出了利用圖像拼接的方法構建視網膜的整體視圖,作為外科手術的依據。他們將視網膜近似為一個二維的曲面,以視網膜上血管的三叉點作為匹配的特征點,通過求解一個12參數的變換矩陣找到相鄰兩幅視網膜圖像之間的變換關系,將一系列視網膜的圖像拼合成一張大的視網膜圖像,如圖所示。視網膜的整體視圖為視網膜激光手術的發展做出了巨大的貢獻。
圖像拼接可以說在很多方面都會有強烈的需求、重要的作用,所以學習學懂圖像拼接,對於一名圖像方面的學生、工作者或者是研究人員來說都是必須的,值得付出的。
1.4圖像拼接技術的特點
圖像拼接技術是以多幅圖像為處理對象,需要對兩幅或兩幅以上的圖像進行綜合的分析,因此相對於圖像壓縮、圖像分割、圖像編碼等圖像處理技術來說,有其自身的特點:多樣性、針對性、復雜性和缺乏客觀評價約束
1)多樣性
在客觀世界中的自然物體和人造物體種類繁多、形狀各異,使得圖像的內容千變萬化;由於光照條件的變化和景物中不可避免的物體移動,所以相機從不同角度采集的圖像之間以及在不同時間采集的同一物體的圖像之間都存在着差異;相機在采集圖像的過程中,存在着多種運動方式,如平移、旋轉、傾斜等,這也使得到的圖像具有不同的特點。以上多方面的原因造成了圖像拼接技術的處理對象的復雜性和不可把握性,也決定了圖像拼接技術的多樣性。因此,對於不同類型的圖像,需要不同的處理方法。
2)針對性
不同內容的圖像,以及在不同條件下得到的圖像,如柱面圖像、球面圖像和視頻圖像序列等,它們都具有鮮明的特點。因此,針對這些特點產生了特定的圖像拼接算法。一般來說,圖像拼接算法的針對性都很強,對於某種條件下產生的圖像拼接算法可能完全不適合另外一種情況下的圖像拼接算法;
3)復雜性
圖像采集和相機模型原理聯系緊密;在采集的過程中涉及到多個模型;從圖像的采集到最后生成效果良好的拼接結果,中間需要經過多個環節。而這些環節之間又相互關聯,前后約束。這就決定了圖像拼接算法比較復雜。同時容易出現各種現場問題。
4)缺乏客觀評價約束
因為最后生成的是一副圖片,那么就缺乏客觀、統一的評價標准,衡量一個算法的優劣只能依靠人的主觀視覺感知。反過來也會造成提高算法質量的時候缺乏依據。
正是因為圖像拼接“復雜且難以評價”,所以在學習的時候需要理清框架、打牢基礎、注重方法,並且注重“由易到難”和“編碼實踐”。
這里收集整理了多方的資料,還是為了讓大家對拼接的重要意義有充分認識,對需要克服的困難有初步了解。如果能夠理解困難出現的原因,那么對於解決困難肯定是有幫助的。
二、圖像拼接技術的基本流程
(原因是什么07)前面已經說過了,我們這里將圖像拼接划分為以下流程
圖像采集->投影變換->特征點匹配->拼接對准->融合->反投影
2.1圖像的采集(攝像頭模型)
首先來看例子:
2.1.1精密圖像采集體系:
![]() |
![]() |
![]() |
![]() |
雖然形狀各異,充滿了GEEK的感覺,但是共同點很明顯:圍繞中心排列一系列的相機。
這樣一次采集就能夠獲得360度的圖像,而且由於相機是固定的,所以采集獲得的圖像質量很高。
2.1.2正常的圖像采集
![]() |
采集到的照片的質量好壞直接影響到最后的拼接結果和生成的全景圖的真實感,因此在拍攝的時候應該盡可能的注意以下這幾方面:
①
相機應該大致固定在景物的中心位置,這樣能盡量保證拍攝角度恰當。
② 將數碼相機固定在攝影三角架上,盡可能的避免平轉數碼相機時鏡頭的偏斜和俯仰,盡量保持相機水平旋轉。
③ 相機盡可能繞光心旋轉。偏離光心引入的誤差會導致插值圖像的重影和定位困難。
④ 拍攝時固定光圈和焦距。不同光圈會使不同方向上的照片有較大的亮度、對比度或色彩差異。
柱面全景空間的視點空間對應單一視點處的柱面范圍,要獲取該范圍內的實景圖,只需固定照相機或攝像機的位置,平轉照相機或攝像機,每旋轉一定的角度,拍攝一張照片。拍攝實景圖像使用的器材包括三腳架、水平儀和數碼相機等。如圖所示。如果沒有3腳架,可以以自己作為3腳架,但是效果會差一點。
前面說了在實際使用過程中出現的采集方式,那么下面來說一說模型。
2.1.3 柱面圖像采集模型
![]() |
用戶可以在全景圖像中 360 度的范圍內任意切換視線,也可以在一個視線上改變視角,來取得接近或遠離的效果,也可以認為是球面全景圖的一種簡化。用戶在水平方向上有 360度的視角,在垂直方向上也可以做一定的視角變化,但是角度范圍則受到限制。由於柱面模型的圖像質量均勻,細節真實程度更高,應用范圍比較廣泛。
柱面全景圖像也較為容易處理,因為可以將圓柱面沿軸向切開並展開在一個平面上,傳統的圖像處理方法常常可以直接使用。柱面全景圖像並不要求照相機的標定十分准確。所以將柱面全景圖顯著優點歸納為以下兩點:
1)它的單幅照片的獲取方式比立方體形式和球面形式的獲取方式簡單。所需的設備只有普通的相機和一個允許連續“轉動”的三角架。
2)柱面全景圖容易展開為一個矩形圖像,可直接用計算機常用的圖像格式進行存儲和訪問。雖然柱面形式的全景圖在垂直方向允許參與者視線的轉動角度小於 180 度,但是在絕大多數應用中,水平方向的 360 度環視場景已足以表達空間信息。
這里只是讓大家對“柱面模型”這種采集方式有一個初步的了解,具體的數據計算在后面解釋。
此外,我強調的是:“柱面模型”,本身是一種設計出來的圖像采集的模式,采用這種模式就決定了以后圖像投影變換的細節,間接地決定了最后拼接結果的質量。
所謂的柱狀投影。
可以得到這樣的效果,這個效果是否正確還有待商榷,但是基於此的確可以更進一步地做東西了。
// column_transoform.cpp : 桶裝投影
//
#include "stdafx.h"
#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/nonfree/features2d.hpp"
#include "opencv2/calib3d/calib3d.hpp"
using namespace std;
using namespace cv;
#define PI 3.14159
int main( int argc, char** argv )
{
Mat img_1 = imread( "Univ1.jpg");
Mat img_result = img_1.clone();
for(int i=0;i<img_result.rows;i++)
{ for(int j=0;j<img_result.cols;j++)
{
img_result.at<Vec3b>(i,j)=0;
}
}
int W = img_1.cols;
int H = img_1.rows;
float r = W/(2*tan(PI/6));
float k = 0;
float fx=0;
float fy=0;
for(int i=0;i<img_1.rows;i++)
{ for(int j=0;j<img_1.cols;j++)
{
k = sqrt((float)(r*r+(W/2-j)*(W/2-j)));
fx = r*sin(PI/6)+r*sin(atan((j -W/2 )/r));
fy = H/2 +r*(i-H/2)/k;
int ix = (int)fx;
int iy = (int)fy;
if (ix<W&&ix>=0&&iy<H&&iy>=0)
{
img_result.at<Vec3b>(iy,ix)= img_1.at<Vec3b>(i,j);
}
}
}
imshow( "桶狀投影", img_1 );
imshow("img_result",img_result);
waitKey(0);
return 0;
};
2.1.4 難道就沒有其他模型了嗎
在論文中和實際的項目中,看到最多的就是“柱狀模型”,容易讓人認為:“全景拼接只適合柱狀模型”,甚至以為“圖像拼接只適合柱狀模型”。
實際上,只要采集的圖像中的信息包含了原始全景圖片的信息,那么就應該能夠有辦法將其復原。之所以采用“柱狀模型”是因為最容易實現,再說一遍:之所以采用“柱狀模型”是因為最容易實現。事實上,針對不同的應用場景,可能會有很多其他的模型:
1)
步進電機控制的精密采集設備;
2)
消費類,手機拍攝形成“蜂窩狀”圖片拼接;
類似的情況還可能會有許多,但是如果能夠理解第二章整個的流程、掌握配套的代碼編寫,就能夠靈活運用於不同的模型上面。后面在代碼程序設計的時候,我會將一些其它方面的考慮一起放出來。
光是采集方法就說了好多,再一次說明了圖像拼接的復雜。選用什么樣的采集方法就決定了以后圖像投影變換的細節,間接地決定了最后拼接結果的質量。
2.2投影變換
二維平面運動參數模型是根據建立的數學模型,將待拼接圖像轉換到參考圖像的坐標系中,以此來構成完整的拼接圖像。
2.2.1兩步成像
到了這里,就必須涉及相機模型的簡單介紹。在我們正常的圖像采集中,采用的是“兩步成像”方法,將三維物體展現在相機二維的成像面上(比如ccd或者cmos)。
我們在電子圖片中,看到的是圖像的像
![]() |
同樣可以再舉一個圖
![]() |
2.2.2圓柱面投影算法
(分清楚什么是先驗知識)圓柱面投影算法 由於采集的原始圖像是在繞視點一周不同角度下拍攝的,它們並不在同一投影平面上,投影存在一定的夾角。如果對圖像直接進行拼接,得到的拼合圖像在重疊區域會發生局部扭曲現象,並會破壞實際場景的視覺一致性,無法滿足實際場景中各對象間的幾何關系。比如場景中本來是直線的景物,在拼接后變成了折線,為了保證實際場景在視覺上的一致性,維持實際場景中的空間約束關系。我們必須將拍照得到的反映各自投影平面的各局部圖像映射到一個標准投影即柱面投影上,以便獲得從投影中心觀察圖像在柱面上的成像。這樣一方面消除了實景圖像之間可能存在的重復景物信息,同時也得到了每張實景圖像上的像素點在視點空間中的位置信息。
(提示:哪些是虛擬像平面)
展平的過程肯定是一個非線性變換,具體來說就是三角變換。
2.2.3 二維坐標體系中的8參數模型。
其中,各個參數定義
![]() |
![]() |
2.3 特征匹配
1)什么是特征點?
可以這樣簡單理解,所謂“特征點”就是能夠表明物體本身特征的點。也就是說,這種特征提取的方法具有獨特的算法,使得即使你處理在不同的拍攝條件下拍攝同一物體,都能夠得到同樣的特征值。(所謂“尺度不變性”).
這種特性對於圖像拼接來說具有重要意義,因為目前計算機無法識別出圖片中的物體,但是如果有一種統一的計算方法,能夠告訴計算機不同圖片中同一物體的特征點,那么也就是得到了物體的位置和形態了。(可以看圖)
![]() |
2)常用的特征點尋找方法。
SIFT,即尺度不變特征變換(Scale-invariant feature transform,SIFT),是用於圖像處理領域的一種描述。這種描述具有尺度不變性,可在圖像中檢測出關鍵點,是一種局部特征描述子。該方法於1999年由David Lowe 首先發表於計算機視覺國際會議(International Conference on Computer Vision,ICCV),2004年再次經David Lowe整理完善后發表於International journal of computer vision(IJCV)。截止2014年8月,該論文單篇被引次數達25000余次。
SURF(Speeded Up Robust Features)是一個穩健的圖像識別和描述算法,首先於2006年發表在歐洲計算機視覺國際會議 用於計算機視覺任務,如物件識別和3D重構。他部分的靈感來自於SIFT算法。SURF標准的版本比SIFT要快數倍,並且其作者聲稱在不同圖像變換方面比SIFT更加穩健。SURF 基於近似的2D 離散小波變換響應和並且有效地利用了積分圖。該算法由Herbert Bay於2006年首次發表於ECCV,2008年正式發表在Computer vision and image understanding期刊上,論文被引9000余次。
ORB,從它的名字中可以看出它是對FAST特征點與BREIF特征描述子的一種結合與改進,這個算法是由Ethan Rublee,Vincent Rabaud,Kurt Konolige以及Gary R.Bradski在2011年一篇名為“ORB:An Efficient Alternative to SIFT or SURF”的文章中提出。就像文章題目所寫一樣,ORB是除了SIFT與SURF外一個很好的選擇,而且它有很高的效率,最重要的一點是它是免費的,SIFT與SURF都是有專利的,你如果在商業軟件中使用,需要購買許可。
關於SIFT/SURF/ORB,可以通過發表的論文看出之間的相互關系,特征點提取是一個復雜的話題,網絡上有很多資料需要去消化吸收。在我的博客中現有調用SURF進行圖像處理的一些實驗的例子,可以幫助學習。關於這三者的深入解讀的課程已經在籌備。
需要注意一點,即使你不懂特征提取的原理,也是可以利用其進行圖像拼接的。當然要解決復雜問題,最好還是要懂原理。在實際的使用過程中,ORB速度很快,並且能夠提供足夠的特征點,同時相比較其他兩者編譯起來比較簡單(因為SIFT/SURF要聯編contrib庫),所以本拼接教程采用ORB算法。
特征點有沒有失效的時候?怎么辦?
![]() |
首先想到的是采用前后的變換矩陣進行擬合,也就是估計出可能的情況。但是這里是8參數估計,所以只是在一些特殊的情況下效果較好(比如有機械臂控制的平面移動)。或者可以采用模板識別輔助獲得變換的具體情況。
關於模板識別,可以參考OpenCV官方Wiki,我的博客中也有相關內容,網絡上同時資料比較豐富。
3)特征提純
采用特征匹配可能會得到很多匹配的結果。對於自然圖像來說,效果一般比較好:
![]() |
![]() |
就需要有特定的方法提純這些特征點。主流方法為RANSAC(Random Sample Consensus),它是根據一組包含異常數據的樣本數據集,計算出數據的數學模型參數,得到有效樣本數據的算法。同樣不展開,具體看博客。《RANSAC算法在圖像拼接上的應用的實現》,都是帶有原理解析和代碼的。
4)
特征匹配最后得到一個什么結果,達到什么效果?
即使前面做了那么多工作,最后圖像對准的結果還可能是這樣:
![]() |
2.4圖像對准
圖像配准是整個圖像拼接過程的核心部分,是將不同條件下(氣候、照度、攝像位置和角度等)、不同時間或不同傳感器獲取的同一場景的兩幅或多幅圖像進行最優匹配的過程。
圖像變換后,往往碰到坐標值非整數的情況,為了解決這個問題,圖像的插值理論(最近鄰插值、雙線性插值、三次樣條插值) 經常會被運用到拼接算法中。
2.5 圖像融合
圖像在拍攝過程中可能會存在光照變換,若將配准后圖像直接拼接在一起,會出現明顯的拼接痕跡,使整個圖像看起來光照不夠自然,圖像融合部分幫助我們解決這一問題。當然但是如果前面做的不好,最后的結果即使要不融合不好;要不融合后的結果和實際不相符。
![]() |
2.6 反向投影(顯示結果)
所謂反向投影這個玄乎的名字,其實想說明的就是將最后拼接的結果顯示出來。最直接的就是還是顯示成為一個圖片(也是我們這個教程要做的),那么復雜一點,可以顯示成一個flash;可以顯示成一個VR的雙目的效果。大家自己發揮,這里拋磚引玉。