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

遥感影像的真正的顶点

image-20250218114939617

如上图所示,红色的四个点是遥感影像中的真正的顶点,指的是影像有效区域的边界点,而非无效值(如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)