角點檢測
角點的定義:
從直觀上理解,角點是圖像中兩條或多條邊緣的交點,在圖像中表現為局部區域內的灰度變化較為劇烈的點。在數學和計算機視覺中,角點可以被定義為在兩個或多個方向上具有顯著變化的點。比如在一幅建筑物的圖像中,建筑物的頂點就是典型的角點;在一張棋盤格的圖像中,棋盤格的交點也屬于角點。
角點檢測的作用
- 特征提取:角點是圖像的重要特征之一,由于其具有獨特的位置和局部特征,可用于圖像的特征描述,便于后續的圖像匹配、目標識別等操作。例如,在物體識別中,通過檢測物體圖像中的角點并與數據庫中物體的角點特征進行匹配,從而識別出物體。
- 圖像配準:在將不同時間、不同視角或不同傳感器獲取的圖像進行融合時,角點可以作為圖像之間的對應點,幫助實現圖像的精確配準。例如,在衛星圖像拼接中,通過檢測不同衛星圖像中的角點并進行匹配,可以將多幅圖像拼接成一幅完整的圖像。
- 運動跟蹤:在視頻序列中,通過跟蹤角點的運動軌跡,可以分析物體的運動狀態。比如在運動分析中,跟蹤運動員身體上的角點,可以得到運動員的動作軌跡和運動參數。
常見的角點檢測算法
- Harris 角點檢測算法:由 Chris Harris 和 Mike Stephens 在 1988 年提出。該算法基于圖像局部的自相關函數,通過計算圖像在各個方向上的灰度變化,得到一個角點響應函數 R。如果 R 的值超過一定的閾值,則認為該點是角點。Harris 角點檢測算法具有旋轉不變性,但對尺度變化比較敏感。
Shi-Tomasi 角點檢測算法:是對 Harris 角點檢測算法的改進。該算法通過計算圖像塊的最小特征值來判斷角點,相比于 Harris 算法,Shi-Tomasi 算法在角點檢測的準確性上有了一定的提高,并且在目標跟蹤等應用中表現更優。 - SIFT(尺度不變特征變換)算法:不僅可以檢測角點,還具有尺度不變性、旋轉不變性和光照不變性等優點。SIFT 算法通過在不同尺度空間上檢測極值點,并對這些極值點進行精確定位和描述,生成 128 維的特征向量,用于后續的特征匹配等操作。不過,SIFT 算法計算復雜度較高,運行速度較慢。
- SURF(加速穩健特征)算法:是 SIFT 算法的加速版本,采用了積分圖像和 Haar 小波特征,大大提高了算法的運行速度,同時也具有較好的尺度不變性和旋轉不變性。在實際應用中,SURF 算法在處理速度和特征描述能力上取得了較好的平衡。
- ORB(Oriented FAST and Rotated BRIEF)算法:結合了 FAST(Features from Accelerated Segment Test)角點檢測算法和 BRIEF(Binary Robust Independent Elementary Features)特征描述子。FAST 算法用于快速檢測角點,BRIEF 算法用于生成二進制特征描述子。ORB 算法具有計算速度快、內存占用小等優點,在實時性要求較高的應用中得到了廣泛應用。
角點檢測實例
對黃鶴樓的圖片進行角點檢測:
'''角點檢測'''
import cv2
import numpy as np#角點指圖像中局部區域與周圍區域有較大灰度變化的點或像素。
# cornerHarris(img,blockSize,ksize,k[,dst[,borderType]])-> dst
# img:輸入圖像。
#blockSize:角點檢測中要考慮的領域大小。
# ksize:Sobel求導中使用的日大小。
# k: Harris角點檢測方程中的自由參數,取值參數為[0.04,0.06]。
# dst:返回numpy.ndarray對象,大小和src相同,值越大,對應像素點是角的概率越高img = cv2.imread('huanghelou.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
dst = cv2.cornerHarris(gray,4,3,0.04)
# 標記檢測到的角點
img[dst>0.01*dst.max()]=[0,0,255]
# 這里通過對角點響應進行閩值處理,標記出檢測到的角點。
# 0.05 * dst.max()是一個值,大于這個值的像素點會被標記為紅色。
cv2.imshow('img',img)
cv2.waitKey(0)
結果:
可以看出圖片中部分角點已經被標記出來,可用通過更改閾值大小進行角點標記的范圍更改。
特征提取sift
SIFT(Scale-Invariant Feature Transform,尺度不變特征變換)是一種非常經典且強大的計算機視覺算法,用于圖像的特征提取和描述,以下是對它的詳細介紹:
SIFT 算法的特點
- 尺度不變性:能夠在不同尺度下檢測到相同的特征點,無論物體在圖像中是大是小,SIFT 算法都能準確地找到對應的特征。
- 旋轉不變性:通過計算特征點的主方向,使描述子具有旋轉不變性,即使物體在圖像中發生了旋轉,也能正確匹配特征。
- 光照不變性:SIFT 特征對光照變化具有一定的魯棒性,在不同的光照條件下,仍然可以提取到穩定的特征。
- 獨特性:SIFT 特征描述子具有較高的獨特性,能夠很好地區分不同的物體和場景,降低誤匹配的概率。
SIFT 算法的主要步驟
- 尺度空間極值檢測:使用不同尺度的高斯濾波器對圖像進行卷積,生成高斯金字塔。然后通過相鄰尺度間的差分(DoG,Difference of Gaussians)運算,得到 DoG 金字塔。在 DoG 金字塔中,檢測每個點在其鄰域內(包括同層和上下層)的極值點,這些極值點就是可能的特征點。
- 關鍵點定位:對檢測到的極值點進行精確定位,通過擬合三維二次函數來確定關鍵點的精確位置和尺度。同時,去除低對比度的關鍵點和位于邊緣上的關鍵點,以提高特征點的穩定性和可靠性。
- 方向分配:計算每個關鍵點鄰域內的梯度方向直方圖,根據直方圖的峰值確定關鍵點的主方向。為每個關鍵點分配一個或多個方向,使特征描述子具有旋轉不變性。
- 關鍵點描述:以關鍵點為中心,取一個大小固定的鄰域窗口,并將其旋轉到關鍵點的主方向。將該窗口劃分為若干個子區域,計算每個子區域內的梯度方向直方圖。將所有子區域的直方圖連接起來,形成一個 128 維的特征向量,即 SIFT 特征描述子。
SIFT 算法的應用場景
- 目標識別:通過提取目標物體的 SIFT 特征,并與數據庫中已知物體的特征進行匹配,可以實現對目標物體的識別。例如,在安防監控中,識別特定的人員或物體。
- 圖像拼接:在全景圖像拼接中,利用 SIFT 特征匹配不同圖像之間的重疊區域,從而實現圖像的準確拼接。
- 三維重建:從多幅圖像中提取 SIFT 特征,通過特征匹配計算圖像之間的相對位置和姿態,進而構建物體或場景的三維模型。
- 圖像檢索:根據圖像的 SIFT 特征,在圖像數據庫中快速檢索到與查詢圖像相似的圖像,用于圖像管理和檢索系統。
SIFT 算法的局限性
- 計算復雜度高:SIFT 算法的計算量較大,尤其是在處理高分辨率圖像時,運算時間較長,對硬件要求較高。
- 專利問題:SIFT 算法受專利保護,在商業應用中需要獲得相應的授權,這在一定程度上限制了它的廣泛應用。
sift算法實例
對一張男人的圖片進行特征提取:
'''-----------特征提取sift---------------------'''
# # 檢測圖像中的關鍵點
# # cv2.SIFT_create()
# #cv2.xfeatures2d.SIFT_create()#創建一個sift特征的提取對象#
# sift.detect(img)在圖像中查找關鍵點phone = cv2.imread('man.png')
phone_gray = cv2.cvtColor(phone,cv2.COLOR_BGR2GRAY)
sift = cv2.SIFT_create() # sift對象
kp = sift.detect(phone_gray)
# kp.pt:關鍵點的(x,y)
# 坐標。
# kp.size:關鍵點的大小(尺度):
# kp.angle:關鍵點的方向。
# kp.response:關鍵點的響應值。
# kp.octave:關鍵點所在的金字塔層級。
#查找關鍵點
# drawKeypoints(image,keypoints,outImage, color=None, flags=None)# image:原始圖片
# keypoints:從原圖中獲得的關鍵點,這也是畫圖時所用到的數據
# outputimage:輸出圖像,可以是原始圖片,也可以是None
# color:顏色設置,通過修改(b,g,r)的值,更改畫筆的顏色,b=藍色,g=綠色,r=紅色。繪制富有信息的關鍵點。# flags:繪圖功能的標識設置
phone_sift = cv2.drawKeypoints(phone,kp, None,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow('phone_sift',phone_sift)
cv2.waitKey(0)
# # 使用sift.compute()計算關鍵點描述符,方便后期的特征匹配
kp,des = sift.compute(phone,kp)
print(np.array(kp).shape,des.shape)
# 輸出關鍵點的形狀和描述符的形狀。
# np.array(kp).shape 表示關鍵點的數量和屬性。
# des.shape 表示描述符的數量和屬性。
結果: