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

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

目標

在這一章當中,

我們將學習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上提出的。主要思路就是在特徵點附近隨機選取若干點對,將這些點對的灰度值的大小,組合成一個二進位串,並將這個二進位串作為該特徵點的特徵描述子。
  • opencv-python圖像預處理-濾波
    頻率域是指從函數的頻率角度出發分析函數,對圖像進行傅立葉變換可以將圖像由圖像空間轉換到頻域空間,然後在頻率域中對圖像的頻譜作分析處理,以改變圖像的頻率特徵。空間域與頻率域是兩種不同的技術,都可以實現對圖像的濾波、增強,只是有些處理方式更適合在空間域完成,而有些則更適合在頻率域中完成。
  • 如何快速簡單的安裝opencv-python
    這樣就會從清華鏡像安裝opencv-contrib-python庫。目前opencv最新版本為4.1.1 ----2019-8-28在opencv-contrib-python 版本中含有額外模塊( Extra modules ),而 opencv-python 版本中只含有基礎模塊。
  • OpenCV-Python 特徵匹配 + 單應性查找對象|四十五
    目標在本章節中,我們將把calib3d模塊中的特徵匹配和findHomography混合在一起,以在複雜圖像中找到已知對象。基礎那麼我們在上一環節上做了什麼?我們使用了queryImage,找到了其中的一些特徵點,我們使用了另一個trainImage,也找到了該圖像中的特徵,並且找到了其中的最佳匹配。簡而言之,我們在另一個混亂的圖像中找到了對象某些部分的位置。此信息足以在trainImage上準確找到對象。
  • OpenCV-Python 特徵匹配|四十四
    它使用第一組中一個特徵的描述符,並使用一些距離計算將其與第二組中的所有其他特徵匹配。並返回最接近的一個。對於BF匹配器,首先我們必須使用cv.BFMatcher()創建BFMatcher對象。它需要兩個可選參數。第一個是normType,它指定要使用的距離測量。默認情況下為cv.NORM_L2。
  • 「python opencv視覺零到實戰」八、圖片選區操作
    一、學習目標了解什麼是ROI了解floodFill的使用方法如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰
  • OpenCV 之 霍夫變換
    Hough 變換,對圖像中直線的殘缺部分、噪聲、以及其它的共存結構不敏感,因此,具有很強的魯棒性。
  • 「python opencv視覺零基礎」十四、直方圖反向投影
    前文提醒:博主正在參加博客之星評比,成功入選Top200,現在暫居第九歡迎各位點擊了解更多幫我投票,非常感謝~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python
  • 圖像配準的前世今生:從人工設計特徵到深度學習
    對一個圖像對通過單應性變換進行關聯的基於特徵的方法關鍵點檢測和特徵描述關鍵點就是感興趣的點。它定義了一幅圖像中重要並且有特點的地方(如角,邊等)。每個關鍵點都由一個描述子(包含關鍵點本質特點的特徵向量)表徵。描述子應該對圖像變換(如位置變換、縮放變換、亮度變換等)是魯棒的。
  • 「python opencv視覺零基礎」十、圖片效果毛玻璃
    一、學習目標了解高斯模糊的使用方法了解毛玻璃的圖片效果添加了解如何自己做一個噪聲圖片目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰
  • 「python opencv視覺零基礎實戰」七邏輯運算應用
    一、學習目標了解opencv中圖像的邏輯運算了解opencv中邏輯運算的應用如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python
  • 「python opencv計算機視覺零基礎到實戰」九模糊
    一、學習目標了解什麼是卷積了解模糊的使用方法與應用目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰」 第四節色彩空間
  • opencv-python獲取圖像:面向對象與面向過程
    這裡需要注意以下,opencv讀取圖片默認通道為BGR的格式,當在其他UI用戶界面顯示圖像時注意轉換一下通道順序,例如BGR轉換成RGB:Image1=cv2.cvtColor(image, cv2.COLOR_BGR2RGB)下面讀取一張圖片並顯示
  • 使用OpenCV和Python構建自己的車輛檢測模型
    utm_source=blog&utm_medium=vehicle-detection-opencv-python)利用深度學習的計算機視覺(https://courses.analyticsvidhya.com/courses/computer-vision-using-deep-learning-version2?
  • 資料| Practical Python and OpenCV 一周時間帶你入門CV
  • Python中如何利用Opencv打開視頻或圖像並用PyQt控制項顯示
    一、python中opencv打開圖像方法:import cv2filename='dog.jpg'img=cv2.imread(filename)cv2.imshow('Main Window',img)cv2.waitKey() #任意鍵退出cv2.destroyAllWindows()二、python中用opencv打開視頻頭的方法:
  • OpenCV中的快速直線檢測
    本文範例運行環境FastLineDetectors運行必要條件FastLineDetectors屬於opencv-contrib中的模塊,需要安裝opencv-contrib-python。在python的opencv相關的安裝包中,opencv-python 包含主要模塊,opencv-contrib-python 包含主要模塊以及一些擴展模塊。但這兩個模塊並不兼容,如果已經安裝過opencv-python,需要先卸載,再安裝opencv-contrib-python。
  • 圖像特徵點|SIFT特徵點之圖像金字塔
    尺度不變特徵轉換即SIFT (Scale-invariant feature transform)是一種計算機視覺的算法。它用來偵測與描述影像中的局部性特徵,它在空間尺度中尋找極值點,並提取出其位置、尺度、旋轉不變量,此算法由 David Lowe在1999年所發表,2004年完善總結。
  • OpenCV-Python 光流|四十八
    我們將使用cv.calcOpticalFlowPyrLK()之類的函數來跟蹤視頻中的特徵點。我們將使用cv.calcOpticalFlowFarneback()方法創建一個密集的光流場。光流基於以下幾個假設進行工作:在連續的幀之間,對象的像素強度不變。相鄰像素具有相似的運動。考慮第一幀中的像素$I(x,y,t)$(在此處添加新維度:時間。之前我們只處理圖像,因此不需要時間)。
  • 基於python+OpenCV模塊的人臉識別定位技術
    本文將基於OpenCV模塊,在windows作業系統上,利用python語言,進行人臉識別技術的研究。當然OpenCV的應用領域很廣,除了人臉識別之外,它還支持圖像分割、動作識別、視頻處理等技術。代碼第1行導入opencv模塊。代碼的第3行(以上圖為準,空行也算一行),導入別人已經訓練好的臉部識別資料庫。這裡用到的數據是在github上開源的已經訓練好的分類器,如圖所示:需要將對應的數據文件(.xml文件)下載到指定目錄(代碼中的示例,展示的是與.py文件同一目錄下)。