OpenCV-圖像特徵提取與描述

OpenCV-圖像特徵提取與描述

1 角點特徵

學習目標

  • 理解圖像的特徵
  • 知道圖像的角點

1.1 圖像的特徵

大多數人都玩過拼圖遊戲。首先拿到完整圖像的碎片,然後把這些碎片以正確的方式排列起來從而重建這幅圖像。如果把拼圖遊戲的原理寫成計算機程序,那計算機就也會玩拼圖遊戲了。

在拼圖時,我們要尋找一些唯一的特徵,這些特徵要適於被跟蹤,容易被比較。我們在一副圖像中搜索這樣的特徵,找到它們,而且也能在其他圖像中找到這些特徵,然後再把它們拼接到一起。我們的這些能力都是天生的。

那這些特徵是什麼呢?我們希望這些特徵也能被計算機理解。

如果我們深入的觀察一些圖像並搜索不同的區域,以下圖爲例:

image-20191008141826875

在圖像的上方給出了六個小圖。找到這些小圖在原始圖像中的位置。你能找到多少正確結果呢?

A 和 B 是平面,而且它們的圖像中很多地方都存在。很難找到這些小圖的準確位置。

C 和 D 也很簡單。它們是建築的邊緣。可以找到它們的近似位置,但是準確位置還是很難找到。這是因爲:沿着邊緣,所有的地方都一樣。所以邊緣是比平面更好的特徵,但是還不夠好。

最後 E 和 F 是建築的一些角點。它們能很容易的被找到。因爲在角點的地方,無論你向哪個方向移動小圖,結果都會有很大的不同。所以可以把它們當 成一個好的特徵。爲了更好的理解這個概念我們再舉個更簡單的例子。

image-20191008141945745

如上圖所示,藍色框中的區域是一個平面很難被找到和跟蹤。無論向哪個方向移動藍色框,都是一樣的。對於黑色框中的區域,它是一個邊緣。如果沿垂直方向移動,它會改變。但是如果沿水平方向移動就不會改變。而紅色框中的角點,無論你向那個方向移動,得到的結果都不同,這說明它是唯一的。 所以,我們說角點是一個好的圖像特徵,也就回答了前面的問題。

角點是圖像很重要的特徵,對圖像圖形的理解和分析有很重要的作用。角點在三維場景重建運動估計,目標跟蹤、目標識別、圖像配準與匹配等計算機視覺領域起着非常重要的作用。在現實世界中,角點對應於物體的拐角,道路的十字路口、丁字路口等

那我們怎樣找到這些角點呢?接下來我們使用 OpenCV 中的各種算法來查找圖像的特徵,並對它們進行描述。


1.2 總結

  1. 圖像特徵

    圖像特徵要有區分性,容易被比較。一般認爲角點,斑點等是較好的圖像特徵

    特徵檢測:找到圖像中的特徵

    特徵描述:對特徵及其周圍的區域進行描述

2 Harris和Shi-Tomas算法

學習目標

  • 理解Harris和Shi-Tomasi算法的原理
  • 能夠利用Harris和Shi-Tomasi進行角點檢測

2.1 Harris角點檢測

2.1.1 原理

Harris角點檢測的思想是通過圖像的局部的小窗口觀察圖像,角點的特徵是窗口沿任意方向移動都會導致圖像灰度的明顯變化,如下圖所示:

image-20191008144647540

將上述思想轉換爲數學形式,即將局部窗口向各個方向移動(u,v)(u,v)(u,v)並計算所有灰度差異的總和,表達式如下:

$E(u,v)=\sum_{x,y}w(x,y)[I(x+u,y+v)-I(x,y)]^2 $

其中\(I(x,y)\)是局部窗口的圖像灰度,\(I(x+u,y+v)\)是平移後的圖像灰度,\(w(x,y)\)是窗口函數,該可以是矩形窗口,也可以是對每一個像素賦予不同權重的高斯窗口,如下所示:

image-20191008153014984

角點檢測中使\(E(u,v)\)的值最大。利用一階泰勒展開有:

$I(x+u,y+v)=I(x,y)+I_xu+I_yv $

其中\(I_x\)\(I_y\)是沿x和y方向的導數,可用sobel算子計算。

推導如下:

image-20191015180016665

