Shi-Tomasi算法是对Harris角点检测算法的改进,一般会比Harris算法得到更好的角点。Harris 算法的角点响应函数是将矩阵 M 的行列式值与 M 的迹相减,利用差值判断是否为角点。后来Shi 和Tomasi 提出改进的方法是,若矩阵M的两个特征值中较小的一个大于阈值,则认为他是角点,即:
如下图所示:
从这幅图中,可以看出来只有当 λ1 和 λ 2 都大于最小值时,才被认为是角点。
corners = cv2.goodFeaturesToTrack ( image, maxcorners, qualityLevel, minDistance )
- Image: 输入灰度图像
- maxCorners : 获取角点数的数目。
- qualityLevel:该参数指出最低可接受的角点质量水平,在0-1之间。
- minDistance:角点之间最小的欧式距离,避免得到相邻特征点。
返回:
- Corners: 搜索到的角点,在这里所有低于质量水平的角点被排除掉,然后把合格的角点按质量排序,然后将质量较好的角点附近(小于最小欧式距离)的角点删掉,最后找到maxCorners个角点返回。
import cv2 as cv
import matplotlib.pyplot as plt
# 1 读取图像
img = cv.imread('./1.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()