角点检测——发现图像的特征
文章目錄
- 寫在最前
- 角點檢測是什么?有什么用?
- OpenCV中的角點檢測
- Harris角點檢測
- Shi-Tomasi 角點檢測
- 特征檢測,從ORB說起
- 寫在最后
- 往期文章
- 下載
寫在最前
不知不覺,漫談計算機視覺也寫了四篇了,我們從最基本的除噪引出計算機圖形學的各種技術,然后又學會了發(fā)現(xiàn)圖像的輪廓,發(fā)現(xiàn)圖像的邊緣,等等,但是始終沒有接觸一個核心的問題——特征。我們肯定經常在數據科學或者人工智能領域不斷的聽到這個詞匯,我們之前做的內容比如輪廓發(fā)現(xiàn),計算輪廓面積周長,發(fā)現(xiàn)圖像邊緣等等其實也都或多或少能夠在很多牽扯到圖像的領域中用來發(fā)現(xiàn)或者創(chuàng)造特征,但是卻始終沒有直接接觸計算機視覺中的特征這一概念。而角點檢測算得上是第一次真正的接觸。
角點檢測是什么?有什么用?
角點檢測,一如其名,就是檢測圖像中的角點的。本質上角點是一種很容易在圖像中定位的局部特征,并且廣泛存在于人造物體中,如桌子椅子車子房子等等(自然界中多曲線,這個你可以在散步的時候觀察一下)。另外角點可以被精確地檢測(即使是亞像素級精度)這點對于實用也非常有價值。
至于角點的用處,本質上來說,角點是作為圖像的一種特征來使用的。我們可以想象一下拼圖,很明顯角點信息對于圖像的拼接,對齊都有極大的價值,而圖像或者圖像中的物體發(fā)生變化時,如圖像檢測,運動追蹤等也同樣具有不小的價值。
OpenCV中的角點檢測
我們的主要工具還是OpenCV,所以還是要主講OpenCV中的角點檢測。比較簡單的角點檢測,OpenCV中的角點檢測主要有Harris角點檢測,Shi-Tomasi角點檢測。除了一般性的角點檢測外,OpenCV中還有一些更正式的基于角點檢測的特征點檢測算法,如ORB,ASIFT等等。這些正式的特征點檢測器更適合我們直接使用。不過由淺入深,我們還是需要從最基本的角點檢測器講起。
Harris角點檢測
Harris角點檢測的基本假設來自于人眼對角點的識別,對于整個圖像我們選擇一個小窗作為我們實際觀察的部分,如果一個點上下左右移動后他周圍的灰度變化比較大,那么他應該就是一個角點,如果延一個方向變化大一個方向變化小,那么他就很可能是一條線。這樣我們通過設定一個固定窗口,對比其左右變化就可以得到區(qū)域中的角點了。
同樣也因此,我們需要設定三個參數,觀察窗口的大小,需要考慮領域(也就是角點范圍,或者說這個角點可能有多大)的大小,以及閾值。對于Harris算法,我們可以直接調用OpenCV中的cornerHarris算法,而這三個關鍵參數,則是
-
blockSize —— 角點檢測中要考慮的領域大小。
-
ksize —— Sobel 求導中使用的窗口大小
-
k ——Harris 角點檢測方程中的自由參數,取值參數為 [0.04,0.06].
下面是有關代碼,這里我們使用了opencv的github項目中的一張圖片,你可以到opencv的github下載原圖片或者fongtian的github項目–漫談計算機視覺下載所有代碼和圖片:
img = cv2.imread('/home/fonttian/Data/image/OpenCV/blox.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # cornerHarris函數圖像格式為 float32 ,因此需要將圖像轉換 float32 類型 gray = np.float32(gray)blockSize = 2 # 領域尺寸 ksize = 3 # 口徑尺寸 k = 0.04 # Harris dst = cv2.cornerHarris(src=gray, blockSize=blockSize, ksize=ksize, k=k) # 變量a的閾值為0.01 * dst.max(),如果dst的圖像值大于閾值,那么該圖像的像素點設為True,否則為False # 將圖片每個像素點根據變量a的True和False進行賦值處理,賦值處理是將圖像角點勾畫出來 a = dst > 0.01 * dst.max() img[a] = [0, 0, 255] # 顯示圖像 cv2.imshow('corners', img)上面的代碼中我們并沒有直接使用獲取的焦點數據,而是對數據進行了過濾,然后再繪制角點,這樣避免了角點過多的問題,除此之外,我們也可以使用一個更合適的角點檢測器來簡化我們的代碼,那就是——goodFeaturesToTrack函數,具體使用請看接下來的代碼。
Shi-Tomasi 角點檢測
Shi-Tomasi 角點檢測是對Harris角點檢測的改進。由于 Harris 角點檢測算法的穩(wěn)定性和與k 值這個經驗數值有關,因此并不能太好的直接獲得最佳數值。但是Shi-Tomasi 發(fā)現(xiàn),角點的穩(wěn)定性其實和矩陣 M 的較小特征值有關,于是直接用較小的那個特征值作為分數,于是便有了不需要調整k值的新算法。
下面的第一個公式是Harris的原始分數公式,第二個是《Good_Features_to_Track》論文中改進后的分數公式
R=λ1λ2?k(λ1+λ2)2R=\lambda_1\lambda_2-k(\lambda_1+\lambda_2)^2 R=λ1?λ2??k(λ1?+λ2?)2
R=min(λ1?λ2)R=min(\lambda_1-\lambda_2) R=min(λ1??λ2?)
至于Shi-Tomasi 角點檢測的使用,我們可以直接在OpenCV中使用goodFeaturesToTrack函數獲取最好的幾個點,并選定角點檢測方法為Shi-Tomasi算法,該函數具體參數如下:
- maxCorners:返回角點的最大數目,值為0表表示沒有設置最大值限制,返回所有檢測到的角點。
- qualityLevel:質量系數(小于1.0的正數,一般在0.01-0.1之間),表示可接受角點的最低質量水平。該系數乘以最好的角點分數(也就是上面較小的那個特征值),作為可接受的最小分數;例如,如果最好的角點分數值為1500且質量系數為0.01,那么所有質量分數小于15的角都將被忽略。
- minDistance:角之間最小歐式距離,忽略小于此距離的點。
- mask:可選的感興趣區(qū)域,指定想要檢測角點的區(qū)域。
- blockSize:默認為3,角點檢測的鄰域大小(窗口尺寸)
- useHarrisDetector:用于指定角點檢測的方法,如果是true則使用Harris角點檢測,false則使用Shi-Tomasi算法。默認為False。
- k:默認為0.04,Harris角點檢測時使用,Shi-Tomasi不需要。
這個函數的特殊之處就在于,他幫助我們完成了點的篩選,之前我們通過自己設定的dst > 0.01 * dst.max()進行參數篩選。而該函數首先獲取所有右焦點,然后忽略低于質量系數的角點并排序。之后保留質量最高的一個焦點,然后刪除最小距離內的角點,并依次進行該步驟并獲得最終的N個最佳角點。代碼和效果如下:
img = cv2.imread('/home/fonttian/Data/image/OpenCV/blox.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) corners = cv2.goodFeaturesToTrack(gray, maxCorners, qualityLevel, minDistance)# print(len(corners)) # print(corners) for i in corners:x, y = i.ravel()cv2.circle(img, (x, y), 2, (0, 0, 255), -1)cv2.imshow('Shi-Tomasi', img)特征檢測,從ORB說起
我們之前所說的都是直接的角點檢測,而角點本質是一種圖像的特征點,而除了這些直接獲取角點的算法外,我們還有需要很多其他的特征點檢測算法可以直接使用,而這些特征點檢測算法同樣都離不開各種基礎算子。比如ORB算法。
RB特征是將FAST特征點的檢測方法與BRIEF特征描述子結合起來,并在它們原來的基礎上做了改進與優(yōu)化。
首先,它利用FAST特征點檢測的方法來檢測特征點,然后利用Harris角點的度量方法,從FAST特征點從挑選出Harris角點響應值最大的N個特征點。
除了上述的描述外,ORB算法本身還牽扯到很多內容,比如旋轉不變性(FAST特征本身沒有),多尺度不變性,非極大值抑制等等,需要想要詳細的了解類似ORB算法的特征提取算法,是需要大量筆墨的所以我們放在下一章節(jié)再來講。不過在OpenCV中使用起來卻十分簡單:
img = cv2.imread('/home/fonttian/Data/image/OpenCV/blox.jpg')orb = cv2.ORB_create()kp = orb.detect(img, None)kp, des = orb.compute(img, kp)img = cv2.drawKeypoints(img, kp, img, color=(0, 255, 0), flags=0)cv2.imshow('p', img)上面的第一行代碼是讀取圖片,第二行代碼就是ORB的創(chuàng)建,之后使用detect進行特征檢測,并使用compute進行特征的計算,最終繪制。這里des實際上并沒有用到,之后我們再講解具體怎么使用。但是僅從代碼分析,我們可以很清楚的看到創(chuàng)建,檢測,繪制各只需要一行代碼,而繪制這一步,我們甚至只需要調用OpenCV中封裝好的類即可,可以說非常簡單了。效果則如下所示,具體繪制效果我們也可以通過參數修改:
與orb類似的事,opecv中還有很多其他的有用的特征檢測器,使用起來同樣十分方便。我們將會在下一篇文章中講解。
寫在最后
往期文章
- 從去除噪點的說起,有OpenCV要什么PS?
- 計算機視覺的基石-濾波
- 發(fā)現(xiàn)你的身形——OpenCV圖像輪廓
- 圖像邊緣檢測,檢測亦或簡化
下載
fongtian的github項目–漫談計算機視覺
總結
以上是生活随笔為你收集整理的角点检测——发现图像的特征的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图像边缘检测,检测亦或简化
- 下一篇: Applications模块解析(一)