1. Harris 角點檢測
Harris 角點檢測通過影像的一個小部分視窗觀察影像,角點的特點是視窗向任意方向移動都會引起影像灰度的顯著變化,
將上述思想轉化為數學形式,即將區域視窗向各個方向移動(u,v),計算所有灰度差的總和,
其中 I(x,y) 是區域視窗的影像灰度, I(x+u,y+v) 為平移后的影像灰度,w(x,y) 是視窗函式,視窗可以是矩形視窗,也可以是為每個像素分配不同權重的高斯視窗,如下圖:
在角點檢測中,E(u,v) 的值被最大化, 使用一階泰勒展開式:
其中 Ix 和 Iy 沿著 x 和 y 方向的導數可以用sobel算子計算, 推導如下:
M 矩陣確定 E(u,v) 的值, 下面我們使用 M 來尋找角點, M 是 Ix 和 Iy 的二次項函式,可以用橢圓來表示, 橢圓的長短半軸由M的特征值λ1??和λ2??決定,方向由特征向量決定,如下圖:
Harris 給出的角點計算方法不需要計算具體的特征值,而是計算一個角點回應值R來判斷角點, R的計算公式為:
其中detM是矩陣M的行列式,traceM 是矩陣 M 的跡,α為常數,取值范圍為0.04~0.06,
由于:
特征值隱含在detM和traceM中,
如下圖所示:
當R為正數且取值較大時為角點;當 R 為負數且絕對值較大時為邊界;當 R 是較小的數時為平坦區域,
cv.cornerHarris(src, blockSize, ksize, k)
引數:
img 輸入影像,資料型別為 ?oat32,
blockSize 角點檢測中要考慮的鄰域大小
ksize sobel求導使用的核大小
k 角點檢測方程中的自由引數,取值引數為 [0.04,0.06],
Harris 角點檢測的優點:
旋轉不變性,橢圓旋轉一定角度但形狀保持不變,特征值保持不變, 影像灰度級的仿射變化是部分不變的, 因為只使用了影像的一階導數,所以影像灰度平移變化不變,影像灰度尺度變化不變,
Harris 角點檢測的缺點: 它對尺度非常敏感,不具有幾何尺度不變性,提取的角點是像素級的,
2. Shi-Tomasi演算法
Shi-Tomasi演算法是Harris角點檢測演算法的改進,Harris 演算法的角點回應函式是從矩陣 M 的行列式值 中減去 M 的跡,利用差值來判斷是否為角點, 后來Shi和Tomasi提出了一種改進方法,如果矩陣M的兩個特征值中較小的一個大于閾值,則認為是角點,即R=min(λ?1??,λ?2??),如下圖所示:
可以看出,只有當λ1和λ2均大于最小值時,才認為是角點,
cv.goodFeaturesToTrack(image, maxcorners, qualityLevel, minDistance)
引數:
image 輸入灰度影像
maxcorners 獲取角點數的數目
qualityLevel 該引數指出最低可接受的角點質量水平,在0-1之間,
minDistance 角點之間最小的歐氏距離,避免得到相鄰特征點,
回傳值:
搜索到的角點,
3. SIFT 演算法
SIFT 演算法的本質是在不同尺度空間中尋找關鍵點(特征點)并計算關鍵點的方向, SIFT查找到的關鍵點是一些非常突出的點,不會因為光照、仿射變換和噪聲等因素而改變,比如角點、邊緣點、暗區的亮點、亮區的暗點,
SIFT演算法可以分解為以下四個步驟:
1)尺度空間極值檢測:在所有尺度上搜索影像位置,通過高斯差分函式識別對尺度和旋轉不變的潛在關鍵點,
2)關鍵點定位:在每個候選位置,使用一個精細擬合的模型來確定位置和尺度,關鍵點的選擇取決于它們的穩定性程度,
3)關鍵點方向確定:根據影像的區域梯度方向,為每個關鍵點位置分配一個或多個方向,所有后續對影像資料的操作都相對于關鍵點的方向、尺度和位置進行變換,從而保證了這些變換的不變性,
4)關鍵點描述:在每個關鍵點周圍的鄰域內,在選定的尺度上測量影像的區域梯度,這些梯度用作關鍵點描述符,允許相對較大的區域形狀變形或光照變化,
cv.xfeatures2d.SIFT_create()
回傳值:SIFT物件
sift.detectAndCompute(gray)
引數:
gray 進行關鍵點檢測的灰度影像
回傳值:
kp 關鍵點資訊,包括位置,尺度,方向資訊,
des 關鍵點描述符,每個關鍵點對應128個梯度資訊的特征向量,
cv.drawKeypoints(image, keypoints, outputimage, color, flags)
引數:
image 原始影像
keypoints 關鍵點資訊,將其繪制在影像上,
outputimage 輸出圖片,可以是原始影像,
color 顏色設定,通過修改(b, g, r)的值,更改畫筆的顏色,
flags 繪圖功能的標識設定:
cv.DRAW_MATCHES_FLAGS_DEFAULT 創建輸出影像矩陣,使用現存的輸出影像繪制匹配對和特征點,對每一個關鍵點只繪制中間點 ,
cv.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG 不創建輸出影像矩陣,而是在輸出影像上繪制匹配對,
cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS 對每一個特征點繪制帶大小和方向的關鍵點圖形,
cv.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS 單點的特征點不被繪制,
例:對下面的影像使用Harris、Shi-Tomas和SIFT方法檢測角點,
import matplotlib
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
font = {
"family": "Microsoft YaHei"
}
matplotlib.rc("font", **font)
img = cv.imread("./image/tv.jpg")
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
gray_32 = np.float32(gray)
# Harris
dst = cv.cornerHarris(gray_32, 2, 3, 0.04)
# 繪制角點
img[dst > 0.001 * dst.max()] = [0, 0, 255]
plt.imshow(img[:, :, ::-1])
plt.title("Harris角點檢測")
plt.show()
# Shi-Thomas
corners = cv.goodFeaturesToTrack(gray, 1000, 0.01, 10)
# 繪制角點
for i in corners:
x, y = i.ravel()
cv.circle(img, (x, y), 2, (0, 0, 255), -1)
plt.imshow(img[:, :, ::-1])
plt.title("Shi-Thomas角點檢測")
plt.show()
# SIFT
sift = cv.xfeatures2d.SIFT_create()
kp, des = sift.detectAndCompute(gray, None)
# 繪制角點
cv.drawKeypoints(img, kp, img, flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
plt.imshow(img[:, :, ::-1])
plt.title("SIFT角點檢測")
plt.show()
輸出:
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/295762.html
標籤:其他
上一篇:OpenCV4.5 findContours函式崩潰的真正有效解決方案
下一篇:實戰詳細講解ffmpeg命令的使用(來自一線的經驗,視頻合并&avi轉MP4&補空白音頻【收藏下來一定用的到】)