Python |使用 OpenCV 的 Shi-Tomasi 角点检测方法进行角点检测
什么是角落? 一个角可以解释为两条边的交汇点(其中一条边是图像亮度的突然变化)。
施-托马西角检测–
史-托马西角点检测是由史和托马西在他们的论文《跟踪的好特征》中发表的。这里的基本直觉是,可以通过寻找所有方向的显著变化来检测拐角。
我们在图像上考虑一个小窗口,然后扫描整个图像,寻找角落。
向任何方向移动这个小窗口都会导致外观的巨大变化,如果那个特定的窗口恰好位于某个角落的话。
平坦区域在任何方向上都没有变化。
如果有边缘,那么沿着边缘方向不会有大的变化。
数学概述–
对于位于(X,Y)且像素强度为 I(X,Y)的窗口(W),Shi-Tomasi 角点检测公式为–
f(X, Y) = Σ (I(Xk, Yk) - I(Xk + ΔX, Yk + ΔY))2 where (Xk, Yk) ϵ W
根据公式: 如果我们用一个窗口扫描图像,就像用一个内核扫描一样,我们注意到有一个区域,无论我们实际扫描的方向如何,都有一个重大变化,那么我们有一个很好的直觉,那里可能有一个角落。
计算 f(X,Y)会真的很慢。因此,我们使用泰勒展开来简化评分函数
R = min(λ1, λ2)
where λ1, λ2 are eigenvalues of resultant matrix
使用goodFeaturesToTrack()
功能–
语法:cv2.goodyfeaturestotrack(gray_img,maxc,Q,minD)
参数: gray_img–积分值的灰度图像 maxc–我们想要的最大转角数(给出负值得到所有转角) Q–质量等级参数(优选值= 0.01) maxD–最大距离(优选值=10)
Below is the Python implementation of Shi-Tomasi Corner Detection:
# Python program to illustrate
# corner detection with
# Shi-Tomasi Detection Method
# organizing imports
import cv2
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
# path to input image specified and
# image is loaded with imread command
img = cv2.imread('chess.png')
# convert image to grayscale
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Shi-Tomasi corner detection function
# We are detecting only 100 best corners here
# You can change the number to get desired result.
corners = cv2.goodFeaturesToTrack(gray_img, 100, 0.01, 10)
# convert corners values to integer
# So that we will be able to draw circles on them
corners = np.int0(corners)
# draw red color circles on all corners
for i in corners:
x, y = i.ravel()
cv2.circle(img, (x, y), 3, (255, 0, 0), -1)
# resulting image
plt.imshow(img)
# De-allocate any associated memory usage
if cv2.waitKey(0) & 0xff == 27:
cv2.destroyAllWindows()
输入:
输出: