图像特征类型可以分为如下三种:
- 边缘
- 角点(感兴趣关键点)
- 斑点(感兴趣区域)
其中,角点是个很特殊的存在。如果某一点在任意方向的一个微小变动都会引起灰度很大的变化,我们就把它称之为角点。角点作为图像上的特征点,包含有重要的信息,它们在图像中可以轻易的定位,同时,在人造物体场景,比如门、窗、桌等处也随处可见。
角点的具体描述可以有以下几种:
- 一阶导数(灰度的梯度)的局部最大所对应的像素点
- 两条及两条以上边缘的交点
- 图像中梯度值和梯度方向的变化速率都很高的点
- 角点处的一阶导数最大,二阶导数为0,它指示了物体边缘变化不连续的方向。
斑点是指二维图像中和周围颜色有颜色差异和灰度差异的区域,因为斑点代表的是一个区域,所以其相对于单纯的角点,具有更好的稳定性和更好的抗干扰能力。
Harris角点检测
"""
cv2.cornerHarris() 参数如下
• img - 数据类型为 float32 的 入图像。
• blockSize - 角点检测中 需要考率的领域大小。
• ksize - Sobel 求导中使用的窗口大小
• k - Harris 点检测方程中的自由参数 取值参数为 [0,04 0.06].
"""
import cv2
import numpy as np
filename = './subpixel5.png'
img = cv2.imread(filename)
img = cv2.resize(img, (640, 480))
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)
# 输入图像必 是 float32 最后一个参数在 0.04 到 0.05 之间
dst = cv2.cornerHarris(gray, 2, 3, 0.04)
# result is dilated for marking the corners, not important
dst = cv2.dilate(dst, None)
# Threshold for an optimal value, it may vary depending on the image.
img[dst > 0.01 * dst.max()] = [0, 0, 255]
cv2.namedWindow('dst', cv2.WINDOW_NORMAL)
cv2.imshow('dst', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Shi-Tomasi角点检测
import numpy as np
import cv2
from matplotlib import pyplot as plt
filename = 'img1.png'
img = cv2.imread(filename)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
corners = cv2.goodFeaturesToTrack(gray, maxCorners=25, qualityLevel=0.01, minDistance=10)
corners = np.int0(corners)
for i in corners:
x, y = i.ravel()
cv2.circle(img, (x, y), 3, 255, -1)
plt.imshow(img), plt.show()
参考文献:
局部特征——角点检测(Harris,Shi-Tomasi)_大写的ZDQ的博客-CSDN博客_harris角点特征
阿菊的OpenCv7——一分钟了解特征检测中的角点(Corner)以及斑点(blob)_fuhao7i的博客-CSDN博客_角点检测和斑点检测