角点检测
在角点的地方,无论你向哪个方向移动小图,结果都会有很大的不同。所以可以把它们当 成一个好的特征
Harris角点检测
Harris角点检测的思想是通过图像的局部的小窗口观察图像,角点的特征是窗口沿任意方向移动都会导致图像灰度的明显变化
API是:
dst=cv.cornerHarris(src, blockSize, ksize, k)
参数:
img:数据类型为 float32 的输入图像。
blockSize:角点检测中要考虑的邻域大小。
ksize:sobel求导使用的核大小
k :角点检测方程中的自由参数,取值参数为 [0.04,0.06].
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
# 1 读取图像,并转换成灰度图像
img = cv.imread('./hfxjc001.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 2 角点检测
# 2.1 输入图像必须是 float32
gray = np.float32(gray)
# 2.2 最后一个参数在 0.04 到 0.05 之间
dst = cv.cornerHarris(gray,2,3,0.04)
# 3 设置阈值,将角点绘制出来,阈值根据图像进行选择
img[dst>0.001*dst.max()] = [0,0,255]
# 4 图像显示
fig,axes=plt.subplots(nrows=2,ncols=2,figsize=(10,8))
axes[0,0].imshow(gray)
axes[0,0].set_title("二值图图")
axes[0,1].imshow(img[:,:,::-1]),plt.title('Harris角点检测')
plt.show(
Harris角点检测的优缺点:
优点:
旋转不变性,椭圆转过一定角度但是其形状保持不变(特征值保持不变)
对于图像灰度的仿射变化具有部分的不变性,由于仅仅使用了图像的一介导数,对于图像灰度平移变化不变;对于图像灰度尺度变化不变
缺点:
对尺度很敏感,不具备几何尺度不变性。
提取的角点是像素级的,只有位置并没有更多的信息
Shi-Tomasi角点检测
Shi-Tomasi算法是对Harris角点检测算法的改进,一般会比Harris算法得到更好的角点。Harris 算法的角点响应函数是将矩阵 M 的行列式值与 M 的迹相减,利用差值判断是否为角点。后来Shi 和Tomasi 提出改进的方法是,若矩阵M的两个特征值中较小的一个大于阈值,则认为他是角点
API:
corners = cv2.goodFeaturesToTrack ( image, maxcorners, qualityLevel, minDistance )
参数:
Image: 输入灰度图像
maxCorners : 获取角点数的数目。
qualityLevel:该参数指出最低可接受的角点质量水平,在0-1之间。
minDistance:角点之间最小的欧式距离,避免得到相邻特征点。
返回:
Corners: 搜索到的角点,在这里所有低于质量水平的角点被排除掉,然后把合格的角点按质量排序,然后将质量较好的角点附近(小于最小欧式距离)的角点删掉,最后找到maxCorners个角点返回。
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1 读取图像
img = cv.imread('./hfxjc001.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()
两次对比一下: