RGB道路站点地图图像中连通站点最短路径查找与轨迹生成咨询
最优解决思路
你之前的方案核心问题是走入了「必须分割道路路段才能计算距离」的误区,改用「道路二值图+最短路径搜索」的方案可以完全规避站点未覆盖道路的问题,具体实现步骤如下:
1. 图像预处理拆分核心元素
优先使用无标注原始图像避免文字干扰,通过颜色阈值分割提取两类核心区域:
- 红色站点区域:通过RGB红色通道阈值提取所有红色站点的连通域,计算每个连通域的质心作为站点的坐标点,存入站点列表统一管理
- 黑色道路区域:通过低亮度阈值提取黑色道路,生成二值化道路掩码(道路像素值为1,背景为0),作为后续路径搜索的可行走区域
如果存在站点质心轻微偏离道路的情况,可以对站点掩码做1~2像素的形态学膨胀后合并到道路掩码中,消除微小偏移的影响。
2. 连通性判断与距离计算
无需切割道路,直接基于道路掩码做最短路径搜索即可:
- 首先对道路掩码做连通域分析,只有处于同一个道路连通块内的站点才可能连通,提前过滤无效配对,减少计算量
- 对同连通块内的站点两两配对,用迪杰斯特拉算法或A算法*在道路掩码上做路径搜索:可直接使用
scikit-image的route_through_array、OpenCV的路径搜索相关接口实现,只要能搜索到路径即判定两个站点连通,返回的路径长度就是两站点间的道路像素长度,同时可以留存路径上的所有像素坐标用于后续可视化。
3. 路径可视化实现
拿到两个站点间的路径像素坐标列表后,直接在原图上将对应位置的像素替换为高亮颜色(如示例中的绿色),再在首尾位置标注站点名称,即可生成符合要求的路径标注图。
简化实现代码示例
import cv2 import numpy as np from skimage.graph import route_through_array # 读取无标注原图 img = cv2.imread("raw_map.png") # 提取黑色道路二值掩码 road_mask = cv2.inRange(img, (0,0,0), (50,50,50)) // 255 # 提取红色站点二值掩码 site_mask = cv2.inRange(img, (0,0,200), (50,50,255)) # 计算所有站点质心坐标 _, _, _, centroids = cv2.connectedComponentsWithStats(site_mask) # 过滤背景标签,保留站点坐标,转为整数 site_list = [tuple(map(int, point)) for point in centroids[1:]] # 示例:计算第1个站点到第3个站点的路径和距离 start_point = site_list[0] end_point = site_list[2] # 路径搜索:fully_connected设为False代表仅4邻域移动,符合道路连通规则 path, pixel_distance = route_through_array(1 - road_mask, start_point, end_point, fully_connected=False) # 路径可视化 vis_img = img.copy() for (y, x) in path: vis_img[y, x] = (0, 255, 0) # 路径标为绿色 cv2.imwrite("A_to_C_path.png", vis_img)
内容的提问来源于stack exchange,提问作者R2D2
相关产品推荐
相关产品推荐

