如何使用pyplot绘制从图像边缘提取得到的坐标点列表
问题原因
- 直接给
plot/scatter传入二维坐标列表不符合matplotlib的参数要求,这两个方法需要分别传入独立的x坐标序列、y坐标序列 - 图像的坐标体系和matplotlib默认坐标体系不一致:OpenCV中图像的原点在左上角,第一个维度i对应y轴向下递增,第二个维度j对应x轴向右递增,直接绘制会导致图像上下翻转
- 原有代码没有调用
grafico.show()展示画布,所以plot调用后也看不到内容 - 二值图处理步骤存在笔误:
bw_img - bwareaopen(bw_img, 50)没有赋值,处理结果被直接丢弃,需要改为bw_img = bwareaopen(bw_img, 50)
正确实现方式
将原有代码末尾的绘制部分替换为以下内容即可:
# 拆分x、y坐标:j对应x轴,i对应y轴 x = [p[1] for p in coordenadas] y = [p[0] for p in coordenadas] # 绘制推荐用scatter散点形式,不会出现连线混乱的问题 grafico.scatter(x, y, s=1, c='black') # s参数控制点的大小,可根据图像分辨率调整 # 翻转y轴适配图像坐标体系 grafico.gca().invert_yaxis() # 锁定xy轴等比例,避免图像拉伸变形 grafico.axis('equal') # 展示绘制结果 grafico.show()
可选优化
可以用numpy方法替代两层for循环提取坐标,运行效率更高:
# 替代原有遍历坐标的两层循环 y, x = np.where(bw_img_edges == 255) coordenadas = np.stack((y, x), axis=1)
内容的提问来源于stack exchange,提问作者L. Guilherme P. Melquiades
相关产品推荐
相关产品推荐

