五、边缘检测
5.5角点检测
角点检测方法检测的是拥有特定特征的图像点。这些特征点在图像中有具体的坐标,并具有某些数学特征,比如局部最大或最小灰度、或是某些梯度特征等。角点检测算法可被用于识别具有特定形状的关键点,比如圆形、矩形等边缘的交点或特定结构的关键位置。这些关键点对于图形形状的识别、模板匹配等任务都至关重要。
在在进行动态图像分析中,角点检测算法能够跟踪图像序列中的特征点。因为这些特征点在连续帧之间能够保持相对稳定的位置和特征,所以角点检测可以用于视频跟踪、运动分析等任务。
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图片
img = cv2.imread('sanjiao.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 将图片转换为float32类型
gray = np.float32(gray)
# 应用Harris角点检测
dst = cv2.cornerHarris(gray, blockSize=2, ksize=3, k=0.04)
# 对结果进行膨胀,以便更好地标记角点
dst = cv2.dilate(dst, None)
# 获取角点的坐标
# 使用threshold找到大于阈值的角点
ret, dst = cv2.threshold(dst, 0.01 * dst.max(), 255, 0)
dst = np.uint8(dst)
# 找到角点的具体位置
ret, labels, stats, centroids = cv2.connectedComponentsWithStats(dst)
# 定义一个用于绘制圆圈的函数
def draw_circles(img, centroids):
for centroid in centroids:
cx, cy = int(centroid[0]), int(centroid[1]) # 确保坐标是整数
cv2.circle(img, (cx, cy), radius=5, color=(0, 0, 255), thickness=-1)
# 在原图上绘制圆圈
draw_circles(img, centroids[1:]) # 跳过背景标签(通常为0)
# 显示图片
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.title('Harris Corners Detected with Circles')
plt.show()
# 应用Harris角点检测
dst = cv2.cornerHarris(gray, blockSize=2, ksize=3, k=0.04)Harris的角点检测通过
cv2.cornerHarris
函数实现,它通过分析灰度图像的亮度变化来识别角点。该函数考虑每个像素的邻域大小(由blockSize
决定),使用Sobel算子(窗口大小由ksize
决定)来计算图像的梯度,并通过自由参数k
控制检测的灵敏度。输出是一个矩阵,表示每个像素是角点的可能性。
k
值的大小直接影响了检测到的角点数量。当k
值较小时,角点检测的灵敏度较高,容易检测到更多的角点,但也可能可能错误的将非角点检测成角点。
ret, dst = cv2.threshold(dst, 0.01 * dst.max(), 255, 0)
这行代码的作用是将图像
dst
进行阈值处理,将所有像素值大于或等于图像最大像素值的1%的像素点设置为白色(255),其余像素点设置为黑色(0)
k值取0.04时检测结果
k值取0.01时检测结果(灵敏度增加)
注:本人为在校学生,博客是边学边写的,主要是为了巩固知识,如有错误请积极指正。
本文的内容主要基于我对张运楚教授编著的《数字图像处理》一书的学习和理解。这本书深入浅出地介绍了数字图像处理的基本理论以及经典算法等,并且提供了丰富的示例代码和实际用例,极大地帮助了我学习图像处理知识。在此,我推荐大家阅读这本书,更加深入的学习有关图像处理的知识。