图像特征提取与描述_角点特征01:Harris算法+Shi-Tomas算法
1 Harris角點檢測
1.1 原理
Harris角點檢測的思想是通過圖像的局部的小窗口觀察圖像,角點的特征是窗口沿任意方向移動都會導致圖像灰度的明顯變化,如下圖所示:
?將上述思想轉換為數學形式,即將局部窗口向各個方向移動(u,v)并計算所有灰度差異的總和,表達式如下:
??其中I(x,y)是局部窗口的圖像灰度,I(x+u,y+v)是平移后的圖像灰度,w(x,y)是窗口函數,該可以是矩形窗口,也可以是對每一個像素賦予不同權重的高斯窗口,如下所示:
角點檢測中使E(u,v)的值最大。利用一階泰勒展開有:
其中I_xI?x??和?I_yI?y???是沿x和y方向的導數,可用sobel算子計算。
推導如下:
?M矩陣決定了E(u,v)的取值,下面我們利用M來求角點,M是I?x??和I?y??的二次項函數,可以表示成橢圓的形狀,橢圓的長短半軸由M的特征值λ?1??和λ?2??決定,方向由特征矢量決定,如下圖所示:
?橢圓函數特征值與圖像中的角點、直線(邊緣)和平面之間的關系如下圖所示。
?共可分為三種情況:
- 圖像中的直線。一個特征值大,另一個特征值小,λ1>>λ2或 λ2>>λ1。橢圓函數值在某一方向上大,在其他方向上小。
- 圖像中的平面。兩個特征值都小,且近似相等;橢圓函數數值在各個方向上都小。
- 圖像中的角點。兩個特征值都大,且近似相等,橢圓函數在所有方向都增大
Harris給出的角點計算方法并不需要計算具體的特征值,而是計算一個角點響應值RR來判斷角點。RR的計算公式為:
式中,detM為矩陣M的行列式;traceM為矩陣M的跡;α為常數,取值范圍為0.04~0.06。事實上,特征是隱含在detM和traceM中,因為:
?那我們怎么判斷角點呢?如下圖所示:
- 當R為大數值的正數時是角點
- 當R為大數值的負數時是邊界
- 當R為小數是認為是平坦區域
1.2 實現
在OpenCV中實現Hariis檢測使用的API是:
dst=cv.cornerHarris(src, blockSize, ksize, k)參數:
-
img:數據類型為 ?oat32 的輸入圖像。
-
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('img/qipan.png') 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 設置閾值,將角點繪制出來,閾值根據圖像進行選擇 # dst > 0.001 * dst.max() 返回一個img大小的Flase和True矩陣 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()結果如下:
?Harris角點檢測的優缺點:
優點:
- 旋轉不變性,橢圓轉過一定角度但是其形狀保持不變(特征值保持不變)
- 對于圖像灰度的仿射變化具有部分的不變性,由于僅僅使用了圖像的一介導數,對于圖像灰度平移變化不變;對于圖像灰度尺度變化不變
缺點:
- 對尺度很敏感,不具備幾何尺度不變性。
- 提取的角點是像素級的
2 Shi-Tomasi角點檢測
2.1 原理
Shi-Tomasi算法是對Harris角點檢測算法的改進,一般會比Harris算法得到更好的角點。Harris 算法的角點響應函數是將矩陣 M 的行列式值與 M 的跡相減,利用差值判斷是否為角點。后來Shi 和Tomasi 提出改進的方法是,若矩陣M的兩個特征值中較小的一個大于閾值,則認為他是角點,即:
如下圖所示:
?從這幅圖中,可以看出來只有當 λ1 和 λ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()結果如下:
總結
Harris算法
思想:通過圖像的局部的小窗口觀察圖像,角點的特征是窗口沿任意方向移動都會導致圖像灰度的明顯變化。
API: cv.cornerHarris()
Shi-Tomasi算法
對Harris算法的改進,能夠更好地檢測角點
API: cv2.goodFeatureToTrack()
總結
以上是生活随笔為你收集整理的图像特征提取与描述_角点特征01:Harris算法+Shi-Tomas算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Pytorch神经网络实战案例】25
- 下一篇: ImageNet Classificat