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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 21:36:04