導航:首頁 > 源碼編譯 > 圖像拼接演算法圖解

圖像拼接演算法圖解

發布時間:2023-05-27 12:55:17

❶ 長圖最多可以拼多少照片

長圖最多可以拼9張圖片,再多圖片也不清晰了,有的軟體還需要付費。LongScreen 是一款專注 iPhone 截屏的拼圖應用。它的特點是能輕松拼接橫向並列拼圖,並支持豎向快速拼接長圖,選擇好圖片點擊右上角合並就可以開始拼接了。

圖像拼接技術技術分類

圖像拼接技術主要包括兩個關鍵環節即圖像配准和圖像融合。對於圖像融合部分,由於其耗時不太大,且現有的幾種主要方法效果差別也不多,所以總體來說演算法上比較成熟。

而圖像配准部分是整個圖像拼接技術的核心部分,它直接關繫到圖像拼接演算法的成功率和運行速度,因此配准演算法的研究是多年來研究的重點。

目前的圖像配准演算法基本上可以分為兩類:基於頻域的方法(相位相關方法)和基於時域的方法。

相位相關法最早是由Kuglin和Hines在1975年提出的,並且證明在純二維平移的情形下,拼接精度可以達到1個像素,多用於航空照片和衛星遙感圖像的配准等領域。

該方法對拼接的圖像進行快速傅立葉變換,將兩幅待配准圖像變換到頻域,然後通過它們的互功率譜直接計算出兩幅圖像間的平移矢量,從而實現圖像的配准。由於其具有簡單而精確的特點,後來成為最有前途的圖像配准演算法之一。

但是相位相關方法一般需要比較大的重疊比例(通常要求配准圖像之間有50%的重疊比例),如果重疊比例較小,則容易造成平移矢量的錯誤估計,從而較難實現圖像的配准。

❷ 使用OpenCV和Python進行圖像拼接

么是圖像拼接呢?簡單來說,對於輸入應該有一組圖像,輸出是合成圖像。同時,必須保留圖像之間的邏輯流。

首先讓我們了解圖像拼接的概念。基本上,如果你想捕捉一個大的場景,你的相機只能提供一個特定解析度的圖像(如:640×480),這當然不足以捕捉大的全景。所以,我們可以做的是捕捉整個場景的多個圖像,然後把所有的碎片放在一起,形成一個大的圖像。這些有序的照片被稱為全景。獲取多幅圖像並將其轉換成全景圖的整個過程稱為圖像拼接。

首先,需要安裝opencv 3.4.2.16。

接下來我們將導入我們將在Python代碼中使用的庫:

在我們的教程中,我們將拍攝這張精美的照片,我們會將其分成兩張左右兩張照片,然後我們會嘗試拍攝相同或非常相似的照片。

因此,我將此圖像切成兩個圖像,它們會有某種重疊區域:

在此,我們將列出我們應採取的步驟,以取得最終的結果:

因此,從第一步開始,我們將導入這兩個圖像並將它們轉換為灰度,如果您使用的是大圖像,我建議您使用cv2.resize,因為如果您使用較舊的計算機,它可能會非常慢並且需要很長時間。如果要調整圖像大小,即調整50%,只需將fx = 1更改為fx = 0.5即可。

我們還需要找出兩幅圖像中匹配的特徵。我們將使用opencv_contrib的SIFT描述符。SIFT (Scale constant Feature Transform)是一種非常強大的OpenCV演算法。這些最匹配的特徵作為拼接的基礎。我們提取兩幅圖像的關鍵點和sift描述符如下:

kp1和kp2是關鍵點,des1和des2是圖像的描述符。如果我們用特徵來畫這幅圖,它會是這樣的:

左邊的圖像顯示實際圖像。右側的圖像使用SIFT檢測到的特徵進行注釋:

一旦你有了兩個圖像的描述符和關鍵點,我們就會發現它們之間的對應關系。我們為什麼要這么做?為了將任意兩個圖像連接成一個更大的圖像,我們必須找到重疊的點。這些重疊的點會讓我們根據第一幅圖像了解第二幅圖像的方向。根據這些公共點,我們就能知道第二幅圖像是大是小還是旋轉後重疊,或者縮小/放大後再fitted。所有此類信息的產生是通過建立對應關系來實現的。這個過程稱為registration。

對於匹配圖像,可以使用opencv提供的FLANN或BFMatcher方法。我會寫兩個例子證明我們會得到相同的結果。兩個示例都匹配兩張照片中更相似的特徵。當我們設置參數k = 2時,這樣我們就要求knnMatcher為每個描述符給出2個最佳匹配。「matches」是列表的列表,其中每個子列表由「k」個對象組成。以下是Python代碼:

FLANN匹配代碼:

BFMatcher匹配代碼:

通常在圖像中,圖像的許多地方可能存在許多特徵。所以我們過濾掉所有的匹配來得到最好的。因此我們使用上面得到的前2個匹配項進行比值檢驗。如果下面定義的比值大於指定的比值,則考慮匹配。

現在我們定義在圖像上繪制線條的參數,並給出輸出以查看當我們在圖像上找到所有匹配時的樣子:

這是輸出的匹配圖像:

這部分完整Python代碼:

因此,一旦我們獲得了圖像之間的最佳匹配,我們的下一步就是計算單應矩陣。如前所述,單應矩陣將與最佳匹配點一起使用,以估計兩個圖像內的相對方向變換。

在OpenCV中估計單應性是一項簡單的任務,只需一行代碼:

