add nasa script
This commit is contained in:
76
maps/golden.py
Normal file
76
maps/golden.py
Normal file
@@ -0,0 +1,76 @@
|
||||
import cv2
|
||||
import numpy as np
|
||||
|
||||
def extract_green_polygons(image_path):
|
||||
# 1. 读取图片
|
||||
img = cv2.imread(image_path)
|
||||
if img is None:
|
||||
print("无法读取图片")
|
||||
return []
|
||||
|
||||
# 获取图片尺寸
|
||||
height, width = img.shape[:2]
|
||||
|
||||
# 定义目标坐标系范围
|
||||
target_w, target_h = 1465, 715
|
||||
|
||||
# 2. 转换颜色空间到 HSV 以便提取绿色
|
||||
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
|
||||
|
||||
# 定义绿色的 HSV 范围
|
||||
lower_green = np.array([35, 20, 200])
|
||||
upper_green = np.array([85, 255, 255])
|
||||
|
||||
# 3. 创建掩膜 (Mask)
|
||||
mask = cv2.inRange(hsv, lower_green, upper_green)
|
||||
|
||||
# 4. 图像形态学处理
|
||||
kernel = np.ones((3,3), np.uint8)
|
||||
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
|
||||
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
|
||||
|
||||
# 5. 查找轮廓
|
||||
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
|
||||
|
||||
polygons = []
|
||||
|
||||
for i, contour in enumerate(contours):
|
||||
# 过滤掉太小的区域
|
||||
if cv2.contourArea(contour) < 100:
|
||||
continue
|
||||
|
||||
points = []
|
||||
# 6. 坐标转换
|
||||
for point in contour:
|
||||
px, py = point[0]
|
||||
|
||||
# 【修改点1】:这里显式转换成 float(),去除 numpy 类型包裹
|
||||
# X 轴转换: 线性缩放
|
||||
new_x = float((px / width) * target_w)
|
||||
|
||||
# Y 轴转换: 图像坐标系 -> 笛卡尔坐标系
|
||||
new_y = float(((height - py) / height) * target_h)
|
||||
|
||||
# 保留两位小数
|
||||
points.append((round(new_x, 2), round(new_y, 2)))
|
||||
|
||||
polygons.append({
|
||||
"id": i,
|
||||
"vertex_count": len(points),
|
||||
"coordinates": points
|
||||
})
|
||||
|
||||
return polygons
|
||||
|
||||
# --- 使用说明 ---
|
||||
results = extract_green_polygons("golden_gate_bridge.png")
|
||||
|
||||
if not results:
|
||||
print("未找到多边形或图片读取失败")
|
||||
else:
|
||||
for poly in results:
|
||||
print(f"--- 多边形 ID: {poly['id']} (顶点数: {poly['vertex_count']}) ---")
|
||||
# 【修改点2】:遍历坐标列表,每行输出两个数字 (x y)
|
||||
for x, y in poly['coordinates']:
|
||||
print(f"{x}, {y}")
|
||||
print("") # 每个多边形之间空一行,方便区分
|
||||
BIN
maps/golden_gate_bridge.png
Normal file
BIN
maps/golden_gate_bridge.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 509 KiB |
BIN
maps/nasa.out
Normal file
BIN
maps/nasa.out
Normal file
Binary file not shown.
BIN
maps/nasa.png
Normal file
BIN
maps/nasa.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 392 KiB |
55
maps/nasa.py
Normal file
55
maps/nasa.py
Normal file
@@ -0,0 +1,55 @@
|
||||
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')
|
||||
BIN
maps/out.txt
Normal file
BIN
maps/out.txt
Normal file
Binary file not shown.
Reference in New Issue
Block a user