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
相关产品推荐
相关产品推荐