\(M\)矩陣決定了\(E(u,v)\)的取值,下面我們利用\(M\)來求角點,\(M\)\(I_x\)\(I_y\)的二次項函數,可以表示成橢圓的形狀,橢圓的長短半軸由\(M\)的特徵值\(\lambda_1\)\(\lambda_2\)決定,方向由特徵矢量決定,如下圖所示:

image-20191008160908338

橢圓函數特徵值與圖像中的角點、直線(邊緣)和平面之間的關係如下圖所示。

image-20191008161040473

共可分爲三種情況:

  • 圖像中的直線。一個特徵值大,另一個特徵值小,λ1>>λ2或 λ2>>λ1。橢圓函數值在某一方向上大,在其他方向上小。
  • 圖像中的平面。兩個特徵值都小,且近似相等;橢圓函數數值在各個方向上都小。
  • 圖像中的角點。兩個特徵值都大,且近似相等,橢圓函數在所有方向都增大

Harris給出的角點計算方法並不需要計算具體的特徵值,而是計算一個角點響應值RRR來判斷角點。RRR的計算公式爲: \(R =detM-\alpha(traceM)^2\)式中,detM爲矩陣M的行列式;traceM爲矩陣M的跡;α爲常數,取值範圍爲0.04~0.06。事實上,特徵是隱含在detM和traceM中,因爲:

image-20191015181643847

那我們怎麼判斷角點呢?如下圖所示:image-20191008161904372

  • 當R爲大數值的正數時是角點
  • 當R爲大數值的負數時是邊界
  • 當R爲小數是認爲是平坦區域

2.1.2 實現

在OpenCV中實現Hariis檢測使用的API是:

dst=cv.cornerHarris(src, blockSize, ksize, k)

參數:

  • img:數據類型爲 float32 的輸入圖像。
  • blockSize:角點檢測中要考慮的鄰域大小。
  • ksize:sobel求導使用的核大小
  • k :角點檢測方程中的自由參數,取值參數爲 [0.04,0.06].

示例:

