使用OpenCV进行Canny边缘检测后如何提取边缘对应的x/y坐标
解决方法
cv.Canny()返回的edges是单通道uint8类型的numpy数组,其中像素值为255的位置就是检测到的边缘点,0为非边缘区域,你可以通过以下两种方式提取所有边缘点的x/y坐标:
方法1:使用numpy原生接口实现
# 提取所有值为255的像素坐标,返回结果第一个数组为y坐标,第二个为x坐标 y_coords, x_coords = np.where(edges == 255) # 拼接为(x,y)格式的坐标数组 edge_coords = np.column_stack((x_coords, y_coords))
注意:numpy数组的索引顺序为「行优先」,对应图像的y轴在前、x轴在后,提取后需要调换顺序才符合常规的图像坐标系逻辑
方法2:使用OpenCV内置接口(性能更优)
# 直接提取所有非零像素的坐标,squeeze用于去除多余的维度 edge_coords = cv.findNonZero(edges).squeeze()
该方法返回的数组每个元素直接为(x,y)格式的边缘坐标,无需手动调整顺序,处理大尺寸图像时效率比numpy方法更高。
补充说明
如果你需要将边缘点按独立的轮廓分组,可以在edges结果上调用cv.findContours()接口,会直接返回每个轮廓对应的独立坐标集合。
你可以通过以下代码验证提取结果:
# 打印前10个边缘坐标 print(edge_coords[:10])
内容的提问来源于stack exchange,提问作者Newyen minh
相关产品推荐
相关产品推荐

