如何基于OpenCV优化gmaps数据集建筑物计数结果的准确率
现有方案偏差原因
- 颜色掩码方案:你定义的颜色阈值范围几乎覆盖所有像素值,无法区分建筑、道路、植被等不同地物,且你转换了HSV格式却未在HSV空间做颜色筛选,仍用BGR空间判断,颜色区分度极低。
- 自适应阈值方案:未提前做去噪处理,会将道路纹理、阴影等细碎元素识别为前景,同时相邻建筑未做分割容易被合并计数,最终结果误差大。
优化调整步骤
1. 预处理阶段优化
先对原图做高斯模糊抑制噪声,再在HSV空间筛选建筑对应的颜色区间,过滤掉植被、道路等非建筑区域。
2. 后处理优化
阈值处理后增加形态学操作:用开运算去除小面积噪声点,用闭运算填充建筑内部的微小空洞,避免单个建筑被拆分为多个连通域。
3. 连通域过滤
统计所有连通域的面积,提前设定合理的面积阈值区间,过滤掉面积过小的噪声、面积过大的非建筑区域,仅统计符合建筑尺寸范围的连通域。
参考优化代码
import cv2 import numpy as np from matplotlib import pyplot as plt # 读取图像 img = cv2.imread("gmap.jpg") img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 高斯模糊去噪 blur = cv2.GaussianBlur(img_hsv, (5,5), 0) # HSV空间筛选建筑颜色(可根据实际数据集微调范围) # 黄色建筑范围 low_yellow = np.array([15, 20, 100]) high_yellow = np.array([35, 255, 255]) # 灰色/白色建筑范围 low_gray = np.array([0, 0, 120]) high_gray = np.array([180, 30, 255]) mask_yellow = cv2.inRange(blur, low_yellow, high_yellow) mask_gray = cv2.inRange(blur, low_gray, high_gray) mask_combined = cv2.bitwise_or(mask_yellow, mask_gray) # 形态学操作优化掩码 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3)) # 开运算去噪 mask_open = cv2.morphologyEx(mask_combined, cv2.MORPH_OPEN, kernel, iterations=1) # 闭运算填空洞 mask_close = cv2.morphologyEx(mask_open, cv2.MORPH_CLOSE, kernel, iterations=2) # 连通域统计+面积过滤 ret, labels, stats, centroids = cv2.connectedComponentsWithStats(mask_close, connectivity=8) # 设定建筑面积阈值(可根据实际图像分辨率调整,这里示例过滤10像素以下、1000像素以上的区域) min_area = 10 max_area = 1000 count = 0 for i in range(1, ret): area = stats[i, cv2.CC_STAT_AREA] if min_area < area < max_area: count +=1 # 结果可视化 label_hue = np.uint8(179 * labels / np.max(labels)) blank_ch = 255 * np.ones_like(label_hue) labeled_img = cv2.merge([label_hue, blank_ch, blank_ch]) labeled_img = cv2.cvtColor(labeled_img, cv2.COLOR_HSV2BGR) labeled_img[label_hue == 0] = 0 plt.title(f'Objects counted: {count}') plt.imshow(cv2.cvtColor(labeled_img, cv2.COLOR_BGR2RGB)) plt.show() print(f'建筑物数量为: {count}')
调参建议
- 如果存在大量相邻建筑被合并的情况,可以改用
cv2.watershed分水岭算法做实例分割,进一步拆分相邻的建筑对象。 - 颜色范围可以用取色工具在HSV图上取建筑区域的像素值,调整上下限提升掩码准确度。
- 面积阈值根据你数据集的图像分辨率、建筑平均大小灵活调整即可。
内容的提问来源于stack exchange,提问作者zzzz
相关产品推荐
相关产品推荐

