PythonOpenCV-特征检测-角检测
角是两条边的交点,也可称为角点或拐角,它是图像中各个方向上强度变化最大的区域。
OpenCV的 cv2.cornerHarris()、cv2.cornerSubPix()和 cv2.goodFeaturesToTrack()函数用于角检测。
1. 哈里斯角检测
cv2.cornerHarris()函数根据哈里斯角检测器算法检测图像中的角,其基本格式如下:
dst = cv2.cornerHarris(src, blockSize, ksize, k)
参数说明:
dst :返回结果,它是一个 numpy.ndarray 对象,大小和 src 相同,每一个数组元素对应一个像素点,其值越大,对应像素点是角的概率越高
src:8 位单通道或浮点值图像
blockSize:邻域大小,值越大,检测出的角占的区域越大
ksize:哈里斯角检测器使用的 Sobel 算子的中孔参数
k:哈里斯角检测器的自由参数。
ksize 和 k 影响检测的敏感度,值越小,检测出的角越多,但准确率越低
代码示例:
import cv2 as cv import numpy as np img_src = cv.imread('cube.jpg') # 打开输入图像 cv.imshow('src', img_src) img_gray = cv.cvtColor(img_src, cv.COLOR_BGR2GRAY) # 转换为灰度图像 img_gray = np.float32(img_gray) # 转换为浮点类型 img_dst = cv.cornerHarris(img_gray, 10, 5, 0.001) # 执行角检测 img_src[img_dst > 0.02 * img_dst.max()] = [0, 0, 255] # 将角设置为红色 cv.imshow('dst', img_src) # 显示检测结果 cv.waitKey(0)
运行结果:
2. 优化哈里斯角
使用 cv2.cornerHarris()函数检测出的角称为哈里斯角,它包含了一定数量的像素。
有时,可能需要对哈里斯角进行进一步处理,找出角的更精确位置。
cv2.cornerSubPix()函数用于对哈里斯角进行优化,找出更准确的角的位置,其基本格式如下:
dst = cv2.cornerSubpix(src, corners, winSize, zeroZone, criteria)
参数说明:
dst:返回结果,存储优化后的角信息
src:8 位单通道或浮点值图像
corners:哈里斯角的质心坐标
winSize:搜索窗口边长的一半
zeroZone:零值边长的一半
criteria:优化查找的终止条件
代码示例:
import cv2 as cv import numpy as np import matplotlib.pyplot as plt img_src = cv.imread('cube.jpg') # 打开图像,默认BGR格式 cv.imshow('src', img_src) img_gray = cv.cvtColor(img_src, cv.COLOR_BGR2GRAY) # 转换为灰度图像 img_gray = np.float32(img_gray) # 转换为浮点类型 dst = cv.cornerHarris(img_gray, 8, 7, 0.04) # 查找哈里斯角 r, dst = cv.threshold(dst, 0.01 * dst.max(), 255, 0) # 二值化阈值处理 dst = np.uint8(dst) # 转换为整型 r, l, s, cxys = cv.connectedComponentsWithStats(dst) # 查找质点坐标 cif = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 100, 0.001) # 定义优化查找条件 corners = cv.cornerSubPix(img_gray, np.float32(cxys), (5, 5), (-1, -1), cif) # 执行优化查找 res = np.hstack((cxys, corners)) # 堆叠构造新数组,便于标注角 res = np.intp(res) # 转换为整型 img_src[res[:, 1], res[:, 0]] = [0, 0, 255] # 将哈里斯角对应像素设置为红色 img_src[res[:, 3], res[:, 2]] = [0, 255, 0] # 将优化结果像素设置为绿色 img = cv.cvtColor(img_src, cv.COLOR_BGR2RGB) # 转换为RGB格式 plt.imshow(img) plt.axis('off') plt.show() # 显示检测结果
运行结果:
👉
3. Shi-Tomasi角检测
OpenCV的 cv.goodFeaturesToTrack()函数使用 Shi-Tomasi 角检测器查找图像中的 /个最强角,其基本格式如下:
dst = cv.goodFeaturesToTrack(src,maxCorners, qualityLevel, minDistance)
参数说明:
dst:返回结果,保存了检测到的角在原图像中的坐标
src: 8 位单通道或浮点值图像
maxCorners:返回的角的最大数量
qualityLevel:可接受的角的最低质量
minDistance:返回的角之间的最小欧几里得距离
代码示例:
import cv2 as cv import numpy as np import matplotlib.pyplot as plt img_src = cv.imread('five.jpg') # 打开图像,默认BGR格式 img_gray = cv.cvtColor(img_src, cv.COLOR_BGR2GRAY) # 转换为灰度图像 img_gray = np.float32(img_gray) # 转换为浮点类型 corners = cv.goodFeaturesToTrack(img_gray, 6, 0.1, 100) # 检测角,最多6个 corners = np.intp(corners) # 转换为整型 for i in corners: x, y = i.ravel() cv.circle(img_src, (x, y), 4, (0, 0, 255), -1) # 用圆点标注找到的角,红色 img_dst = cv.cvtColor(img_src, cv.COLOR_BGR2RGB) # 转换为RGB格式 plt.imshow(img_dst) plt.axis('off') plt.show() # 显示检测结果
运行结果:
/*-------------------------------------------------------------------------------------------------------
笔者说明:
该笔记来源于本人学习Python + OpenCv时的资料,
分享出来只是为了供大家学习,并且为了自己以后想要用的时候方便寻找。
时间:2023年9月3日
------------------------------------------------------------------------------------------------------------*/