机器视觉-特征点检测:【2】Harrs角点检测原理
一、基本原理
? ? ? ? 關于角點特征檢測,Chris Harris 和 Mike Stephens 在 1988 年的論文 A Combined Corner and Edge Detector 中進行了一次早期的嘗試,所以現在它被稱為 Harris Corner Detector。他把這個簡單的想法轉化為數學形式。它基本上找到了(a,b)在所有方向上的位移的強度差異。這表示如下:
窗口函數是矩形窗口或高斯窗口,它為下面的像素賦予權重。
我們必須最大化這個函數 E(u,v) 來進行角點檢測。這意味著我們必須最大化第二項。將泰勒展開式應用于上述方程并使用一些數學步驟(請參閱您喜歡的任何標準教科書以獲得完整推導),
我們這里只取一階導數泰勒函數:
所以,我們得到最終方程::
?
上式中,令:
故而:
這里,a,b是給定的偏移,w是給定窗口,唯有M矩陣需要具體計算,這里,Ix和Iy分別是x和y方向的導數。(可以很容易的通過cv2.Sobel()得到)。
如下圖,角點檢測首先是在一個小區域進行。
在上圖中,檢測到的三個區域:
- 1)flate平坦區域
- 2)edge邊緣區域
- 3)coner角度區域
能夠分別得到窗口下的E(a,b)值。按道理:根據E(a,b)能夠判別角點也是可以的。然而,用譜分解的原理是更加干凈的判別方法。
對矩陣求特征值,得到,通過比較?的關系,可以得到角點的判斷。如下圖所示:
接下來就是重點部分。上述操作結束后,會得到一個分數,基于一個用來決定窗口內是否包含角點的等式。
在以上公式中:
- 是M的特征值。
?所以這些特征值決定了這個區域是角點,還是邊緣,還是flat。
- 當|R|比較小時,也就是lambda 1和lambda 2比較小,區域是flat
- 當R<0時, 也就是lambda 1遠大于lambda 2或反之亦然,區域是邊緣
- 當R比較大時,也就是lambda 1和lambda2都大且相似,區域是角點
可以用下面的圖來表示
?
所以Harris角點檢測的結果是一個帶著這些分數的灰度圖。圖像角點檢測需要一個合適的閾值。我們將用一個簡單的圖來實現。
二 參考代碼
import cv2 import numpy as npfilename = 'chessboard.jpg' img = cv2.imread(filename) gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)gray = np.float32(gray) dst = cv2.cornerHarris(gray,2,3,0.04)#result is dilated for marking the corners, not important dst = cv2.dilate(dst,None)# Threshold for an optimal value, it may vary depending on the image. img[dst>0.01*dst.max()]=[0,0,255]cv2.imshow('dst',img) if cv2.waitKey(0) & 0xff == 27:cv2.destroyAllWindows()總結
以上是生活随笔為你收集整理的机器视觉-特征点检测:【2】Harrs角点检测原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python知识:string.form
- 下一篇: halcon知识:【1】二维码原理