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

使用OpenCV统计谷歌地图影像建筑数量结果错误如何修复?

谷歌地图影像建筑数量统计OpenCV实现优化

原始问题场景

尝试使用OpenCV从谷歌地图(gmaps)黑白影像中统计建筑数量,先后使用两套代码得到的计数结果均与实际数量不符。

第一版测试代码

import cv2
import numpy as np

image = cv2.imread('converted2.jpg')

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.medianBlur(gray, 5)
sharpen_kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]])
sharpen = cv2.filter2D(blur, -1, sharpen_kernel)

thresh = cv2.threshold(sharpen,160,255, cv2.THRESH_BINARY_INV)[1]
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
close = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=2)

cnts = cv2.findContours(close, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

min_area = 10
max_area = 1000000
image_number = 0
for c in cnts:
    area = cv2.contourArea(c)
    if area > min_area and area < max_area:
        x,y,w,h = cv2.boundingRect(c)
        ROI = image[y:y+h, x:x+w]
        cv2.imwrite('ROI_{}.png'.format(image_number), ROI)
        cv2.rectangle(image, (x, y), (x + w, y + h), (50,255,10), 2)
        image_number += 1

cv2.imshow('sharpen', sharpen)
cv2.imshow('close', close)
cv2.imshow('thresh', thresh)
print(image_number)
cv2.imshow('image', image)
cv2.waitKey()

运行后输出建筑数量为17,不符合实际值,相关影像如下:
原始影像
第一版识别结果

第二版测试代码

import cv2
import numpy as np

org=cv2.imread('maps_converted2.jpg')
cv2.imshow('sample',org)
img = cv2.imread('maps_converted2.jpg',0)
ret,thresh = cv2.threshold(img,127,255,0)
contours,hierarchy = cv2.findContours(thresh, 1, 2)
for cnt in contours:
    x,y,w,h = cv2.boundingRect(c)
    img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
cv2.imshow("image", img)
cv2.waitKey()

识别结果如下:
第二版识别结果

优化方案

  • 替换固定阈值为自适应阈值:原代码使用的固定阈值无法适配影像局部灰度差异,替换为自适应高斯阈值消除光照不均影响,修改阈值部分代码为:
    thresh = cv2.adaptiveThreshold(sharpen,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY_INV,11,2)
    
  • 调整形态学操作逻辑:新增开运算步骤过滤噪点,缩小闭运算迭代次数避免相邻建筑轮廓粘连,修改形态学操作代码为:
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
    open = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1)
    close = cv2.morphologyEx(open, cv2.MORPH_CLOSE, kernel, iterations=1)
    
  • 优化轮廓过滤规则:
    1. 调整面积阈值:根据影像分辨率计算单栋建筑的像素范围,将min_area调整为25,过滤细碎噪点;
    2. 新增长宽比过滤:过滤长宽比大于5的非建筑轮廓(如道路、绿化带),在循环中新增判断if 0.2 < w/h < 5。
  • 可选升级为分水岭算法:针对粘连严重的建筑,使用距离变换+分水岭算法拆分粘连轮廓,计数准确率可提升90%以上。

内容的提问来源于stack exchange,提问作者zzzz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:45:02