乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      超詳講解圖像拼接/全景圖原理和應(yīng)用 | 附源碼

       InfoRich 2022-03-30

      重磅干貨,第一時(shí)間送達(dá)Image

      概述

      圖像拼接是計(jì)算機(jī)視覺(jué)中最成功的應(yīng)用之一。如今,很難找到不包含此功能的手機(jī)或圖像處理API。

      在這篇文章中,我們將討論如何使用Python和OpenCV執(zhí)行圖像拼接。鑒于一對(duì)共享一些共同區(qū)域的圖像,我們的目標(biāo)是“縫合”它們并創(chuàng)建全景圖像場(chǎng)景。

      在整篇文章中,我們將介紹一些最著名的計(jì)算機(jī)視覺(jué)技術(shù)。這些包括:

      • 關(guān)鍵點(diǎn)檢測(cè)

      • 局部不變描述符(SIFT,SURF等)

      • 特征匹配

      • 使用RANSAC進(jìn)行的旋轉(zhuǎn)估計(jì)(Homography estimation)

      • 透視畸變(Perspective warping)

      我們探索了許多特征提取算子,如SIFT,SURF,BRISK和ORB。你可以使用這款Colab筆記本,甚至可以用你的照片試試。[這里我已經(jīng)調(diào)試好源碼并上傳到github上面]

      Image

      特征檢測(cè)和提取

      給定一對(duì)像上面那樣的圖像,我們想要把它們拼接起來(lái)創(chuàng)建一個(gè)全景場(chǎng)景。值得注意的是,兩個(gè)圖像都需要共享一些共同的區(qū)域

      此外,即使圖片在以下一個(gè)或多個(gè)方面存在差異,我們的解決方案也必須強(qiáng)大:

      • Scaling

      • Angle

      • Spacial position

      • Capturing devices

      朝這個(gè)方向邁出的第一步是提取一些感興趣的關(guān)鍵點(diǎn)和特征。但是,這些功能需要具有一些特殊屬性。

      我們首先考慮一個(gè)簡(jiǎn)單的解決方案。

      關(guān)鍵點(diǎn)檢測(cè)
       

      一開(kāi)始可能使用簡(jiǎn)單些的方法,諸如使用Harris Corners之類(lèi)的算法提取關(guān)鍵點(diǎn)。然后,我們可以嘗試根據(jù)歐幾里德距離之類(lèi)的相似度量來(lái)匹配相應(yīng)的關(guān)鍵點(diǎn)。我們知道,角點(diǎn)(corner)有一個(gè)很好的屬性:它們對(duì)旋轉(zhuǎn)是不變的。 這意味著,一旦我們檢測(cè)到一個(gè)角點(diǎn),如果我們旋轉(zhuǎn)圖像,那個(gè)角點(diǎn)仍將存在。

      但是,如果我們旋轉(zhuǎn)然后縮放圖像怎么辦?在這種情況下,我們會(huì)很難,因?yàn)榻屈c(diǎn)不是規(guī)模不變的。也就是說(shuō),如果我們放大圖像,先前檢測(cè)到的角可能會(huì)變成一條線!

      總之,我們需要對(duì)旋轉(zhuǎn)和縮放不變的特征。這就是SIFT,SURF和ORB等更強(qiáng)大的方法的用武之地。

      關(guān)鍵點(diǎn)和描述子

      像SIFT和SURF這樣的方法試圖解決角點(diǎn)檢測(cè)算法的局限性。
      通常,角點(diǎn)檢測(cè)器算法使用固定大小的內(nèi)核來(lái)檢測(cè)圖像上的感興趣區(qū)域(角點(diǎn))。很容易看出,當(dāng)我們縮放圖像時(shí),這個(gè)內(nèi)核可能會(huì)變得太小或太大。

      為了解決這個(gè)限制,像SIFT這樣的方法使用高斯差分(DoD)。我們的想法是在同一圖像的不同比例版本上應(yīng)用DoD。它還使用相鄰像素信息來(lái)查找和細(xì)化關(guān)鍵點(diǎn)和相應(yīng)的描述子。

      首先,我們需要加載2個(gè)圖像,查詢圖片和訓(xùn)練圖片。最初,我們首先從兩者中提取關(guān)鍵點(diǎn)和描述符。我們可以通過(guò)使用OpenCV detectAndCompute()函數(shù)一步完成。請(qǐng)注意,為了使用detectAndCompute(),我們需要一個(gè)關(guān)鍵點(diǎn)檢測(cè)器和描述符對(duì)象的實(shí)例。它可以是ORB,SIFT或SURF等。另外,在將圖像饋送到detectAndCompute()之前,我們將它們轉(zhuǎn)換為灰度。

      def detectAndDescribe(image, method=None):
        '''
        Compute key points and feature descriptors using an specific method
        '''
         
        assert method is not None, 'You need to define a feature detection method. Values are: 'sift', 'surf''
         
        # detect and extract features from the image
        if method == 'sift':
            descriptor = cv2.xfeatures2d.SIFT_create()
        elif method == 'surf':
            descriptor = cv2.xfeatures2d.SURF_create()
        elif method == 'brisk':
            descriptor = cv2.BRISK_create()
        elif method == 'orb':
            descriptor = cv2.ORB_create()
             
        # get keypoints and descriptors
        (kps, features) = descriptor.detectAndCompute(image, None)
         
        return (kps, features)
      我們對(duì)查詢和訓(xùn)練的圖片都運(yùn)行detectAndCompute()。此時(shí),我們?yōu)檫@兩個(gè)圖像提供了一組關(guān)鍵點(diǎn)和描述子。如果我們使用SIFT作為特征提取器,它將為每個(gè)關(guān)鍵點(diǎn)返回128維特征向量。如果選擇SURF,我們將獲得64維特征向量。以下圖像顯示了使用SIFT,SURF,BRISK和ORB提取的一些功能。

      Image

      使用SIFT檢測(cè)關(guān)鍵點(diǎn)和描述子

      Image

      使用SURF檢測(cè)關(guān)鍵點(diǎn)和描述子

      Image

      使用BRISK和漢明距離檢測(cè)關(guān)鍵點(diǎn)和描述子

      Image

      使用ORB和漢明距離檢測(cè)關(guān)鍵點(diǎn)和描述子

      特征匹配

      我們可以看到,我們從兩個(gè)圖像中都有大量的特征。

      現(xiàn)在,我們想比較兩組特征并以線段相連的形式顯示更多相似性的特征點(diǎn)對(duì)。
      使用OpenCV,功能匹配需要Matcher對(duì)象。在這里,我們探索兩種方法:
      • Brute Force Matcher(暴力匹配法)

      • KNN(k-最近鄰)

      BruteForce(BF)Matcher正如其名稱所表明的那樣。給定2組特征(來(lái)自圖片A和圖片B),來(lái)自集合A的每個(gè)特征與集合B中的所有特征進(jìn)行比較。默認(rèn)情況下,BF匹配器計(jì)算兩點(diǎn)之間的歐幾里德距離。因此,對(duì)于集合A中的每個(gè)特征,它返回集合B中最接近的特征。對(duì)于SIFT和SURF,OpenCV建議使用歐幾里德距離。對(duì)于其他特征提取器,如ORB和BRISK,建議使用漢明距離。
      要使用OpenCV創(chuàng)建BruteForce Matcher,我們只需要指定2個(gè)參數(shù)。第一個(gè)是距離度量。第二個(gè)是crossCheck布爾參數(shù)。
        def createMatcher(method,crossCheck):
        'Create and return a Matcher Object'
         
        if method == 'sift' or method == 'surf':
            bf = cv2.BFMatcher(cv2.NORM_L2, crossCheck=crossCheck)
        elif method == 'orb' or method == 'brisk':
            bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=crossCheck)
        return bf
      crossCheck bool參數(shù)指示兩個(gè)特征是否必須相互匹配才能被視為有效。換句話說(shuō),對(duì)于被認(rèn)為有效的一對(duì)特征(f1,f2),f1需要匹配f2,并且f2也必須匹配f1作為最接近的匹配。此過(guò)程可確保更強(qiáng)大的匹配功能集,并在原始SIFT文章中進(jìn)行了描述。
      但是,對(duì)于我們想要考慮多個(gè)候選匹配的情況,我們可以使用基于KNN的匹配過(guò)程。

      KNN不返回給定特征的單個(gè)最佳匹配,而是返回k個(gè)最佳匹配

      注意,k的值必須是由用戶預(yù)先定義的。如我們預(yù)期的那樣,KNN提供了一個(gè)更的的候選特征集合。但是,我們需要確保所有這些匹配對(duì)在進(jìn)一步發(fā)展之前都是健壯的。

      比率測(cè)試(Ratio Testing)

      為了確保KNN返回的特征具有良好的可比性,SIFT論文的作者提出了一種稱為比率測(cè)試(Ratio Testing)的技術(shù)。基本上,我們迭代KNN返回的每個(gè)對(duì)并執(zhí)行距離測(cè)試。對(duì)于每對(duì)特征(f1,f2),如果f1和f2之間的距離在一定比例內(nèi),我們保留它,否則,我們將它丟棄。此外,必須手動(dòng)選擇比率值。

      從本質(zhì)上講,比率測(cè)試與BruteForce Matcher的交叉檢查選項(xiàng)完成相同的工作。兩者都確保一對(duì)檢測(cè)到的特征確實(shí)足夠近以至于被認(rèn)為是相似的。下面的2個(gè)數(shù)字顯示了BF和KNN Matcher對(duì)SIFT特征的結(jié)果。我們選擇僅顯示100個(gè)匹配點(diǎn)以清除可視化。

      Image

      使用KNN和RIFT測(cè)試對(duì)SIFT特征進(jìn)行特征匹配

      Image

      在SIFT功能上使用Brute Force Matcher進(jìn)行特征匹配

      請(qǐng)注意,即使在KNN中交叉驗(yàn)證——暴力匹配(Brute force)和比率測(cè)試之后,某些功能也無(wú)法正確匹配。
      然而,Matcher算法將為我們提供兩個(gè)圖像中最好的(更相似的)特征集?,F(xiàn)在,我們需要獲取這些點(diǎn)并找到基于匹配點(diǎn)將2個(gè)圖像拼接在一起的變換矩陣。

      這種轉(zhuǎn)換稱為Homography matrix(單應(yīng)性矩陣)。簡(jiǎn)而言之,如果Homography是3x3矩陣,可用于許多應(yīng)用,例如相機(jī)姿態(tài)估計(jì),透視校正和圖像拼接。如果Homography是2D變換。它將點(diǎn)從一個(gè)平面(圖像)映射到另一個(gè)平面。讓我們看看我們是如何得到它的。

      Estimating the Homograph

      RANdom SAmple Consensus或RANSAC是一種適合線性模型的迭代算法。與其他線性回歸器不同,RANSAC設(shè)計(jì)為對(duì)異常值具有魯棒性。
      像線性回歸這樣的模型使用最小二乘估計(jì)來(lái)使最佳模型適合數(shù)據(jù)。然而,普通最小二乘法對(duì)異常值非常敏感。因此,如果異常值的數(shù)量很大,它可能會(huì)失敗。
      RANSAC通過(guò)僅使用數(shù)據(jù)中的內(nèi)部子集估計(jì)參數(shù)來(lái)解決此問(wèn)題。下圖顯示了線性回歸和RANSAC之間的比較。首先,請(qǐng)注意數(shù)據(jù)集包含相當(dāng)多的異常值。

      我們可以看到線性回歸模型很容易受到異常值的影響。那是因?yàn)樗噲D減少平均誤差。因此,它傾向于支持最小化從所有數(shù)據(jù)點(diǎn)到模型本身的總距離的模型。這包括異常值。

      相反,RANSAC僅將模型擬合到被識(shí)別為內(nèi)點(diǎn)的點(diǎn)子集上。

      這個(gè)特性對(duì)我們的用例非常重要。在這里,我們將使用RANSAC來(lái)估計(jì)Homography矩陣。事實(shí)證明,Homography對(duì)我們傳遞給它的數(shù)據(jù)質(zhì)量非常敏感。因此,重要的是有一個(gè)算法(RANSAC)可以過(guò)濾明顯不屬于數(shù)據(jù)分布的點(diǎn)。

      Image

      最小二乘與RANSAC模型擬合的比較。請(qǐng)注意數(shù)據(jù)中的大量異常值

      一旦我們得到 estimated Homography,我們需要將其中一個(gè)圖像變換到一個(gè)共同的平面。
      在這里,我們將對(duì)其中一個(gè)圖像應(yīng)用透視變換?;旧?,透視變換可以組合一個(gè)或多個(gè)操作,例如旋轉(zhuǎn),縮放,平移或剪切。這個(gè)想法是轉(zhuǎn)換其中一個(gè)圖像,使兩個(gè)圖像合并為一個(gè)。為此,我們可以使用OpenCV warpPerspective()函數(shù)。它采用圖像和homography作為輸入。然后,它根據(jù)homography將源圖像變換到目的平面上。
      # Apply panorama correction
      width = trainImg.shape[1] + queryImg.shape[1]
      height = trainImg.shape[0] + queryImg.shape[0]

      result = cv2.warpPerspective(trainImg, H, (width, height))
      result[0:queryImg.shape[0], 0:queryImg.shape[1]] = queryImg

      plt.figure(figsize=(20,10))
      plt.imshow(result)

      plt.axis('off')
      plt.show()
      生成的全景圖像如下所示。如我們所見(jiàn),結(jié)果中有幾個(gè)工件。更具體地說(shuō),我們可以看到與圖像邊界處的照明條件和邊緣效應(yīng)有關(guān)的一些問(wèn)題。理想情況下,我們可以執(zhí)行后處理技術(shù)來(lái)標(biāo)準(zhǔn)化直方圖匹配等強(qiáng)度。這可能會(huì)使結(jié)果看起來(lái)更加真實(shí)。

      謝謝閱讀!

      效果圖

      Image

      demo 2

      Image

      Image

      可能遇到bug

      可能存在的報(bào)錯(cuò)

      (1)Qt 鏈接報(bào)錯(cuò) version `Qt_5' not found]

      python3: relocation error: /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5: symbol _ZN20QPlatformIntegration11screenAddedEP15QPlatformScreenb version Qt_5_PRIVATE_API not defined in file libQt5Gui.so.5 with link time reference

      解決方案:https://www.cnblogs.com/sunchaothu/p/9962675.html

      (2)AttributeError: module 'cv2.cv2' has no attribute 'xfeatures2d'

      需要回退版本到3.4.2.16,記得要先卸載之前安裝好的opencv-python

      解決方案:https://blog.csdn.net/weixin_43167047/article/details/82841750

      代碼:https://github.com/DWCTOD/AI_study

      原文鏈接:

      https:///image-panorama-stitching-with-opencv-2402bde6b46c

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類(lèi)似文章 更多