Python|使用 OpenCV 的 Shi-Tomasi 角点检测方法进行角点检测
什么是角落?
角可以解释为两条边缘的交汇点(其中边缘是图像亮度的突然变化)。
Shi-Tomasi 角点检测 –
Shi-Tomasi Corner Detection 由 J.Shi 和 C.Tomasi 在他们的论文“ Good Features to Track ”中发表。这里的基本直觉是,可以通过寻找各个方向的显着变化来检测角点。
我们考虑图像上的一个小窗口,然后扫描整个图像,寻找角落。
如果该特定窗口恰好位于角落,则将这个小窗口向任何方向移动都会导致外观发生很大变化。
平坦区域在任何方向上都不会发生变化。
如果有边缘,则沿边缘方向不会有重大变化。
数学概述 –
对于位于 (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。
R = min(λ1, λ2)
where λ1, λ2 are eigenvalues of resultant matrix
使用goodFeaturesToTrack()
函数–
Syntax : cv2.goodFeaturesToTrack(gray_img, maxc, Q, minD)
Parameters :
gray_img – Grayscale image with integral values
maxc – Maximum number of corners we want(give negative value to get all the corners)
Q – Quality level parameter(preferred value=0.01)
maxD – Maximum distance(preferred value=10)
# 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()
输入 :
输出 :