OpenCV-Python SIFT尺度不變特徵變換|三十九

2020-12-13 人工智慧遇見磐創

目標

在這一章當中,

我們將學習SIFT算法的概念我們將學習找到SIFT關鍵點和描述算符。理論

在前兩章中,我們看到了一些像Harris這樣的拐角檢測器。它們是旋轉不變的,這意味著即使圖像旋轉了,我們也可以找到相同的角。很明顯,因為轉角在旋轉的圖像中也仍然是轉角。但是縮放呢?如果縮放圖像,則拐角可能不是角。例如,檢查下面的簡單圖像。在同一窗口中放大小窗口中小圖像中的拐角時,該角是平坦的。因此,Harris拐角不是尺度不變的。

因此,在2004年,不列顛哥倫比亞大學的D.Lowe在他的論文《尺度不變關鍵點中的獨特圖像特徵》中提出了一種新算法,即尺度不變特徵變換(SIFT),該算法提取關鍵點並計算其描述算符。 (改論文易於理解,被認為是學習SIFT的最佳材料。因此,本文只是該論文的簡短摘要)。 SIFT算法主要包括四個步驟。 我們將一一看到它們。

SIFT算法主要包括四個步驟。我們將一一看到它們。

1. 尺度空間極值檢測

從上圖可以明顯看出,我們不能使用相同的窗口來檢測具有不同比例的關鍵點。即便小拐角可以。但是要檢測更大的拐角,我們將需要更大的窗口。為此,使用了比例空間濾波。在其中,找到具有各種$σ$值的圖像的高斯拉普拉斯算子。LoG用作斑點檢測器,可檢測由於$σ$的變化而導致的各種大小的斑點。簡而言之,$σ$用作縮放參數。例如,在上圖中,低$σ$的高斯核對於較小的拐角給出較高的值,而高$σ$的高斯核對於較大的拐角而言非常合適。因此,我們可以找到整個尺度和空間上的局部最大值,這給了我們$(x,y,σ)$值的列表,這意味著在$(x,y)$在$σ$尺度上有一個潛在的關鍵點。

但是這種LoG代價昂貴,因此SIFT算法使用的是高斯差值,它是LoG的近似值。高斯差是作為具有兩個不同$σ$的圖像的高斯模糊差而獲得的,設為$σ$和$kσ$。此過程是針對高斯金字塔中圖像的不同八度完成的。如下圖所示:

一旦找到該DoG,便會在圖像上搜索比例和空間上的局部極值。例如,將圖像中的一個像素與其8個相鄰像素以及下一個比例的9個像素和前一個比例的9個像素進行比較。如果是局部極值,則可能是關鍵點。從根本上說,關鍵點是最好的代表。如下圖所示:

對於不同的參數,本文給出了一些經驗數據,可以概括為:octaves=4,縮放尺度=5,初始$σ=1.6$,$k=sqrt{2}$等作為最佳值。

2. 關鍵點定位

一旦找到潛在的關鍵點位置,就必須對其進行優化以獲取更準確的結果。他們使用了標度空間的泰勒級數展開來獲得更精確的極值位置,如果該極值處的強度小於閾值(根據論文為0.03),則將其拒絕。在OpenCV DoG中,此閾值稱為ContrastThreshold,它對邊緣的響應較高,因此也需要刪除邊緣。

為此,使用類似於哈裡斯拐角檢測器的概念。他們使用2x2的Hessian矩陣(H)計算主曲率。從哈裡斯拐角檢測器我們知道,對於邊緣,一個特徵值大於另一個特徵值。因此,這裡他們使用了一個簡單的函數。

如果該比率大於一個閾值(在OpenCV中稱為edgeThreshold),則該關鍵點將被丟棄。論文上寫的值為10。

因此,它消除了任何低對比度的關鍵點和邊緣關鍵點,剩下的就是很可能的目標點。

3. 方向分配

