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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:48:03