Python图像角点检测求助:筛选高低角点并获取像素坐标
筛选Harris角点中的最高/最低角点
当然可以通过循环实现筛选!先理清楚关键逻辑:图像坐标系里,y轴是向下延伸的,所以"最高的角点"其实是y坐标最小的点,"最低的角点"是y坐标最大的点。接下来我会先讲怎么提取所有有效角点的坐标,然后分别用循环(满足你的需求)和更简洁的排序方法来实现目标。
第一步:提取所有有效Harris角点的坐标
假设你已经有了灰度图和Harris响应图,先把响应值超过阈值的有效角点坐标提取出来:
import cv2 import numpy as np # 示例:加载灰度图并计算Harris响应(你可以替换成自己的图像和参数) gray = cv2.imread('your_image.jpg', 0) dst = cv2.cornerHarris(gray, blockSize=2, ksize=3, k=0.04) dst = cv2.dilate(dst, None) # 膨胀角点,方便后续筛选 # 设置阈值,提取所有有效角点的坐标 threshold = 0.01 * dst.max() # np.argwhere返回的是(y, x)格式,转换成更符合习惯的(x, y)列表 corner_coords = [(x, y) for y, x in np.argwhere(dst > threshold)]
方法一:用循环遍历筛选极值点(完全满足你的需求)
核心思路是遍历所有角点,实时更新记录y坐标最小的两个"最高角点"和y坐标最大的两个"最低角点",逻辑直观易懂:
# 初始化存储变量,用极值初始化确保第一个角点能替换 # 最高角点(y越小越靠上) top1 = (float('inf'), float('inf')) # 格式:(x, y) top2 = (float('inf'), float('inf')) # 最低角点(y越大越靠下) bottom1 = (-float('inf'), -float('inf')) bottom2 = (-float('inf'), -float('inf')) for (x, y) in corner_coords: # 更新最高角点 if y < top1[1]: top2 = top1 top1 = (x, y) elif y < top2[1]: top2 = (x, y) # 更新最低角点 if y > bottom1[1]: bottom2 = bottom1 bottom1 = (x, y) elif y > bottom2[1]: bottom2 = (x, y) # 输出结果 print("两个最高的角点坐标:", top1, top2) print("两个最低的角点坐标:", bottom1, bottom2)
如果遇到多个角点y坐标相同的情况,这个逻辑会优先保留先遍历到的点,你也可以根据需求加上x坐标的判断(比如保留x最小/最大的点)。
方法二:用排序实现(更简洁高效)
如果不需要严格用循环,Python内置的sorted函数能更简洁地完成任务,代码可读性更高,效率也经过优化:
# 按y坐标从小到大排序,前两个就是最高角点 sorted_top = sorted(corner_coords, key=lambda p: p[1]) top_two = sorted_top[:2] # 按y坐标从大到小排序,前两个就是最低角点 sorted_bottom = sorted(corner_coords, key=lambda p: p[1], reverse=True) bottom_two = sorted_bottom[:2] print("两个最高的角点坐标:", top_two) print("两个最低的角点坐标:", bottom_two)
注意事项
- 如果你说的"最高/最低"是指水平方向的左右端点,只需要把代码里的
p[1](y坐标)换成p[0](x坐标)即可。 - 建议先判断角点数量:
if len(corner_coords) >=4,避免角点不足4个时出现初始极值(比如(inf, inf))的情况。
内容的提问来源于stack exchange,提问作者A. Antony
相关产品推荐
相关产品推荐