現在,將方向分配給每個關鍵點,以實現圖像旋轉的不變性。根據比例在關鍵點位置附近採取鄰域,並在該區域中計算梯度大小和方向。創建了一個具有36個覆蓋360度的bin的方向直方圖(通過梯度幅度和$σ$等於關鍵點比例的1.5的高斯加權圓窗加權)。提取直方圖中的最高峰,並且將其超過80%的任何峰也視為計算方向。它創建的位置和比例相同但方向不同的關鍵點。它有助於匹配的穩定性。

4. 關鍵點描述

現在創建了關鍵點描述符。在關鍵點周圍採用了16x16的鄰域。它分為16個4x4大小的子塊。對於每個子塊,創建8 bin方向直方圖。因此共有128個bin值可用。它被表示為形成關鍵點描述符的向量。除此之外,還採取了幾種措施來實現針對照明變化,旋轉等的魯棒性。

5. 關鍵點匹配

通過識別兩個圖像的最近鄰,可以匹配兩個圖像之間的關鍵點。但是在某些情況下,第二個最接近的匹配可能非常接近第一個。它可能是由於噪音或其他原因而發生的。在那種情況下,採用最接近距離與第二最接近距離之比。如果大於0.8,將被拒絕。根據論文,它可以消除大約90%的錯誤匹配,而僅丟棄5%的正確匹配。因此,這是SIFT算法的總結。有關更多詳細信息和理解,強烈建議閱讀原始論文。記住一件事,該算法已申請專利。所以這個算法包含在opencv contrib repo中

OpenCV中的SIFT

現在,讓我們來看一下OpenCV中可用的SIFT功能。讓我們從關鍵點檢測開始並進行繪製。首先,我們必須構造一個SIFT對象。我們可以將不同的參數傳遞給它,這些參數是可選的,它們在docs中已得到很好的解釋。

import numpy as npimport cv2 as cvimg = cv.imread('home.jpg')gray= cv.cvtColor(img,cv.COLOR_BGR2GRAY)sift = cv.xfeatures2d.SIFT_create()kp = sift.detect(gray,None)img=cv.drawKeypoints(gray,kp,img)cv.imwrite('sift_keypoints.jpg',img)sift.detect()函數在圖像中找到關鍵點。如果只想搜索圖像的一部分,則可以通過掩碼。每個關鍵點是一個特殊的結構,具有許多屬性,例如其(x,y)坐標,有意義的鄰域的大小,指定其方向的角度,指定關鍵點強度的響應等。

OpenCV還提供cv.drawKeyPoints()函數,該函數在關鍵點的位置繪製小圓圈。如果將標誌cv.DRAWMATCHESFLAGSDRAWRICH_KEYPOINTS傳遞給它,它將繪製一個具有關鍵點大小的圓,甚至會顯示其方向。請參見以下示例。

