使用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) - 优化轮廓过滤规则:
- 调整面积阈值:根据影像分辨率计算单栋建筑的像素范围,将
min_area调整为25,过滤细碎噪点; - 新增长宽比过滤:过滤长宽比大于5的非建筑轮廓(如道路、绿化带),在循环中新增判断
if 0.2 < w/h < 5。
- 调整面积阈值:根据影像分辨率计算单栋建筑的像素范围,将
- 可选升级为分水岭算法:针对粘连严重的建筑,使用距离变换+分水岭算法拆分粘连轮廓,计数准确率可提升90%以上。
内容的提问来源于stack exchange,提问作者zzzz
相关产品推荐
相关产品推荐

