目录
1、谷歌影像与哨兵影像是否为同一时期,是否完全相同,谷歌影像的标签是否真的可以用作哨兵影像的标签?
5、代码报错ERROR 1: PROJ: proj_create_from_name: Cannot find proj.db?
一、目的背景
由于哨兵二号影像分辨率为10m,较粗,在制作遥感影像数据集的时候手动划分有困难。我的想法是是否能够将其与谷歌地图影像配准,对谷歌地图的标签制作也就是哨兵二号的标签。
二、数据获取
哨兵二号:欧空局 2023年南京市江宁区某区域 10m
谷歌地图:Global Mapper 2023年南京市江宁区某区域(无偏移) 0.6m
三、数据集制作
根据前面章节,得到哨兵二号的数据集若干,本实验的关键在于配准谷歌影像以及标签的制作。
- 统一谷歌地图与哨兵二号影像的坐标系,在arcgis里进行检查。
- 使用得到的哨兵二号数据集对下载的谷歌影像进行裁剪,这里利用arcpy进行操作,用栅格范围对tif进行裁剪,代码如下:
# coding=utf-8 import arcpy import os # Sentinel 影像文件夹路径 sentinel_folder = r"D:/DayDayUP/Eco_data/ShuJuJi/tif_sentinel/images" # 谷歌影像路径 google_image = r"D:/DayDayUP/Eco_data/ShuJuJi/Googlemap/Googlemap.tif" # 输出文件夹路径 output_folder = r"D:/DayDayUP/Eco_data/ShuJuJi/tif_google" # 设置工作空间 arcpy.env.workspace = sentinel_folder # 确保输出文件夹存在,如果不存在则创建 if not os.path.exists(output_folder): os.makedirs(output_folder) print("工作空间设置完成") # 获取 Sentinel 影像文件夹中所有 tif 文件 sentinel_images = arcpy.ListRasters("*.tif") print("找到 {} 个 Sentinel 影像".format(len(sentinel_images))) # 循环处理每个 Sentinel 影像 for sentinel_image in sentinel_images: print("处理 {sentinel_image}") # 构建输出文件路径 output_image = os.path.join(output_folder, "g" + os.path.basename(sentinel_image)) # 使用哨兵影像裁剪谷歌影像 arcpy.Clip_management(google_image, "#", output_image, os.path.join(sentinel_folder, sentinel_image), "0", "ClippingGeometry") print("裁剪完成: {output_image}") print("脚本执行完成")
- 使用anylabeling对谷歌影像进行半自动化标签制作(模型下载时需要科学上网)。
- 将得到的json格式标签转换为带有地理坐标的tif文件,代码如下。
# coding=utf-8 import numpy as np import json import os from osgeo import gdal, ogr, osr import cv2 # 添加导入语句 import os runtime_hooks = ['hook.py'] # 指定JSON文件所在文件夹的路径 json_folder = "D:/DayDayUP/Eco_data/ShuJuJi/tif_google" output_folder = "D:/DayDayUP/Eco_data/ShuJuJi/tif_label" # 修改为保存 TIFF 的文件夹 # 获取文件夹内所有后缀为.json的文件列表 json_files = [f for f in os.listdir(json_folder) if f.endswith(".json")] # 遍历每个JSON文件 for json_file_name in json_files: print(f"Processing {json_file_name}...") json_file_path = os.path.join(json_folder, json_file_name) # 1. 读取JSON文件 with open(json_file_path, 'r') as json_file: data = json.load(json_file) # 2. 获取原始 TIFF 文件的路径(假设原始 TIFF 文件和 JSON 文件同名且在同一文件夹下) original_tiff_path = os.path.join(json_folder, json_file_name.replace(".json", ".tif")) # 替换为实际路径 print(f"Original TIFF Path: {original_tiff_path}") # 3. 使用GDAL打开原始 TIFF 文件获取地理信息 original_dataset = gdal.Open(original_tiff_path) if original_dataset is None: print("Error: Unable to open the original TIFF file.") continue original_geotransform = original_dataset.GetGeoTransform() original_projection = original_dataset.GetProjection() # 4. 获取图像的高度和宽度 image_height = data['imageHeight'] image_width = data['imageWidth'] # 5. 创建一个大小与图像高度和宽度相匹配的全零灰度图像 gray_image = np.zeros((image_height, image_width), dtype=np.uint8) # 6. 遍历JSON数据并将多边形区域设置为相应的值 for shape in data['shapes']: label = shape['label'] points = shape['points'] points = np.array(points, dtype=np.int32) # 根据不同的标签值设置不同的灰度值 if label == 'b0': # b0改成你的标签输入的类名(人工林地) cv2.fillPoly(gray_image, [points], 1) # 将多边形区域设置为值为1 elif label == 'b1': # b1改成你第二个的标签类名(原生林地) cv2.fillPoly(gray_image, [points], 2) # 将多边形区域设置为值为2 # 添加其他标签的处理逻辑,根据需要设置不同的灰度值 # 7. 生成文件名并保存灰度图像 output_file_name = json_file_name.replace(".json", "_label.tif") # 修改为保存 TIFF 文件 output_file_path = os.path.join(output_folder, output_file_name) print(f"Output TIFF Path: {output_file_path}") # 8. 创建一个具有地理信息的 TIFF 文件 driver = gdal.GetDriverByName('GTiff') dataset = driver.Create(output_file_path, image_width, image_height, 1, gdal.GDT_Byte) # 9. 设置地理信息(使用原始 TIFF 文件的地理信息) dataset.SetGeoTransform(original_geotransform) # 10. 设置投影信息 dataset.SetProjection(original_projection) # 11. 将灰度图像数据写入 TIFF 文件 band = dataset.GetRasterBand(1) band.WriteArray(gray_image) # 12. 关闭数据集 band = None dataset = None original_dataset = None print("Processing complete.\n")
四、遇见问题
1、谷歌影像与哨兵影像是否为同一时期,是否完全相同,谷歌影像的标签是否真的可以用作哨兵影像的标签?
答:下载了相同时期的谷歌影像,经对比二者一致,
2、谷歌影像如何下载?
答:教你如何轻松下载指定区域谷歌影像_哔哩哔哩_bilibili
3、anylabeling是什么?如何用?
答:如何制作遥感深度学习标签&样本(3)-_那咋办嘛-稍后再看-哔哩哔哩视频 (bilibili.com)
4、GDAL包如何下载?
答:GDAL不同于普通的包,可能直接用命令会报错,要求你下载与之匹配的Visual Studio 2019,如果报错的话,可以从anaconda中下载,结果是一样的。GDAL包是设置地理信息的关键。
5、代码报错ERROR 1: PROJ: proj_create_from_name: Cannot find proj.db?
答:网上找到的解决方式大多是手动下载包到虚拟环境,配置一句环境就可以,但是我试过并不行,这里找到一种真的灵的方法:
将下载的proj文件从运行环境中复制到可执行项目所在的目录,然后在项目运行目录中添加运行挂钩,也就是新建py文件hook.py,代码如下:
import os
import sys
os.environ['PROJ_LIB'] = os.path.dirname(sys.argv[0])
在上面代码中添加:
runtime_hooks = ['hook.py']
运行即可。