img=cv.drawKeypoints(gray,kp,img,flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv.imwrite('sift_keypoints.jpg',img)查看下面的結果:

現在要計算描述符,OpenCV提供了兩種方法。

由於已經找到關鍵點,因此可以調用sift.compute(),該函數根據我們找到的關鍵點來計算描述符。例如:kp,des = sift.compute(gray,kp)如果找不到關鍵點,則可以使用sift.detectAndCompute()函數在單步驟中直接找到關鍵點和描述符。我們將看到第二種方法:

sift = cv.xfeatures2d.SIFT_create() kp, des = sift.detectAndCompute(gray,None)這裡的kp將是一個關鍵點列表,而des是一個形狀為$NumberofKeypoints×128$的數字數組。

這樣我們得到了關鍵點,描述符等。現在我們想看看如何在不同圖像中匹配關鍵點。我們將在接下來的章節中學習。

相關焦點

  • OpenCV特徵點檢測——ORB特徵
    這個特徵描述子是由EPFL的Calonder在ECCV2010上提出的。主要思路就是在特徵點附近隨機選取若干點對,將這些點對的灰度值的大小,組合成一個二進位串,並將這個二進位串作為該特徵點的特徵描述子。
  • Python下opencv使用筆記(一:簡單操作與幾何變換)
    上次分享了一個關於python下opencv的所有相關資料,詳細可參考下載:珍藏資料-學習OpenCV與計算機視覺-有這些就夠了1.最後索性找到了一個集成的軟體,就是把常用的包都加進去了的python,軟體是Ipython,是一個集成的科學計算軟體,裡面集成了許多包,並且是一個神似matlab的軟體,有調試,測試,觀看變量數值等等許多相同的地方,所以如果你是想研究這樣面而又苦惱安裝包的話,就下載個這個安裝起來吧。關於python下使用opencv讀取圖像。
  • 詳解計算機視覺中的特徵點檢測:Harris / SIFT / SURF / ORB
    這個特徵可以從人眼的視覺原理去理解,人在看一件物體時,離得越遠,物體的細節看到的越少,細節特徵是在減少的。對生理學的研究中發現,哺乳動物的視網膜和視覺皮層的感受區域可以很好地用4階以內的高斯微分來建模。尺度伸縮不變性,對原來的信號加一個變換函數,對變換後的信號再進行高斯核的尺度空間生成,新的信號的極值點等特徵是不變的。
  • opencv-python圖像預處理-濾波
    頻率域是指從函數的頻率角度出發分析函數,對圖像進行傅立葉變換可以將圖像由圖像空間轉換到頻域空間,然後在頻率域中對圖像的頻譜作分析處理,以改變圖像的頻率特徵。空間域與頻率域是兩種不同的技術,都可以實現對圖像的濾波、增強,只是有些處理方式更適合在空間域完成,而有些則更適合在頻率域中完成。
  • 你真的理解圖像處理經典算法 SIFT 嗎?最深入、最全面綜述:尺度不變特徵轉換
    所有後面的對圖像數據的操作都相對於關鍵點的方向、尺度和位置進行變換,從而提供對於這些變換的不變性。4.高斯濾波SIFT算法是在不同尺度空間上查找關鍵點,而尺度空間的獲取需要使用高斯模糊來實現,Lindeberg等人已經證明高斯卷積核是實現尺度變換的唯一變換核,並且是唯一的線性核。
  • 圖像配準:從SIFT到深度學習
    傳統的基於特徵的方法自21世紀初以來,圖像配準主要使用基於特徵的方法。這些方法有三個步驟:關鍵點檢測和特徵描述,特徵匹配,圖像變換。簡單的說,我們選擇兩個圖像中的感興趣點,將參考圖像(reference image)與感測圖像(sensed image)中的等價感興趣點進行關聯,然後變換感測圖像使兩個圖像對齊。
  • 【走進OpenCV】霍夫變換檢測直線和圓
    一個非常有效的方法就是霍夫變換,它是圖像中識別各種幾何形狀的基本算法之一。霍夫線變換是一種在圖像中尋找直線的方法。OpenCV中支持三種霍夫線變換,分別是標準霍夫線變換、多尺度霍夫線變換、累計概率霍夫線變換。在OpenCV中可以調用函數HoughLines來調用標準霍夫線變換和多尺度霍夫線變換。HoughLinesP函數用於調用累積概率霍夫線變換。
  • OpenCV-Python 特徵匹配 + 單應性查找對象|四十五
    目標在本章節中,我們將把calib3d模塊中的特徵匹配和findHomography混合在一起,以在複雜圖像中找到已知對象。基礎那麼我們在上一環節上做了什麼?我們使用了queryImage,找到了其中的一些特徵點,我們使用了另一個trainImage,也找到了該圖像中的特徵,並且找到了其中的最佳匹配。簡而言之,我們在另一個混亂的圖像中找到了對象某些部分的位置。此信息足以在trainImage上準確找到對象。
  • python利用opencv實現證件照換底
    opencv今天就給大家介紹一下python利用opencv庫進行藍底換紅底或者白底照片的操作。1.強大的opencv庫說到圖像處理,不得不提opencv庫。它是一個跨平臺的計算機視覺庫,可以運行在不同作業系統上,它由一些列c函數和少量c++函數組成,並提供python,matlab等語言的接口,實現了圖像處理和計算機視覺方面的很多通用算法。我們這裡用的opencv-python 就是opencv的python API接口。
  • 如何快速簡單的安裝opencv-python
    這樣就會從清華鏡像安裝opencv-contrib-python庫。最新版本為4.1.1 ----2019-8-28在opencv-contrib-python 版本中含有額外模塊( Extra modules ),而 opencv-python 版本中只含有基礎模塊。
  • OpenCV-Python 特徵匹配|四十四
    目標在本章中,我們將看到如何將一個圖像中的特徵與其他圖像進行匹配。我們將在OpenCV中使用Brute-Force匹配器和FLANN匹配器Brute-Force匹配器的基礎蠻力匹配器很簡單。它使用第一組中一個特徵的描述符,並使用一些距離計算將其與第二組中的所有其他特徵匹配。並返回最接近的一個。
  • 「Python+cv2」Python安裝opencv及圖像的基本操作
    Python環境opencv的安裝1、檢查是否安裝python環境3、安裝opencvpython環境下opencv的安裝:pip3 install opencv-pythonpython opencv安裝因為我已經安裝,所以會出現安裝位置的提示。
  • Python 圖像處理 OpenCV (1):入門
    /官方 Demo :https://github.com/opencv/opencv/blob/master/samples/python圖書推薦圖書的話我就推薦一本吧,如果要看書學習絕對不能錯過的「Learning OpenCV 3」,當然,是英文原版的,中文版的話翻譯有點慘不忍睹,對英文閱讀壓力大的同學可以中英文對照著看:
  • Win7-64+Anaconda3+Python3.7+pycharm+OpenCV3.4.9.33—opencv安裝
    Win7 64環境下+Anaconda3-2020.02+Python3.7+ pycharm-community-2020.1.1+OpenCV3.4.9.33環境搭建——opencv介紹Win7 64下opencv_python-3.4.9.33-cp37-cp37m-win_amd64
  • 「python opencv視覺零到實戰」八、圖片選區操作
    一、學習目標了解什麼是ROI了解floodFill的使用方法如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰
  • 圖像配準的前世今生:從人工設計特徵到深度學習
    對一個圖像對通過單應性變換進行關聯的基於特徵的方法關鍵點檢測和特徵描述關鍵點就是感興趣的點。它定義了一幅圖像中重要並且有特點的地方(如角,邊等)。每個關鍵點都由一個描述子(包含關鍵點本質特點的特徵向量)表徵。描述子應該對圖像變換(如位置變換、縮放變換、亮度變換等)是魯棒的。
  • Python+OpenCV的基礎圖像處理操作匯總
    通過在CMD(命令提示符)中發出以下命令來安裝opencv python(這是一個用於python的非正式預構建opencv包):opencv-contrib-python(包含main和contrib模塊)opencv-python-headless(與opencv-python相同,但沒有
  • Python不超過10行代碼就可實現人臉識別,教你辨別真假
    安裝速度取決於網絡,安裝完畢需要綁定Python開發環境,有多種土方法:1)增加環境變量,將opencv 的site-packages 添加到PYTHONPATH中2)使用ln 軟連接,將cv2.so 連結到python 環境的 site-packages中3)直接cp cv2.so 到 python 環境的 site-packages 目錄下
  • 【光電視界】圖像配準的前世今生:從人工設計特徵到深度學習
    自本世紀初以來,圖像配準主要使用傳統的基於特徵的方法。這些方法基於三個步驟:關鍵點檢測和特徵描述,特徵匹配,圖像變形。簡而言之,我們在兩幅圖像中選擇興趣點,將參考圖像中的每個興趣點和它在待配準圖像中的對應點關聯起來,然後對待批准圖像進行變換,這樣兩幅圖像就得以對齊。對一個圖像對通過單應性變換進行關聯的基於特徵的方法關鍵點就是感興趣的點。它定義了一幅圖像中重要並且有特點的地方(如角,邊等)。
  • 「python opencv 計算機視覺零基礎實戰」第一節
    前置條件說明:本系列opencv實戰教程將從基礎到實戰,若只是簡單學習完python也可以通過該教程完成一般的機器學習編程;文中將會對很多python的基礎內容進行講解,但由於文章定位的原因將不會贅述過多的基礎內容,基礎內容進行第一次講解後第二次將不會過多贅述,本文主要講解的是opencv相關知識。