目錄
一、基礎理論
二、Harris角點檢測
1、基礎理論
1、原理
2、公式推導
3、理論結果判定
4、實際結果判定
2、函式
3、代碼
4、效果
三、Shi-Tomas角點檢測(Harris的改進)
1、基礎理論
2、函式
3、代碼
4、效果
總代碼
參考資料
一、基礎理論
在拼圖時,我們要尋找一些唯一的特征,這些特征要適于被跟蹤,容易被比較,我們在一副影像中搜索這樣的特征,找到它們,而且也能在其他影像中找到這些特征,然后再把它們拼接到一起,我們的這些能力都是天生的,
角點是影像很重要的特征,對影像圖形的理解和分析有很重要的作用,角點在三維場景重建運動估計,目標跟蹤、目標識別、影像配準與匹配等計算機視覺領域起著菲常重要的作用,在現實世界中,角點對應于物體的拐角,道路的十字路口、丁字路口等,(角點易區分)
影像特征:要有區分性,容易被比較,一般認為角點、斑點等是較好的影像特征,
特征檢測︰找到影像中的特征,
特征描述:對特征及其周圍的區域進行描述,
推薦Shi-Tomas演算法,
二、Harris角點檢測
1、基礎理論
1、原理
Harris角點檢測的思想是通過影像的區域的小視窗觀察影像,角點的特征:視窗沿任意方向移動都會導致影像灰度的明顯變化,如下圖所示:

2、公式推導
(角點是最大值)




可知M矩陣決定了E(u,v)最大值,所以可以通過求M矩陣來求E(u,v)最大值,即角點,
3、理論結果判定
![]()

(
和
分別是橢圓的長、短半軸)(也算是x和y方向的延伸)
結果分三種情況:
1、兩個特征值都很大:角點
2、一個特征值大: 邊緣
3、兩個特征值都很小: 平坦區域
以上便是理論上的角點判斷,下面講一下實際判斷方式:
4、實際結果判定
Harris給出的角點計算方法并不需要計算具體的特征值,而是計算一個角點回應值R來判斷角點,
R的計算公式為:R = det(M) ? k(trace(M))^2
公式:R = λ1λ2 ? k(λ1+λ2)^2
式中,detM為矩陣M的行列式;traceM為矩陣M的跡;
為常數,取值范圍為0.04~0.06,事實上,特征是隱含在detM和traceM中,因為:
(λ1 和 λ2 是 M 的特征值 )

最終判定:
R>0:角點(大數值)
R<0:邊緣(大樹值負數)
R>0:平坦區域(小數)
2、函式
dst=cv.cornerHarrisisrc, blockSize, ksize,k)img:資料型別為float32的輸入影像,
blockSize:角點檢測中要考慮的鄰域大小,
ksize:sobel求導使用的核大小,
k :角點檢測方程中的自由引數,取值引數為[0.04,0.06],
dst = cv.cornerHarris(gray, 2, 3, 0.01) # 鄰域大小 核 k取值(k越大,角越少)要求:1、灰度圖 2、float32型別
3、代碼
# Harris角點檢測
def Harris():
# 1、轉灰度圖
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 2、轉float32(Harris輸入影像必須是float32)
gray = np.float32(gray)
# 3、角點檢測
dst = cv.cornerHarris(gray, 2, 3, 0.01)
# 鄰域大小 核 k取值(k越大,角越少)
# 4、角點顯色(最佳值的閾值可能因影像而異)
img[dst > 0.01*dst.max()] = [0,0,255]
cv.imshow('Harris',img)
4、效果



(感覺結果差了點,角點不仔細看都看不清楚,至少下面經過優化的Shi-Tomas的演算法能讓人眼前一亮)
三、Shi-Tomas角點檢測(Harris的改進)
1、基礎理論
Shi-Tomas演算法是對Harris角點檢測演算法的改進,一般會比Harris演算法得到更好的角點,
Harris:演算法的角點回應函式是將矩陣M的行列式值與M的跡相減,利用差值判斷是否為角點,公式:R = λ1λ2 ? k(λ1+λ2)^2
Shi-Tomas:若矩陣M的兩個特征值中較小的一個大于閾值,則認為他是角點,(小值大于閾值)
公式:R = min(λ1, λ2)

只有當 λ1 和 λ2 大于最小值 λmin 時,才將其視為拐角(綠色區域)
2、函式
corners = cv2.goodFeaturesToTrack (image,maxcorners,qualityLevel, minDistance )lmage:輸入灰度影像,
maxCorners :獲取角點數的數目,
qualityLevel:該引數指出最低可接受的角點質量水平,在0-1之間,
minDistance:角點之間最小的歐式距離,避免得到相鄰特征點,
有些點無法正常顯示,要注意角點最大數量是否足夠,這個函式能設定角點的最大數量,
3、代碼
# Shi-Tomas角點檢測(Harris的優化)
def Shi_Tomas():
# 1、灰度化
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 2、角點檢測(回傳坐標)
corners = cv.goodFeaturesToTrack(gray, 300, 0.01, 10)
# 最多角點數 角點質量水平 角點之間最小距離
corners = np.int0(corners) # 浮點型化整形
# 3、遍歷每個角點坐標并畫點
for i in corners:
x, y = i.ravel() # 取出橫縱坐標
cv.circle(img, (x, y), 3, (0, 0, 255), -1) # 畫點
# 圓心 半徑 顏色 厚度
# 4、顯示
cv.imshow('Shi-Tomas', img)
4、效果




(效果顯而易見,推薦Shi-Tomas演算法)
總代碼
# 角點檢測(Harris和Shi-Tomas)
import numpy as np
import cv2 as cv
# Harris角點檢測
def Harris():
# 1、灰度化
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 2、轉float32(Harris輸入影像必須是float32)
gray = np.float32(gray)
# 3、角點檢測
dst = cv.cornerHarris(gray, 2, 3, 0.01)
# 鄰域大小 核 k取值(k越大,角越少)
# 4、角點顯色(最佳值的閾值可能因影像而異)
img[dst > 0.01*dst.max()] = [0,0,255]
cv.imshow('Harris',img)
# Shi-Tomas角點檢測(Harris的優化)
def Shi_Tomas():
# 1、灰度化
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 2、角點檢測(回傳坐標)
corners = cv.goodFeaturesToTrack(gray, 300, 0.01, 10)
# 最多角點數 角點質量水平 角點之間最小距離
corners = np.int0(corners) # 浮點型化整形
# 3、遍歷每個角點坐標并畫點
for i in corners:
x, y = i.ravel() # 取出橫縱坐標
cv.circle(img, (x, y), 3, (0, 0, 255), -1) # 畫點
# 圓心 半徑 顏色 厚度
# 4、顯示
cv.imshow('Shi-Tomas', img)
if __name__ == '__main__':
img = cv.imread('Resource/test15.jpg')
cv.imshow("img", img)
Harris() # Harris角點檢測
Shi_Tomas() # Shi-Tomas角點檢測
cv.waitKey(0)
參考資料
https://www.bilibili.com/video/BV1Fo4y1d7JL?p=45&spm_id_from=pageDriver
http://woshicver.com/Sixth/5_2_%E5%93%88%E9%87%8C%E6%96%AF%E8%A7%92%E6%A3%80%E6%B5%8B/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/295036.html
標籤:其他
上一篇:霍夫變換直線檢測


