获取Canny边缘检测图像的坐标——OpenCV与Python实现
提取OpenCV边缘检测结果的坐标到列表
嘿,我来帮你搞定这个问题!你已经成功跑通了边缘检测并显示结果,要把那些白色线条的坐标存进列表其实很简单,这里有两种实用的方法,你可以根据需求选:
方法1:提取所有边缘像素的坐标
如果你的边缘检测结果是二值图像(比如Canny输出的图,白色像素是边缘,黑色是背景),直接用NumPy的nonzero()函数就能一次性拿到所有边缘点的坐标:
import numpy as np import cv2 # 假设你的边缘检测结果存在变量edges里(二值图,边缘为255,背景为0) # 比如你可能是这样得到edges的: # img = cv2.imread('your_image.jpg', 0) # edges = cv2.Canny(img, 100, 200) # 获取所有白色像素的坐标:返回的是(y轴索引, x轴索引) y_indices, x_indices = np.nonzero(edges) # 把坐标打包成(x, y)的格式并存进列表 edge_points = list(zip(x_indices, y_indices)) # 现在edge_points里就是所有边缘点的坐标了,比如打印前5个看看: print(edge_points[:5])
注意:OpenCV的图像坐标系里,第一个维度是行(y轴),第二个是列(x轴),所以
nonzero()返回的顺序是(y, x),我们需要转成常规的(x, y)格式存在列表里。
方法2:提取连续的轮廓坐标
如果你需要的是连续的边缘轮廓(而不是零散的单个像素),可以用OpenCV的findContours()函数,它能把相邻的边缘像素聚合成轮廓:
import cv2 # 同样假设edges是你的二值边缘图 # 查找轮廓:OpenCV 4.x及以上版本返回(contours, hierarchy) contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 把所有轮廓的点合并到一个列表中 contour_points_list = [] for contour in contours: # contour的形状是(n, 1, 2),我们把它展平成(n, 2)的数组,再转成列表 single_contour_points = contour.reshape(-1, 2).tolist() contour_points_list.extend(single_contour_points) # 现在contour_points_list里就是所有轮廓的坐标点了
参数说明:
cv2.RETR_EXTERNAL:只提取最外层的轮廓,忽略嵌套的内部轮廓;如果需要所有轮廓可以用cv2.RETR_TREEcv2.CHAIN_APPROX_SIMPLE:压缩轮廓点(比如把一条直线的所有点压缩成两个端点),如果要保留轮廓上的每一个像素,换成cv2.CHAIN_APPROX_NONE就行
小提示
- 确保你的
edges是标准的二值图(只有0和255两个值),如果是其他边缘检测方法(比如Sobel)输出的灰度图,记得先用cv2.threshold()二值化后再处理。
内容的提问来源于stack exchange,提问作者rdo123
相关产品推荐
相关产品推荐

