You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python OpenCV提取图像中箭头路径的技术求助

提取draw.io生成箭头的路径与坐标方案

针对白色背景下draw.io制作的彩色箭头,用以下步骤实现单个箭头分离与坐标提取:

核心思路

利用draw.io箭头为纯色独立路径的特点,先通过颜色分割分离单个箭头,再提取每个箭头的轮廓坐标,最后识别箭头头部作为路径终点。

具体步骤

1. 颜色分割分离单个箭头

将图像转为HSV色彩空间,针对每个箭头的颜色设置阈值,生成对应颜色的掩码(掩码中仅保留该颜色的箭头)。代码示例:

import cv2
import numpy as np

# 读取图像
img = cv2.imread("arrow_img.jpg")
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# 以红色箭头为例,需根据实际箭头颜色调整HSV范围(可用取色工具获取)
lower_red = np.array([0, 120, 70])
upper_red = np.array([10, 255, 255])
red_mask = cv2.inRange(hsv_img, lower_red, upper_red)

2. 掩码预处理(修复线条+去噪)

用形态学开/闭运算修复箭头线条的断点,去除背景噪声:

# 创建3x3的结构元素
kernel = np.ones((3, 3), np.uint8)
# 闭运算填补线条断点,开运算去除小噪声点
red_mask = cv2.morphologyEx(red_mask, cv2.MORPH_CLOSE, kernel)
red_mask = cv2.morphologyEx(red_mask, cv2.MORPH_OPEN, kernel)

3. 提取单个箭头的轮廓坐标

对处理后的掩码调用findContours,即可获取该箭头的完整路径点集:

# 提取轮廓(RETR_EXTERNAL只取最外层轮廓,适合箭头这种单路径图形)
contours, _ = cv2.findContours(red_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 单个箭头对应一个轮廓,取出坐标点集
arrow_points = contours[0]
# 转换为(x,y)格式的列表
arrow_coords = [point[0].tolist() for point in arrow_points]

4. 识别箭头头部(路径终点)

draw.io的箭头头部是填充三角形,可通过轮廓的面积或形状近似区分:

  • 对轮廓做多边形近似,筛选出边数为3的近似图形(三角形),其重心即为箭头头部位置;
  • 或计算轮廓的外接矩形,面积较大的区域对应箭头头部,取其中心作为路径终点。

处理交叉箭头的注意点

由于每个箭头颜色独立,颜色分割后交叉区域会被保留在各自的颜色掩码中,不会影响单个箭头的路径提取,无需额外处理交叉情况。

内容的提问来源于stack exchange,提问作者Pravinkumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 09:25:06