获取遥感影像的真正的顶点

获取遥感影像的真正的顶点
ytkz遥感影像的真正的顶点
如上图所示,红色的四个点是遥感影像中的真正的顶点,指的是影像有效区域的边界点,而非无效值(如NoData或背景值)的顶点。
而蓝色的四个点,影像的地理范围(边界)的角点。这些顶点是影像的四个角点(左上、右上、右下、左下),表示影像的地理范围。与影像的有效区域无关,即使影像中有大量无效值(如NoData),GDAL的顶点仍然是影像的四个角点。
GDAL只保存左上角信息,其余三个角通过基于影像的地理坐标(经纬度或投影坐标)计算的。
代码如下:
from osgeo import gdal
# 打开影像
dataset = gdal.Open('image.tif')
width = dataset.RasterXSize
height = dataset.RasterYSize
geotransform = dataset.GetGeoTransform()
# 计算四个角点的坐标
corners = [
(geotransform[0], geotransform[3]),
(geotransform[0] + width * geotransform[1], geotransform[3]),
(geotransform[0] + width * geotransform[1], geotransform[3] + height * geotransform[5]),
(geotransform[0], geotransform[3] + height * geotransform[5])
]
print("GDAL顶点坐标:", corners)
区别总结
特性 | 真正的顶点 | GDAL中的顶点 |
---|---|---|
定义 | 有效区域的边界顶点 | 影像地理范围的四个角点 |
与无效值的关系 | 仅包含有效区域的顶点 | 与无效值无关,始终是四个角点 |
数量 | 取决于有效区域的形状,可能不止四个点 | 固定为四个点 |
用途 | 裁剪、几何校正、有效区域分析 | 地理范围计算、影像配准 |
获取方法 | 图像处理(如OpenCV) | GDAL库的地理变换信息 |
示例对比
- 真正的顶点:
- 如果影像中有一个不规则的有效区域(如一个湖泊),真正的顶点是这个湖泊边界的角点。
- 这些顶点是通过图像处理技术提取的。
- GDAL中的顶点:
- 无论影像中有效区域是什么形状,GDAL的顶点始终是影像的四个角点。
- 这些顶点是基于影像的地理坐标计算的。
真正顶点的获取
代码如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2025/2/18 11:32
# @File : get_vertex_point.py
'''
'''
import numpy as np
from osgeo import gdal
# DatasetInfo:遥感影像的属性,增加“获取源影像的非无效值的顶点坐标”
class DatasetInfo():
def __init__(self, path, type=True):
'''
@param path: 影像路径
@param num: 是否获取顶点坐标
'''
# 调用父类的构函
self.dataset = gdal.Open(path)
self.rows = self.dataset.RasterYSize # todo 图像宽度
self.cols = self.dataset.RasterXSize # todo 图像长度
self.bands = self.dataset.RasterCount # TODO 图像波段数量
self.proj = self.dataset.GetProjection() # todo 地图投影信息
self.geotrans = self.dataset.GetGeoTransform() # todo 仿射矩阵
self.longitude = self.geotrans[0] # todo 经度
self.latitude = self.geotrans[3] # todo 纬度
self.pixelWidth = self.geotrans[1] # todo x轴空间间隔
self.pixelHeight = self.geotrans[5]
if type==True:
try:
self.vertex_coordinates_info = self.vertex_coordinates()
except:
print('vertex_coordinates of DatasetInfo have error.')
def vertex_coordinates(self):
'''
获取源影像的非无效值的顶点坐标
输入影像的格式为 必定存在无效值的影像
@return:
'''
# ds = gdal.Open(path)
data = self.dataset.GetRasterBand(1).ReadAsArray()
nandata = data[0, 0]
result = []
# for i in range(self.rows):
conditions = 0
i = 0
while conditions == 0:
data1 = data[i, :]
if np.mean(data1) != nandata:
for j in range(self.cols):
if data1[j] != nandata:
print(data1[j])
result.append([i, j])
conditions = 1
break
i += 1
conditions = 0
j = 0
while conditions == 0:
data1 = data[:, j]
if np.mean(data1) != nandata:
for i in range(self.rows):
if data1[i] != nandata:
print(data1[i])
result.append([i, j])
conditions = 1
break
j += 1
conditions = 0
i = self.rows
while conditions == 0:
data1 = data[i - 1, :]
if np.mean(data1) != nandata:
for j in range(self.cols):
if data1[j] != nandata:
print(data1[j])
result.append([i, j])
conditions = 1
break
i -= 1
conditions = 0
j = self.cols
while conditions == 0:
data1 = data[:, j - 1]
if np.mean(data1) != nandata:
for i in range(self.rows - 1, 0, -1):
if data1[i] != nandata:
print(data1[i])
result.append([i, j])
conditions = 1
break
j -= 1
return result
if __name__ == "__main__":
file = r'D:\orth.tif'
result = DatasetInfo(file)
print(result.vertex_coordinates_info)