如果你的gdal版本是3.2.2及以上,那么只能:
from osgeo import gdal
ds = gdal.Open(data)
rows = ds.RasterYSize
cols = ds.RasterXSize
bandnum = ds.RasterCount
transform = ds.GetGeoTransform()
ds是一个对象,rows是影像的行,也是Y轴长度。对应的,cols则是影像的列,X轴的长度。bandnum代表影像的波段数。
transform是一个list,存储着栅格数据集的地理坐标信息。
#transform[0] /* top left x 左上角x坐标(经度)*/
#transform[1] /* w--e pixel resolution 东西方向上的像素分辨率*/
#transform[2] /* rotation, 0 if image is "north up" 如果北边朝上,地图的旋转角度*/
#transform[3] /* top left y 左上角y坐标(纬度)*/
#transform[4] ...
制作遥感变化检测样本,其他的遥感深度学习样本制作流程,在本质上无大的差别。
比如遥感语义分割的样本coco格式、voc格式,遥感目标检测yolo格式等。
它们的差别只在细节之处。现不展开细说,今天说的是:由遥感影像制作遥感变化检测样本
模仿俗话说,巧妇难为无米之炊。
制作遥感变化检测样本前提是,拥有两张完成配准的遥感影像和一张标签影像。
标签影像可以由矢量文件转换(这个教程最近会做)。
遥感变化检测样本的格式,我们可以参照已有的开源数据集:LEVIR、WHU-CD
我们以LEVIR为例子,下面是LEVIR的数据集文件结构:
A文件夹存放后时相图片,
B文件夹存放前时相图片。
前后时相是相对的,例如A文件夹存放的照片拍照于2019年,B文件夹存放的照片拍照于2024年
label文件夹存放前后时相变化的差值,有变化的地方用白色表示,无变化则用黑色表示。
白色表示,代表计算机中数值255。此时我们的标签文件是8bit。
list文件夹则存放三个txt,分别代表训练集、验证集、测试集。下图是训练集部分的截图。
从图片尺寸大小上,看看LEVIR数据集是怎么定义的。
A、B文件夹中的图片大小 ...
学习遥感编程要注意的一个地方是 :
gdal读取图像返回的矩阵,和python图像库读取图像返回的矩阵,二者格式大小是不一致的。
这也是我自己在学习遥感编程曾经混淆的一个知识点。
实践对比假设此时影像是一个3通道的图像。
使用gdal读取:
ds = gdal.Open(file)
if ds is None:
raise Exception("无法打开文件")
array = ds.ReadAsArray()
返回的矩阵array的大小为 (3,8082,5133)
python图像库一般有PIL和opencv
使用PIL读取:
from PIL import Image
import numpy as np
img = Image.open(file)
img_array = np.array(img)
使用PIL读取文件后,返回的是一个对象。此时要借助numpy把该对象转换为矩阵。
返回的矩阵img_array的大小为 (8082,5133,3)
使用opencv读取:
import cv2
img_cv2 = cv2.imread(file)
使用op ...
输入遥感影像的路径,生成对应的有效覆盖范围。
界面写得很简单,一共两个按钮。对应两种处理方式。
一个是单文件处理;第二个是批处理。
单文件处理测试:
点击第一个按钮。界面如下:
在处理完成后,会弹出窗口提示。
批量文件处理测试:
点击第2个按钮。要选择的文件夹必须包含tif文件,我选择的路径是D:\test
界面如下,选择好文件夹后,点击选择文件夹按钮:
在处理完成后,会弹出窗口提示。如下:
将结果放在QGIS展示,目测是否正确。
针对含孔洞的有效范围安装footprint后,打开footprint.py,只针对footprint_from_mask函数
定位到第85行,修改代码,如下:
修改前:
reprojected = reproject_geometry(
densified, source_crs, destination_crs, precision=precision
)
修改后:
reprojected = densified
二者区别在于 ,是否进行重投影。
所以 ,footprint_from_mask函数被修改为
def f ...
说起数组,不得不说numpy。
当然 ,如果你是使用其他的语言,如 C、C++或者matlab,数组的基本概念与编程语言无关。
因为我平常使用 python比较多,所以 就用numpy作为解释什么是图像。
NumPy 是一个 Python 库。
NumPy 用于处理数组。
NumPy 是“Numerical Python”的缩写。
NumPy 用于处理数组。NumPy 中的数组对象称为 ndarray。
0 维数组0 维数组或标量是数组中的元素。数组中的每个值都是 0 维数组。
这里我们可以把 0 维数组理解为图像中的像素点。
例子创建一个值为 10 的 0 维数组
import numpy as np
arr = np.array(10)
print(arr)
一维数组
以 0 维数组作为元素的数组称为 1 维数组。
这里我们可以把1 维数组理解为图像中的某一行或者某一列。
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
print(arr)
二维数组
以一维数组作为元素的数组称为二维数组。
二维数组可以看为是单个通道(波段)的 ...
全球耕地数据集地址:
https://github.com/fiboa/data
List of datasets
Title
License
Provider
Austria
CC-BY-4.0
Agrarmarkt Austria
BRP Crop Field Boundaries for The Netherlands (CAP-based)
CC0-1.0
Denmark Crop Fields (Marker)
CC-0
Field boundaries for Belgium Wallonia
No conditions apply to access and use
Field boundaries for Cambodia and Vietnam (AI4SmallFarms)
CC-BY-4.0
Field boundaries for Catalonia, Spain
Open Information Use License - Catalonia
Field boundaries for Croatia
Public ...
全球耕地数据集地址:
https://github.com/fiboa/data
List of datasets
Title
License
Provider
Austria
CC-BY-4.0
Agrarmarkt Austria
BRP Crop Field Boundaries for The Netherlands (CAP-based)
CC0-1.0
Denmark Crop Fields (Marker)
CC-0
Field boundaries for Belgium Wallonia
No conditions apply to access and use
Field boundaries for Cambodia and Vietnam (AI4SmallFarms)
CC-BY-4.0
Field boundaries for Catalonia, Spain
Open Information Use License - Catalonia
Field boundaries for Croatia
Public ...
在地理信息系统 (GIS) 中,边界框 (Bounding Box) 是用来描述一个几何图形的最小矩形区域的。它可以简单地表示为两个坐标:左下角和右上角的点。在这篇文章中,我们将介绍如何使用 Python 的 geojson 库计算一个多边形的边界框。
代码实现下面是一段简单的 Python 代码,它接受一个坐标列表,计算出包含这些坐标的边界框,并返回一个表示这个边界框的字符串:
import os
def count_lines_in_files(directory):
total_lines = 0
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith('.py'):
file_path = os.path.join(root, file)
with open(file_path, 'r', encoding='utf-8') as f:
...
在地理信息系统 (GIS) 中,边界框 (Bounding Box) 是用来描述一个几何图形的最小矩形区域的。它可以简单地表示为两个坐标:左下角和右上角的点。在这篇文章中,我们将介绍如何使用 Python 的 geojson 库计算一个多边形的边界框。
代码实现下面是一段简单的 Python 代码,它接受一个坐标列表,计算出包含这些坐标的边界框,并返回一个表示这个边界框的字符串:
import geojson
def bbox(coord_list):
# 获取所有的x坐标和y坐标
xs, ys = zip(*coord_list)
# 计算最小最大值
min_x, max_x = min(xs), max(xs)
min_y, max_y = min(ys), max(ys)
# 返回边界框
return (min_x, min_y, max_x, max_y)
# 测试数据:一个简单的 GeoJSON 多边形
poly = geojson.Polygon([[
(2.38, 57.322),
(23.194 ...
在使用 OGR 和 GDAL 的 Python 绑定时,有时你可能会遇到一个奇怪的现象:同样的代码结构,在某些情况下正常运行,而在其他情况下却导致 Python 闪退崩溃。本文将解释这种现象的原因,并演示如何避免这种问题。
问题重现假设我们正在使用一个 shapefile 文件,并尝试从中提取几何图形信息:
from osgeo import ogr
shp_ds = ogr.Open(r'D:\gadm\France\gadm41_FRA_0.shp')
lyr = shp_ds.GetLayer(0)
lyr.GetFeature(0).GetGeometryRef().GetX() # 这一行可能导致崩溃
结果会发生闪退。
上面的代码在执行时可能导致 Python 闪退。通过修改代码,问题似乎得到解决:
from osgeo import ogr
shp_ds = ogr.Open(r'D:\gadm\France\gadm41_FRA_0.shp')
lyr = shp_ds.GetLayer(0)
feature = lyr.GetFeature(0)
featur ...