import cv2 as cv
import numpy as np 
import matplotlib.pyplot as plt
# 1 讀取圖像,並轉換成灰度圖像
img = cv.imread('./image/chessboard.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 2 角點檢測
# 2.1 輸入圖像必須是 float32
gray = np.float32(gray)

# 2.2 最後一個參數在 0.04 到 0.05 之間
dst = cv.cornerHarris(gray,2,3,0.04)
# 3 設置閾值,將角點繪製出來,閾值根據圖像進行選擇
img[dst>0.001*dst.max()] = [0,0,255]
# 4 圖像顯示
plt.figure(figsize=(10,8),dpi=100)
plt.imshow(img[:,:,::-1]),plt.title('Harris角點檢測')
plt.xticks([]), plt.yticks([])
plt.show()

結果如下:

image-20191008164344988

Harris角點檢測的優缺點:

優點:

  • 旋轉不變性,橢圓轉過一定角度但是其形狀保持不變(特徵值保持不變)
  • 對於圖像灰度的仿射變化具有部分的不變性,由於僅僅使用了圖像的一介導數,對於圖像灰度平移變化不變;對於圖像灰度尺度變化不變

缺點:

  • 對尺度很敏感,不具備幾何尺度不變性。
  • 提取的角點是像素級的

2.2 Shi-Tomasi角點檢測

2.2.1 原理

Shi-Tomasi算法是對Harris角點檢測算法的改進,一般會比Harris算法得到更好的角點。Harris 算法的角點響應函數是將矩陣 M 的行列式值與 M 的跡相減,利用差值判斷是否爲角點。後來Shi 和Tomasi 提出改進的方法是,若矩陣M的兩個特徵值中較小的一個大於閾值,則認爲他是角點,即:

$R= min(\lambda_1,\lambda_2) $

如下圖所示:

image-20191008171309192

從這幅圖中,可以看出來只有當 λ1 和 λ 2 都大於最小值時,才被認爲是角點。

2.2.2 實現

在OpenCV中實現Shi-Tomasi角點檢測使用API:

corners = cv2.goodFeaturesToTrack ( image, maxcorners, qualityLevel, minDistance )

參數:

  • Image: 輸入灰度圖像
  • maxCorners : 獲取角點數的數目。
  • qualityLevel:該參數指出最低可接受的角點質量水平,在0-1之間。
  • minDistance:角點之間最小的歐式距離,避免得到相鄰特徵點。

返回:

  • Corners: 搜索到的角點,在這裏所有低於質量水平的角點被排除掉,然後把合格的角點按質量排序,然後將質量較好的角點附近(小於最小歐式距離)的角點刪掉,最後找到maxCorners個角點返回。

示例:

import numpy as np 
import cv2 as cv
import matplotlib.pyplot as plt
# 1 讀取圖像
img = cv.imread('./image/tv.jpg') 
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
# 2 角點檢測
corners = cv.goodFeaturesToTrack(gray,1000,0.01,10)  
# 3 繪製角點
for i in corners:
    x,y = i.ravel()
    cv.circle(img,(x,y),2,(0,0,255),-1)
# 4 圖像展示
plt.figure(figsize=(10,8),dpi=100)
plt.imshow(img[:,:,::-1]),plt.title('shi-tomasi角點檢測')
plt.xticks([]), plt.yticks([])
plt.show()

結果如下:

image-20191008174257711


2.3 總結

  1. Harris算法

    思想:通過圖像的局部的小窗口觀察圖像,角點的特徵是窗口沿任意方向移動都會導致圖像灰度的明顯變化。

    API: cv.cornerHarris()

  2. Shi-Tomasi算法

    對Harris算法的改進,能夠更好地檢測角點

    API: cv2.goodFeatureToTrack()

3 SIFT/SURF算法

學習目標

  • 理解SIFT/SURF算法的原理,
  • 能夠使用SIFT/SURF進行關鍵點的檢測

3.1 SIFT原理

前面兩節我們介紹了Harris和Shi-Tomasi角點檢測算法,這兩種算法具有旋轉不變性,但不具有尺度不變性,以下圖爲例,在左側小圖中可以檢測到角點,但是圖像被放大後,在使用同樣的窗口,就檢測不到角點了。

image-20191008181535222

所以,下面我們來介紹一種計算機視覺的算法,尺度不變特徵轉換即SIFT (Scale-invariant feature transform)。它用來偵測與描述影像中的局部性特徵,它在空間尺度中尋找極值點,並提取出其位置、尺度、旋轉不變量,此算法由 David Lowe在1999年所發表,2004年完善總結。應用範圍包含物體辨識、機器人地圖感知與導航、影像縫合、3D模型建立、手勢辨識、影像追蹤和動作比對等領域。

SIFT算法的實質是在不同的尺度空間上查找關鍵點(特徵點),並計算出關鍵點的方向。SIFT所查找到的關鍵點是一些十分突出,不會因光照,仿射變換和噪音等因素而變化的點,如角點、邊緣點、暗區的亮點及亮區的暗點等。

3.1.1 基本流程

Lowe將SIFT算法分解爲如下四步

  1. 尺度空間極值檢測:搜索所有尺度上的圖像位置。通過高斯差分函數來識別潛在的對於尺度和旋轉不變的關鍵點。
  2. 關鍵點定位:在每個候選的位置上,通過一個擬合精細的模型來確定位置和尺度。關鍵點的選擇依據於它們的穩定程度。
  3. 關鍵點方向確定:基於圖像局部的梯度方向,分配給每個關鍵點位置一個或多個方向。所有後面的對圖像數據的操作都相對於關鍵點的方向、尺度和位置進行變換,從而保證了對於這些變換的不變性。
  4. 關鍵點描述:在每個關鍵點周圍的鄰域內,在選定的尺度上測量圖像局部的梯度。這些梯度作爲關鍵點的描述符,它允許比較大的局部形狀的變形或光照變化。

我們就沿着Lowe的步驟,對SIFT算法的實現過程進行介紹:

3.1.2 尺度空間極值檢測

在不同的尺度空間是不能使用相同的窗口檢測極值點,對小的關鍵點使用小的窗口,對大的關鍵點使用大的窗口,爲了達到上述目的,我們使用尺度空間濾波器。

高斯核是唯一可以產生多尺度空間的核函數。-《Scale-space theory: A basic tool for analysing structures at different scales》。

一個圖像的尺度空間L(x,y,σ),定義爲原始圖像I(x,y)與一個可變尺度的2維高斯函數G(x,y,σ)卷積運算 ,即:

$ L(x,y,\sigma) = G(x,y,\sigma)* I(x,y)$

其中:

\(G(x,y,\sigma)=\frac{1}{2\pi\sigma^2}e^{-\frac{x^2+y^2}{2\sigma^2}}\)

\(\sigma\)是尺度空間因子,它決定了圖像的模糊的程度。在大尺度下(\(\sigma\)值大)表現的是圖像的概貌信息,在小尺度下(\(σ\)值小)表現的是圖像的細節信息。

在計算高斯函數的離散近似時,在大概3σ距離之外的像素都可以看作不起作用,這些像素的計算也就可以忽略。所以,在實際應用中,只計算(6σ+1)*(6σ+1)的高斯卷積核就可以保證相關像素影響。

下面我們構建圖像的高斯金字塔,它採用高斯函數對圖像進行模糊以及降採樣處理得到的,高斯金字塔構建過程中,首先將圖像擴大一倍,在擴大的圖像的基礎之上構建高斯金字塔,然後對該尺寸下圖像進行高斯模糊,幾幅模糊之後的圖像集合構成了一個Octave,然後對該Octave下選擇一幅圖像進行下采樣,長和寬分別縮短一倍,圖像面積變爲原來四分之一。這幅圖像就是下一個Octave的初始圖像,在初始圖像的基礎上完成屬於這個Octave的高斯模糊處理,以此類推完成整個算法所需要的所有八度構建,這樣這個高斯金字塔就構建出來了,整個流程如下圖所示:

image-20191009110944907

利用LoG(高斯拉普拉斯方法),即圖像的二階導數,可以在不同的尺度下檢測圖像的關鍵點信息,從而確定圖像的特徵點。但LoG的計算量大,效率低。所以我們通過兩個相鄰高斯尺度空間的圖像的相減,得到DoG(高斯差分)來近似LoG。

爲了計算DoG我們構建高斯差分金字塔,該金字塔是在上述的高斯金字塔的基礎上構建而成的,建立過程是:在高斯金字塔中每個Octave中相鄰兩層相減就構成了高斯差分金字塔。如下圖所示:

image-20191009113953721

高斯差分金字塔的第1組第1層是由高斯金字塔的第1組第2層減第1組第1層得到的。以此類推,逐組逐層生成每一個差分圖像,所有差分圖像構成差分金字塔。概括爲DOG金字塔的第o組第l層圖像是有高斯金字塔的第o組第l+1層減第o組第l層得到的。後續Sift特徵點的提取都是在DOG金字塔上進行的

在 DoG 搞定之後,就可以在不同的尺度空間中搜索局部最大值了。對於圖像中的一個像素點而言,它需要與自己周圍的 8 鄰域,以及尺度空間中上下兩層中的相鄰的 18(2x9)個點相比。如果是局部最大值,它就可能是一個關鍵點。基本上來說關鍵點是圖像在相應尺度空間中的最好代表。如下圖所示:

image-20191009115023016

搜索過程從每組的第二層開始,以第二層爲當前層,對第二層的DoG圖像中的每個點取一個3×3的立方體,立方體上下層爲第一層與第三層。這樣,搜索得到的極值點既有位置座標(DoG的圖像座標),又有空間尺度座標(層座標)。當第二層搜索完成後,再以第三層作爲當前層,其過程與第二層的搜索類似。當S=3時,每組裏面要搜索3層,所以在DOG中就有S+2層,在初使構建的金字塔中每組有S+3層。

3.1.3 關鍵點定位

由於DoG對噪聲和邊緣比較敏感,因此在上面高斯差分金字塔中檢測到的局部極值點需經過進一步的檢驗才能精確定位爲特徵點。

使用尺度空間的泰勒級數展開來獲得極值的準確位置, 如果極值點的 灰度值小於閾值(一般爲0.03或0.04)就會被忽略掉。 在 OpenCV 中這種閾值被稱爲 contrastThreshold。

DoG 算法對邊界非常敏感, 所以我們必須要把邊界去除。 Harris 算法除了可以用於角點檢測之外還可以用於檢測邊界。從 Harris 角點檢測的算法中,當一個特徵值遠遠大於另外一個特徵值時檢測到的是邊界。那在DoG算法中欠佳的關鍵點在平行邊緣的方向有較大的主曲率,而在垂直於邊緣的方向有較小的曲率,兩者的比值如果高於某個閾值(在OpenCV中叫做邊界閾值),就認爲該關鍵點爲邊界,將被忽略,一般將該閾值設置爲10。

將低對比度和邊界的關鍵點去除,得到的就是我們感興趣的關鍵點。

3.1.4 關鍵點方向確定

經過上述兩個步驟,圖像的關鍵點就完全找到了,這些關鍵點具有尺度不變性。爲了實現旋轉不變性,還需要爲每個關鍵點分配一個方向角度,也就是根據檢測到的關鍵點所在高斯尺度圖像的鄰域結構中求得一個方向基準。

對於任一關鍵點,我們採集其所在高斯金字塔圖像以r爲半徑的區域內所有像素的梯度特徵(幅值和幅角),半徑r爲: \(r = 3\times1.5\sigma\) 其中σ是關鍵點所在octave的圖像的尺度,可以得到對應的尺度圖像。

梯度的幅值和方向的計算公式爲:

\(m(x,y)=\sqrt{(L(x+1,y)-L(x-1,y)^2 + (L(x,y+1)-L(x,y-1))^2}\)

$ \theta(x,y) = arctan(\frac{L(x,y+1)-L(x,y-1)}{L(x+1,y)-L(x-1),y}) $

鄰域像素梯度的計算結果如下圖所示:

image-20191009143818527

完成關鍵點梯度計算後,使用直方圖統計關鍵點鄰域內像素的梯度幅值和方向。具體做法是,將360°分爲36柱,每10°爲一柱,然後在以r爲半徑的區域內,將梯度方向在某一個柱內的像素找出來,然後將他們的幅值相加在一起作爲柱的高度。因爲在r爲半徑的區域內像素的梯度幅值對中心像素的貢獻是不同的,因此還需要對幅值進行加權處理,採用高斯加權,方差爲1.5σ。如下圖所示,爲簡化圖中只畫了8個方向的直方圖。

image-20191009144726492

每個特徵點必須分配一個主方向,還需要一個或多個輔方向,增加輔方向的目的是爲了增強圖像匹配的魯棒性。輔方向的定義是,當一個柱體的高度大於主方向柱體高度的80%時,則該柱體所代表的的方向就是給特徵點的輔方向。

直方圖的峯值,即最高的柱代表的方向是特徵點鄰域範圍內圖像梯度的主方向,但該柱體代表的角度是一個範圍,所以我們還要對離散的直方圖進行插值擬合,以得到更精確的方向角度值。利用拋物線對離散的直方圖進行擬合,如下圖所示:

image-20191009150008701

獲得圖像關鍵點主方向後,每個關鍵點有三個信息(x,y,σ,θ):位置、尺度、方向。由此我們可以確定一個SIFT特徵區域。通常使用一個帶箭頭的圓或直接使用箭頭表示SIFT區域的三個值:中心表示特徵點位置,半徑表示關鍵點尺度,箭頭表示方向。如下圖所示:

image-20191025112522974

3.1.5 關鍵點描述

通過以上步驟,每個關鍵點就被分配了位置,尺度和方向信息。接下來我們爲每個關鍵點建立一個描述符,該描述符既具有可區分性,又具有對某些變量的不變性,如光照,視角等。而且描述符不僅僅包含關鍵點,也包括關鍵點周圍對其有貢獻的的像素點。主要思路就是通過將關鍵點周圍圖像區域分塊,計算塊內的梯度直方圖,生成具有特徵向量,對圖像信息進行抽象。

描述符與特徵點所在的尺度有關,所以我們在關鍵點所在的高斯尺度圖像上生成對應的描述符。以特徵點爲中心,將其附近鄰域劃分爲\(d*d\)個子區域(一般取d=4),每個子區域都是一個正方形,邊長爲3σ,考慮到實際計算時,需進行三次線性插值,所以特徵點鄰域的爲\(3\sigma(d+1)*3\sigma(d+1)\)的範圍,如下圖所示:

image-20191009161647267

爲了保證特徵點的旋轉不變性,以特徵點爲中心,將座標軸旋轉爲關鍵點的主方向,如下圖所示:

image-20191009161756423

計算子區域內的像素的梯度,並按照σ=0.5d進行高斯加權,然後插值計算得到每個種子點的八個方向的梯度,插值方法如下圖所示:

image-20191009162914982

每個種子點的梯度都是由覆蓋其的4個子區域插值而得的。如圖中的紅色點,落在第0行和第1行之間,對這兩行都有貢獻。對第0行第3列種子點的貢獻因子爲dr,對第1行第3列的貢獻因子爲1-dr,同理,對鄰近兩列的貢獻因子爲dc和1-dc,對鄰近兩個方向的貢獻因子爲do和1-do。則最終累加在每個方向上的梯度大小爲:

$weight = w*drk(1-dr){(1-k)}dcm(1-dc){1-m}don(1-do){1-n} $

其中k,m,n爲0或爲1。 如上統計\(4*4*8=128\)個梯度信息即爲該關鍵點的特徵向量,按照特徵點的對每個關鍵點的特徵向量進行排序,就得到了SIFT特徵描述向量。

3.1.6 總結

SIFT在圖像的不變特徵提取方面擁有無與倫比的優勢,但並不完美,仍然存在實時性不高,有時特徵點較少,對邊緣光滑的目標無法準確提取特徵點等缺陷,自SIFT算法問世以來,人們就一直對其進行優化和改進,其中最著名的就是SURF算法。

3.2 SURF原理

使用 SIFT 算法進行關鍵點檢測和描述的執行速度比較慢, 需要速度更快的算法。 2006 年 Bay提出了 SURF 算法,是SIFT算法的增強版,它的計算量小,運算速度快,提取的特徵與SIFT幾乎相同,將其與SIFT算法對比如下:

image-20191016163330835

3.3 實現

在OpenCV中利用SIFT檢測關鍵點的流程如下所示:

3.3.1實例化sift

sift = cv.xfeatures2d.SIFT_create()

3.3.2 利用sift.detectAndCompute()檢測關鍵點並計算

kp,des = sift.detectAndCompute(gray,None)

參數:

  • gray: 進行關鍵點檢測的圖像,注意是灰度圖像

返回:

  • kp: 關鍵點信息,包括位置,尺度,方向信息
  • des: 關鍵點描述符,每個關鍵點對應128個梯度信息的特徵向量

3.3.3 將關鍵點檢測結果繪製在圖像上

cv.drawKeypoints(image, keypoints, outputimage, color, flags)

參數:

  • image: 原始圖像
  • keypoints:關鍵點信息,將其繪製在圖像上
  • outputimage:輸出圖片,可以是原始圖像
  • color:顏色設置,通過修改(b,g,r)的值,更改畫筆的顏色,b=藍色,g=綠色,r=紅色。
  • flags:繪圖功能的標識設置
    1. cv2.DRAW_MATCHES_FLAGS_DEFAULT:創建輸出圖像矩陣,使用現存的輸出圖像繪製匹配對和特徵點,對每一個關鍵點只繪製中間點
    2. cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG:不創建輸出圖像矩陣,而是在輸出圖像上繪製匹配對
    3. cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS:對每一個特徵點繪製帶大小和方向的關鍵點圖形
    4. cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS:單點的特徵點不被繪製

SURF算法的應用與上述流程是一致,這裏就不在贅述。

示例:

利用SIFT算法在中央電視臺的圖片上檢測關鍵點,並將其繪製出來:

import cv2 as cv 
import numpy as np
import matplotlib.pyplot as plt
# 1 讀取圖像
img = cv.imread('./image/tv.jpg')
gray= cv.cvtColor(img,cv.COLOR_BGR2GRAY)
# 2 sift關鍵點檢測
# 2.1 實例化sift對象
sift = cv.xfeatures2d.SIFT_create()

# 2.2 關鍵點檢測:kp關鍵點信息包括方向,尺度,位置信息,des是關鍵點的描述符
kp,des=sift.detectAndCompute(gray,None)
# 2.3 在圖像上繪製關鍵點的檢測結果
cv.drawKeypoints(img,kp,img,flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
# 3 圖像顯示
plt.figure(figsize=(8,6),dpi=100)
plt.imshow(img[:,:,::-1]),plt.title('sift檢測')
plt.xticks([]), plt.yticks([])
plt.show()

結果:

image-20191009181525538


3.4 總結

SIFT原理:

  • 尺度空間極值檢測:構建高斯金字塔,高斯差分金字塔,檢測極值點。
  • 關鍵點定位:去除對比度較小和邊緣對極值點的影響。
  • 關鍵點方向確定:利用梯度直方圖確定關鍵點的方向。
  • 關鍵點描述:對關鍵點周圍圖像區域分塊,計算塊內的梯度直方圖,生成具有特徵向量,對關鍵點信息進行描述。

API:cv.xfeatures2d.SIFT_create()

SURF算法:對SIFT算法的改進,在尺度空間極值檢測,關鍵點方向確定,關鍵點描述方面都有改進,提高效率

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章