2017-05-24 88 views
0

我有兩個重疊的圖像。我想要對齊這兩個圖像。我目前的做法是在兩幅圖像中找到一個共同的特徵(標記)。然後,我想根據要素重疊的位置對齊這兩個圖像。如何根據匹配模板的共同特徵對齊兩個圖像

圖像並不完美,所以我正在尋找一些基於'最佳'擬合(最重疊)對齊的方式。最初我嘗試通過SIFT使用特徵匹配對齊圖像,但特徵匹配通常不正確/太少。

這是我用來尋找template代碼:

template = cv2.imread('template.png', 0) 
template = template - cv2.erode(template, None) 

image1 = cv2.imread('Image to align1.png') 
image2 = cv2.imread('Image to align2.png') 
image = image2 
img2 = image[:,:,2] 
img2 = img2 - cv2.erode(img2, None) 

ccnorm = cv2.matchTemplate(img2, template, cv2.TM_CCORR_NORMED) 
print(ccnorm.max()) 
loc = np.where(ccnorm == ccnorm.max()) 
print(loc) 
threshold = 0.1 
th, tw = template.shape[:2] 
for pt in zip(*loc[::-1]): 
    if ccnorm[pt[::-1]] < threshold: 
     continue 
    cv2.rectangle(image, pt, (pt[0] + tw, pt[1] + th), 
       (0, 0, 255), 2) 

這裏有匹配的特徵,12。 在此先感謝。

+0

你想簡單地移動圖像並重疊,還是想扭曲它(可能縮放,旋轉和透視失真)? –

+0

你可以參考這個[post](http://www.pyimagesearch.com/2016/01/11/opencv-panorama-stitching/ – ZdaR

+0

@AlexanderReynolds我使用手持相機/掃描儀通過玻璃屏幕捕捉圖像 – Bprodz

回答

2

您對OpenCV庫的選擇是使用任意數量的方法來選擇幾個點,並使用getAffineTransformgetPerspectiveTransform之類的函數在圖像中的這些點之間創建轉換。請注意,像這些功能需要作爲參數,而不是光度值(圖像)。您需要在第一張圖片中找到興趣點(比如那些標記點);並且您將希望在第二張圖像中找到相同的點,並將那些像素位置傳遞給像getAffineTransformgetPerspectiveTransform這樣的功能。然後,一旦有了這個變換矩陣,就可以使用warpAffinewarpPerspective將第二個圖像變形爲第一個圖像的座標(反之亦然)。

Affine轉換包括平移,旋轉,縮放和剪切。 透視轉換包括仿射轉換的所有內容,以及xy方向中的透視失真。對於getAffineTransform,您需要從第一個圖像發送三對點,並且這三個相同的像素位於第二個圖像中。對於getPerspectiveTransform,您將從每個圖像發送四個像素對。如果你想使用所有的標記點,你可以使用findHomography,這將允許你放置更多比四點,它會計算所有匹配點之間的最佳單應性。

當您使用特徵檢測和匹配來對齊圖像時,它將在後臺使用這些功能。不同之處在於它爲您找到了功能。但是,如果這不起作用,只需使用手動方法查找您喜歡的功能,然後在這些功能點上使用這些方法即可。例如,您可以找到您已經擁有的模板位置,並將其定義爲興趣區域(ROI),然後將標記點分解爲較小的模板片段並在您的投資回報率範圍內找到這些位置。然後你有兩個圖像中相應的點對;你可以將它們的位置輸入到findHomography或者只需選擇三個與getAffineTransform一起使用,或者與getPerspectiveTransform一起使用四個,然後就可以進行圖像變換,然後應用。


否則,你就需要使用類似Lukas-Kanade optical flow algorithm它可以做直接圖像匹配,如果你不希望使用基於特徵的方法,但這些都是令人難以置信的比較緩慢,以選擇一些特徵點和如果你使用整個圖像,就會找到這種方式。但是,如果你只需要拍幾張照片,這並不是什麼大事。爲了更加準確並且更快地收斂,如果能夠提供起始單應性,至少可以將其大致轉換爲正確的位置(例如,進行特徵檢測,請參閱該特徵大致爲(x', y')像素來自第一個的第二個圖像,並創建與該翻譯的單應性)。

如果你想嘗試的話,你也可以從Lucas-Kanade逆向合成算法或類似的網絡上找到一些用於單應性估計的Python例程。我也有自己的自定義例程,但我無法分享它,但是,如果您在沒有邊界框的情況下共享原始圖像,我可以在圖像上運行算法,也許可以提供一些估計的單應性數據來進行比較用。

+0

非常感謝您的詳細評論和提供的比較筆記。我會給你的方法一個鏡頭,並提供一些圖像進行比較,一旦我有一個工作解決方案。你能用Python編寫例程嗎?還是用C++編寫程序? – Bprodz

+0

Python。另外還有Matlab。我無法分享它,因爲我在一份工作中開發它,但你可以在網上找到許多實現。查看[menpofit](https://github.com/menpo/menpofit),它有多種盧卡斯 - 卡納德算法,編程很好。反向組合方法是最快的。但是我認爲如果你編寫自己的特徵選擇器,基於特徵的方法應該能夠完美地爲你工作。 –