在開始編碼拼接演算法之前,我們需要交換圖像輸入。所以img_現在會取右圖像img會取左圖像。

那麼讓我們進入拼接編碼:

因此,首先,我們將最小匹配條件count設置為10(由MIN_MATCH_COUNT定義),並且只有在匹配良好的匹配超出所需匹配時才進行拼接。否則,只需顯示一條消息,說明匹配不夠。

因此,在if語句中,我們將關鍵點(從匹配列表)轉換為findHomography()函數的參數。

只需在這段代碼中討論cv2.imshow(「original_image_overlapping.jpg」,img2),我們就會顯示我們收到的圖像重疊區域:

因此,一旦我們建立了單應性,我們需要扭曲視角,我們將以下單應矩陣應用於圖像:

所以我們使用如下:

在上面兩行Python代碼中,我們從兩個給定的圖像中獲取重疊區域。然後在「dst」中我們只接收到沒有重疊的圖像的右側,因此在第二行代碼中我們將左側圖像放置到最終圖像。所以在這一點上我們完全拼接了圖像:

剩下的就是去除圖像的黑色,所以我們將編寫以下代碼來從所有圖像邊框中刪除黑邊:

這是我們調用修剪邊界的最終定義函數,同時我們在屏幕上顯示該圖像。如果您願意,也可以將其寫入磁碟:

使用上面的Python代碼,我們將首先收到原始圖片:

這是完整的最終代碼:

在本教程中,我們學習了如何使用OpenCV執行圖像拼接和全景構造,並編寫了最終的圖像拼接代碼。

我們的圖像拼接演算法需要四個主要步驟:檢測關鍵點和提取局部不變描述符; 獲得圖像之間的匹配描述符; 應用RANSAC估計單應矩陣; 使用單應矩陣應用warping transformation。

當僅為兩個圖像構建全景圖時,該演算法在實踐中工作良好。

❸ 急求!圖像拼接演算法代碼

演算法描述

procere ImageMatching

{

輸入FirstImage;

輸入SecondImage;

//獲得兩幅圖象的大小

Height1=GetImageHeight(FirstImage);

Height2=GetImageHeight(SecondImage);

Width1=GetImageWidth(FirstImage);

Width2=GetImageWidth(SecondImage);

// 從第二幅圖象取網格匹配模板

SecondImageGrid = GetSecondImageGrid(SecondImage);

// 粗略匹配,網格在第一幅圖象中先從左向右移動,再從下到上移動,每次移動一個網格間距,Step_Width 或Step_Height,當網格移出重疊區域後結束

y=Heitht1-GridHeight;

MinValue = MaxInteger;

While ( y<Height1-OverlapNumber)//當網格移出重疊部分後結束

{

x=Grid_Width/2; //當網格位於第一幅圖象的最左邊時,A點的橫坐標。

While ( x<(Width1-Grid_Width/2) )

{

FirstImageGrid=GetImgaeGrid(FirstImgaeGrid, x, y);

differ=CaculateDiff(FirstImgaeGrid, SecondImageGrid);//計算象素值差的平

//方和

if (differ<MinValue)

{

BestMatch_x=x;

BestMatch_y=y;

MinValue = differ;

}

x= x+Step_width;

}

y=y-Step_Height;

}

//精確匹配

Step_Width= Step_Width/2;

Step_Height= Step_Height/2;

While ( Step_Height>0 & Step_Width>0)//當水平步長和垂直步長均減為零時結束

{

if(Step_Height==0)//當僅有垂直步長減為零時,將其置為1

Step_Height=1;

If(Step_Width==0) //當僅有水平步長減為零時,將其置為1

Step_Width=1;

temp_x = BestMatch_x;

temp_y = BestMatch_y;

for ( i= -1; i<1; i++)

for( j= -1; j<1; j++)

{

if ((i=0&j!=0)|(i!=0&j=0))

{

FirstImageGrid=GetImgaeGrid(FirstImgaeGrid,

temp_x+i*Step_Width, temp_y +j*Step_Height);

differ=CaculateDiff(FirstImgaeGrid, SecondImageGrid);

if (differ<MinValue)

{

BestMatch_x=x;

BestMatch_y=y;

MinValue = differ;

}

}

}

Step_Height = Step_Height /2;

Step_Width = Step_Width/2;

}

}
不懂的可以問我,相互交流

閱讀全文

與圖像拼接演算法圖解相關的資料

熱點內容
搜索pdf內容 瀏覽:497
程序員裝機必備的軟體 瀏覽:9
php微信第三方登錄demo 瀏覽:536
上海php工具開發源碼交付 瀏覽:790
哪裡有求購黃頁的源碼 瀏覽:194
商城礦機源碼礦場系統 瀏覽:196
單片機的led燈熄滅程序 瀏覽:222
洛陽python培訓 瀏覽:702
小鍵盤命令 瀏覽:192
單片機c語言返回主程序 瀏覽:816
dockerpythonweb 瀏覽:970
程序員演算法有多強 瀏覽:717
pythonworkbook模塊 瀏覽:245
什麼app能查醫生 瀏覽:175
輕量級的編程語言 瀏覽:338
程序員那麼可愛生孩子 瀏覽:432
後綴him3加密文件是什麼軟體 瀏覽:986
堅果隱藏app為什麼要140版本才能用 瀏覽:313
淘寶dns伺服器地址 瀏覽:259
領英轉型app哪個好用 瀏覽:943