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