OpenCV-图像特征harris角点检测/SIFT函数/特征匹配-05
圖像特征-harris角點檢測
基本原理
R>0 角點
R≈0 平坦區域
R<0 邊界
總結一下Harris算法流程
獲取點數據后,計算Ix 和 Iy
整合矩陣,求特征值
比較特征值大小
非極大值抑制NMS,過濾掉不是那么角的
OpenCV中怎么檢測Harris
cv2.cornerHarris()
img: 數據類型為 ?oat32 的入圖像
blockSize: 角點檢測中指定區域的大小,前面提到的w(u,v),可能是個高斯函數
ksize: 就像Sobel求導中使用的窗口大小
k: 取值參數為 [0,04,0.06]. 默認0.04
返回dst:輸出圖像
Scale Invariant Feature Transform(SIFT)
圖像尺度空間
在一定的范圍內,無論物體是大還是小,人眼都可以分辨出來,然而計算機要有相同的能力卻很難,所以要讓機器能夠對物體在不同尺度下有一個統一的認知,就需要考慮圖像在不同的尺度下都存在的特點。
尺度空間的獲取通常使用高斯模糊來實現
不同σ的高斯函數決定了對圖像的平滑程度,越大的σ值對應的圖像越模糊。
高斯差分金字塔(DOG)
DoG空間極值檢測
為了尋找尺度空間的極值點,每個像素點要和其圖像域(同一尺度空間)和尺度域(相鄰的尺度空間)的所有相鄰點進行比較,當其大于(或者小于)所有相鄰點時,該點就是極值點。如下圖所示,中間的檢測點要和其所在圖像的3×3鄰域8個像素點,以及其相鄰的上下兩層的3×3領域18個像素點,共26個像素點進行比較。
關鍵點的精確定位
這些候選關鍵點是DOG空間的局部極值點,而且這些極值點均為離散的點,精確定位極值點的一種方法是,對尺度空間DoG函數進行曲線擬合,計算其極值點,從而實現關鍵點的精確定位。
消除邊界響應
特征點的主方向
每個特征點可以得到三個信息(x,y,σ,θ),即位置、尺度和方向。具有多個方向的關鍵點可以被復制成多份,然后將方向值分別賦給復制后的特征點,一個特征點就產生了多個坐標、尺度相等,但是方向不同的特征點。
生成特征描述
在完成關鍵點的梯度計算后,使用直方圖統計鄰域內像素的梯度和方向。
為了保證特征矢量的旋轉不變性,要以特征點為中心,在附近鄰域內將坐標軸旋轉θ角度,即將坐標軸旋轉為特征點的主方向。
旋轉之后的主方向為中心取8x8的窗口,求每個像素的梯度幅值和方向,箭頭方向代表梯度方向,長度代表梯度幅值,然后利用高斯窗口對其進行加權運算,最后在每個4x4的小塊上繪制8個方向的梯度直方圖,計算每個梯度方向的累加值,即可形成一個種子點,即每個特征的由4個種子點組成,每個種子點有8個方向的向量信息。
論文中建議對每個關鍵點使用4x4共16個種子點來描述,這樣一個關鍵點就會產生128維的SIFT特征向量。
opencv SIFT函數
import cv2 import numpy as npimg = cv2.imread('test_1.jpg')# 讀取圖像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 灰度圖 sift = cv2.xfeatures2d.SIFT_create() # 實例化一個sift kp = sift.detect(gray, None) # 傳進去一個圖像 img = cv2.drawKeypoints(gray, kp, img) # 繪制關鍵點cv2.imshow('drawKeypoints', img) cv2.waitKey(0) cv2.destroyAllWindows()
計算特征
特征匹配
### Brute-Force蠻力匹配
import cv2 import numpy as np import matplotlib.pyplot as plt %matplotlib inline img1 = cv2.imread('box.png', 0) img2 = cv2.imread('box_in_scene.png', 0) def cv_show(name,img):cv2.imshow(name, img)cv2.waitKey(0)cv2.destroyAllWindows() cv_show('img1',img1) cv_show('img2',img2) sift = cv2.xfeatures2d.SIFT_create() kp1, des1 = sift.detectAndCompute(img1, None) kp2, des2 = sift.detectAndCompute(img2, None) # crossCheck表示兩個特征點要互相匹,例如A中的第i個特征點與B中的第j個特征點最近的,并且B中的第j個特征點到A中的第i個特征點也是 #NORM_L2: 歸一化數組的(歐幾里德距離),如果其他特征計算方法需要考慮不同的匹配計算方式 bf = cv2.BFMatcher(crossCheck=True)1對1的匹配
matches = bf.match(des1, des2) matches = sorted(matches, key=lambda x: x.distance) img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], None,flags=2) cv_show('img3',img3)k對最佳匹配
bf = cv2.BFMatcher() matches = bf.knnMatch(des1, des2, k=2) good = [] for m, n in matches:if m.distance < 0.75 * n.distance:good.append([m]) img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2) cv_show('img3',img3)如果需要更快速完成操作,可以嘗試使用cv2.FlannBasedMatcher
隨機抽樣一致算法(Random sample consensus,RANSAC)
選擇初始樣本點進行擬合,給定一個容忍范圍,不斷進行迭代
每一次擬合后,容差范圍內都有對應的數據點數,找出數據點個數最多的情況,就是最終的擬合結果
單應性矩陣
總結
以上是生活随笔為你收集整理的OpenCV-图像特征harris角点检测/SIFT函数/特征匹配-05的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV-文档扫描OCR识别-04
- 下一篇: PyTorch基础-Tensor的属性,