使用Python计算机视觉移除地图文本标签、增强道路并计算面积占比
地图道路提取与面积计算方案
你之前仅基于单蓝色通道做阈值的方案没有利用多通道颜色差异特征,无法区分道路和同亮度的文字/背景像素,会残留大量噪点。以下是可直接运行的实现方案:
- 第一步:基于多通道颜色差筛选道路候选像素
Azure Maps的道路均为低饱和度的灰/浅色调,RGB三个通道的数值差极小;而背景植被、水系、文字标注均为高饱和色彩,三通道差值大。设置阈值过滤三通道差值大于20的像素,即可初步过滤90%以上的非道路元素。 - 第二步:形态学操作清理噪点、补全道路缺口
对初步筛选的二值图先做开运算(3x3核)清除零散的文字残留噪点,再做闭运算(5x5核)补全道路被文字遮挡产生的小缺口,得到连续的道路掩膜。 - 第三步:计算道路面积占比
统计掩膜中道路像素总数,除以图像总像素数即可得到相对面积百分比。
import cv2 import numpy as np # 读取RGBA格式的输入地图 img = cv2.imread("your_map.png", cv2.IMREAD_UNCHANGED) # 提取RGB通道,忽略alpha通道 img_rgb = img[:, :, :3] # 第一步:多通道差值筛选道路候选 r, g, b = cv2.split(img_rgb) diff_rg = np.abs(r - g) diff_rb = np.abs(r - b) diff_gb = np.abs(g - b) # 三通道差值均小于20的标记为候选道路 road_mask = (diff_rg < 20) & (diff_rb < 20) & (diff_gb < 20) road_mask = road_mask.astype(np.uint8) * 255 # 第二步:形态学操作优化掩膜 kernel_small = np.ones((3,3), np.uint8) kernel_large = np.ones((5,5), np.uint8) # 开运算清除小噪点 road_mask = cv2.morphologyEx(road_mask, cv2.MORPH_OPEN, kernel_small) # 闭运算补全道路缺口 road_mask = cv2.morphologyEx(road_mask, cv2.MORPH_CLOSE, kernel_large) # 第三步:计算面积占比 total_pixels = img.shape[0] * img.shape[1] road_pixels = np.count_nonzero(road_mask) road_area_percent = (road_pixels / total_pixels) * 100 print(f"道路相对面积占比:{road_area_percent:.2f}%") # 保存输出的道路二值图 cv2.imwrite("road_only.png", road_mask)
如果需要进一步调整效果,可以修改通道差值阈值、形态学核的大小,适配你手上的地图风格。
内容的提问来源于stack exchange,提问作者Rob Hess
相关产品推荐
相关产品推荐

