为了制作深度学习数据集,我需要将多通道tiff图像进行裁剪,因此采用先用Python 根据经纬度批量裁剪TIFF影像。
如图所示,我这里是上海某POI的经纬度,按照经纬度我需要裁剪下面的底图
它有五个通道
import geopandas as gpd
import pandas as pd
import rasterio
from rasterio.windows import Window
import os
import numpy as np
# 配置
tiff_path = "D:/浏览器下载/卫星数据/卫星和路网.tif"
excel_path = "D:/浏览器下载/卫星数据/poi_data.xlsx"
output_dir = "D:/浏览器下载/卫星数据/裁剪xxx/input"
crop_size = 1000 # 裁剪区域的大小,以像素为单位
# 创建输出目录(如果不存在)
os.makedirs(output_dir, exist_ok=True)
# 读取 TIFF 图像
with rasterio.open(tiff_path) as src:
tiff_crs = src.crs.to_string()
tiff_transform = src.transform
tiff_width = src.width
tiff_height = src.height
tiff_bounds = src.bounds
num_bands = src.count # 获取通道数
# 读取 Excel 文件
df = pd.read_excel(excel_path)
gdf_excel = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df.wgs84_经度, df.wgs84_纬度), crs='EPSG:4326')
# 将 GeoDataFrame 的 CRS 转换为 TIFF 图像的 CRS
gdf_excel = gdf_excel.to_crs(tiff_crs)
for idx, row in gdf_excel.iterrows():
# 获取每个点的经纬度
lon, lat = row.geometry.x, row.geometry.y
# 将经纬度转换为图像中的像素坐标
px, py = ~tiff_transform * (lon, lat)
# 计算裁剪区域的边界
half_size = crop_size // 2
left = max(0, int(px - half_size))
top = max(0, int(py - half_size))
right = min(tiff_width, int(px + half_size))
bottom = min(tiff_height, int(py + half_size))
# 确保边界在图像范围内
width = right - left
height = bottom - top
# 裁剪图像
window = Window(left, top, width, height)
out_image = np.zeros((num_bands, height, width), dtype=np.uint8) # 预先创建一个空数组
with rasterio.open(tiff_path) as src:
for i in range(1, num_bands + 1):
out_image[i - 1] = src.read(i, window=window)
# 更新元数据
out_transform = tiff_transform * tiff_transform.translation(left, top)
out_meta = src.meta.copy()
out_meta.update({
"driver": "GTiff",
"count": num_bands,
"height": height,
"width": width,
"transform": out_transform
})
# 保存裁剪后的图像
output_file = os.path.join(output_dir, f"crop_{idx}.tif")
with rasterio.open(output_file, "w", **out_meta) as dest:
for i in range(num_bands):
dest.write(out_image[i], i + 1)
print(f"Cropped image {idx} saved to {output_file}")
这里裁剪大小为1000*1000自行设置,裁剪得到