import cv2 import numpy as np def extract_building_coordinates(image_path): # 加载图片 img = cv2.imread(image_path) if img is None: print("无法加载图片") return # 转换到灰度空间 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 针对 Google Maps 风格的建筑颜色进行阈值处理 # 建筑通常是特定的浅灰色 (约 230-245 之间) # 我们通过 inRange 提取这个颜色区间 mask = cv2.inRange(gray, 220, 245) # 进行形态学操作以去除细小噪声 kernel = np.ones((3, 3), np.uint8) mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel) # 查找轮廓 # RETR_EXTERNAL 只查找最外层轮廓 # CHAIN_APPROX_TC89_KCOS 使用精度较高的近似算法 contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_TC89_KCOS) buildings_data = [] for cnt in contours: # 过滤掉面积过小的噪点 if cv2.contourArea(cnt) < 50: continue # 多边形拟合,epsilon 越小,顶点越密集,形状越精确 epsilon = 0.002 * cv2.arcLength(cnt, True) approx = cv2.approxPolyDP(cnt, epsilon, True) points = [] for point in approx: x, y = point[0] points.append((float(x), float(y))) buildings_data.append(points) # 输出结果 for i, building in enumerate(buildings_data): print(f"# Building {i+1}") for x, y in building: print(f"{x}, {y}") print() # 每个建筑间空一行 if __name__ == "__main__": # 将 'nasa.jpg' 替换为你的文件名 extract_building_coordinates('nasa.png')