Python将普通图像转化为栅格影像

news2025/1/23 17:25:15

引言

本人研究的方向是遥感,研究了2年也搞没清楚普通图像和遥感影像的区别,只知道到了多了地理坐标信息,但是经纬度信息映射到每个图像像素点的底层逻辑我还不太理解。因为现在需要使用python将图像转化为栅格影像,所以在此仔细研究一下。

地理坐标系和投影坐标系

【精选】地理坐标系VS投影坐标系_cgcs2000_3_degree_gk_cm_105e和gcs_china_geodetic_co ...

做遥感首先要理解地理坐标系(GeographicCoordinate System)和投影坐标系(ProjectedCoordinate System)2个概念。

  • 地理坐标系是球面坐标,参考平面是椭球面,坐标单位是经纬度;

  • 投影坐标系是平面坐标系,参考平面是水平面,坐标单位是米、千米等。

  • 地理坐标系转换到投影坐标系的过程理解为投影,即将不规则的地球曲面转换为平面。

img

以一个具体示例来初识ArcGIS中的坐标系,其全部参数拷贝在下面。这一示例是一个“投影坐标系(Projected Coordinate System)”。其名称是“WGS_1984_UTM_Zone_50N”。“WKID”是坐标系的编号,“ESPG”是“European Petroleum Survey Group”的缩写,表示其由“欧洲石油调查组织”发布。

可知,“WGS_1984_UTM_Zone_50N”这个投影坐标系由两部分组成:名为“Transverse_Mercator”的“投影(Projection)”和名为“GCS_WGS_1984”的“地理坐标系(GeographicCoordinate System)”。

WGS_1984_UTM_Zone_50N
WKID: 32650Authority: EPSG
Projection:Transverse_Mercator
False_Easting:500000.0
False_Northing:0.0
Central_Meridian:117.0
Scale_Factor:0.9996
Latitude_Of_Origin:0.0
Linear Unit: Meter(1.0)
GeographicCoordinate System: GCS_WGS_1984
Angular Unit:Degree (0.0174532925199433)
Prime Meridian:Greenwich (0.0)
Datum: D_WGS_1984
Spheroid: WGS_1984
Semimajor Axis: 6378137.0
Semiminor Axis: 6356752.314245179
Inverse Flattening: 298.257223563

地理坐标系

地理坐标系由三个参数来定义:角度单位(Angular Unit)、本初子午线(Prime Meridian)和大地测量系统(Datum)。

地理坐标系“GCS_WGS_1984”使用的角度单位为“度(Degree)”,0.0174532925199433这个数字等于“π/180”,使用的本初子午线为0.0度经线,即格林威治皇家天文台(Greenwich)所在位置的经线,使用的大地测量系统则为“D_WGS_1984”。
**地理坐标系的最重要的参数是“大地测量系统(Datum)”,而大地测量系统的最重要的参数是“椭球(Spheroid)”。**椭球相同,大地测量系统不一定相同,因为原点(origin)和方位(orientation)可以不同。想象一下,同一个椭球,首先可以固定在三维空间中的任意一个点,并且在固定于某点后还能以三个自由度任意地旋转其方位(朝向)。

WGS_1984”椭球的“长半轴(Semimajor Axis)”和“短半轴(Semiminor Axis)”分别为6378137.0和6356752.314245179,其“反扁率(Inverse Flattening)”为298.257223563,等于Semimajor Axis/( Semimajor Axis - Semiminor Axis)。

投影坐标系“WGS_1984_UTM_Zone_50N”使用的“投影(Projection)”名为“横轴墨卡托(Transverse_Mercator)”,然而这个名称并不能完全准确概括其投影。

投影坐标系

事实上,投影坐标系“WGS_1984_UTM_Zone_50N”这个名称中的“WGS_1984”指出了其地理坐标系为“GCS_WGS_1984”,而“UTM_Zone_50N”则指出了其投影。

“UTM_Zone_50N”这个名称指出,其投影方法是“通用横轴墨卡托(Universal Transverse Mercator,UTM)”,其投影带为北半球第50带,这个“Zone_50N”的“中央经线(Central Meridian)”正是117.0度,在“Transverse_Mercator”的参数中得到了体现。举一反三,“Xian_1980_GK_CM_117E”这个坐标系使用的地理坐标系为“GCS_Xian_1980”,而投影名称“GK_CM_117E”指出其使用以东经117度为中央经线的“高斯-克吕格(Gauss-Kruger,GK)”投影。投影的另一个重要参数是“东偏(False Easting)”。

有些投影会在X坐标值前加上投影带号,比如:“Xian_1980_GK_Zone_20”的“false_easting”参数为20500000.0,其中20为投影带号,而“Xian_1980_GK_CM_117E”的“false_easting”参数为500000.0,尽管它们的中央经线都为东经117度。

地理坐标系和投影坐标区别及常用操作: https://zhuanlan.zhihu.com/p/484585670

GeoTIFF数据格式

GeoTIFF是一种常用的地理信息系统(GIS)数据格式,它结合了TIFF(Tagged Image File Format)图像格式和地理空间信息。GeoTIFF文件可以包含地理坐标系、投影信息、地理位置和其他与地理空间数据相关的元数据。

GeoTIFF文件可以存储各种类型的地理空间数据,包括栅格数据(如卫星影像、数字高程模型等)和矢量数据(如点、线、面等地理要素)。它支持不同的地理坐标系和投影系统,可以准确地表示地球上的位置和形状。

GeoTIFF文件的优点包括:

  1. 与TIFF格式兼容:GeoTIFF文件可以使用标准的TIFF查看器和编辑器打开和编辑。
  2. 地理空间信息:GeoTIFF文件可以包含地理坐标系、投影信息和其他与地理空间数据相关的元数据,使得数据可以准确地在地球上的位置上显示和分析。
  3. 多波段支持:GeoTIFF文件可以存储多个波段的数据,例如多光谱卫星影像,方便进行多光谱分析。
  4. 跨平台兼容性:GeoTIFF文件可以在不同的GIS软件和平台上使用,包括ArcGIS、QGIS、ENVI等。

使用GeoTIFF文件,可以进行地理空间数据的获取、处理、分析和可视化,是GIS领域中常用的数据格式之一。

以下是一些常见的地理空间信息在GeoTIFF文件中的保存方式:

  1. 坐标系信息:GeoTIFF文件中保存了坐标系的相关信息,包括坐标系的名称、投影信息、椭球体参数等。这些信息可以通过GeoTIFF文件的元数据标签来获取。
  2. 地理范围:GeoTIFF文件可以保存地理范围的信息,即图像所覆盖的地理区域的边界。通常使用左上角和右下角的经纬度坐标来表示地理范围。
  3. 分辨率:GeoTIFF文件可以保存图像的分辨率信息,即每个像素代表的地理距离。通常以米或度为单位。
  4. 像素对应的地理坐标:GeoTIFF文件可以保存每个像素对应的地理坐标信息。这样可以通过像素坐标来获取对应的地理位置。

这些地理空间信息是通过GeoTIFF文件的元数据标签来保存的,常见的元数据标签包括"GeoKeyDirectoryTag"、“ModelPixelScaleTag”、"ModelTiepointTag"等。可以使用专门的GIS软件或者Python库(如GDAL)来读取和处理GeoTIFF文件的地理空间信息。

GDAL库

GDAL 官方文档 (osgeo.cn)

GDAL(Geospatial Data Abstraction Library)是一个开源的地理空间数据处理库,它提供了对各种格式的地理空间数据进行读取、写入和转换的功能。GDAL库支持包括GeoTIFF、Shapefile、NetCDF、HDF等在内的多种地理空间数据格式。

GDAL库的主要功能包括:

  1. 数据读取和写入:GDAL可以读取和写入各种地理空间数据格式,包括栅格数据和矢量数据。它可以从文件、数据库或内存中读取数据,并将数据写入到文件或其他数据源中。

  2. 数据转换和投影:GDAL可以进行地理空间数据的投影转换、坐标系转换和数据格式转换。它提供了丰富的投影和坐标系操作功能,可以将数据从一个坐标系转换到另一个坐标系,并进行投影变换。

  3. 数据操作和分析:GDAL提供了一些基本的数据操作和分析功能,如裁剪、重采样、统计等。它可以对栅格数据进行像素级别的操作,如计算均值、最大值、最小值等。

  4. 数据集信息获取:GDAL可以获取地理空间数据集的元数据信息,包括坐标系信息、地理范围、分辨率等。它还可以获取数据集中的波段信息、属性表信息等。

GDAL是一个功能强大且广泛应用的地理空间数据处理库,它提供了丰富的功能和灵活的接口,适用于各种地理空间数据处理需求。在Python中,可以使用GDAL库的Python绑定(即GDAL Python)来进行地理空间数据处理。

基础操作

from osgeo import gdal

# 打开影像文件
dataset = gdal.Open('data/other/guoyang2019.tif')
# 获取影像宽度和高度
width = dataset.RasterXSize
height = dataset.RasterYSize
# 获取影像波段数
band_count = dataset.RasterCount
# 获取投影信息
projection = dataset.GetProjection()
# 获取地理转换信息
geotransform = dataset.GetGeoTransform()
# 打印影像基本信息
print("影像宽度:", width)
print("影像高度:", height)
print("波段数:", band_count)
print("投影信息:", projection)
print("地理转换信息:", geotransform)
# 关闭影像文件
dataset = None

输出:

影像宽度: 7471
影像高度: 4896
波段数: 1
投影信息: GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]
地理转换信息: (115.878317255137, 8.982254799999953e-05, 0.0, 33.785346925021, 0.0, -8.982254799999988e-05)

其中地理转换信息即仿射矩阵,实现了从像素点到经纬度坐标的变换,其含义为

GeoTransform = [115.878317255137, 8.982254799999953e-05, 0.0, 33.785346925021, 0.0, -8.982254799999988e-05]
'''
0:图像左上角的X坐标;
1:图像东西方向分辨率;
2:旋转角度,如果图像北方朝上,该值为0;
3:图像左上角的Y坐标;
4:旋转角度,如果图像北方朝上,该值为0;
5:图像南北方向分辨率;
'''
得到这六个参数之后就可以进行图像像素坐标(即行列号)和地理坐标之间的变换:
#像素坐标和地理坐标仿射变换
XGeo = GeoTransform[0]+GeoTransform[1]*Xpixel+Ypixel*GeoTransform[2];
YGeo = GeoTransform[3]+GeoTransform[4]*Xpixel+Ypixel*GeoTransform[5];

读取和写入文件的函数:

def read_img(filename):
        dataset = gdal.Open(filename)
        im_width = dataset.RasterXSize #栅格矩阵的列数
        im_height = dataset.RasterYSize #栅格矩阵的行数
        im_geotrans = dataset.GetGeoTransform() #仿射矩阵
        im_proj = dataset.GetProjection() #地图投影
        im_data = dataset.ReadAsArray(0,0,im_width,im_height)
        del dataset
        return im_proj,im_geotrans,im_data
def write_img(filename,im_proj,im_geotrans,im_data):
        if "int8" in im_data.dtype.name:
            datatype = gdal.GDT_Byte
        if "int16" in im_data.dtype.name:
            datatype = gdal.GDT_UInt16
        else:
            datatype = gdal.GDT_Float32

        if len(im_data.shape) == 3:
            im_bands, im_height, im_width = im_data.shape
        else:
            im_bands, (im_height, im_width) = 1, im_data.shape

        driver = gdal.GetDriverByName("GTiff")  # 数据类型必须有,因为要计算需要多大内存空间
        dataset = driver.Create(filename, im_width, im_height, im_bands, datatype)

        dataset.SetGeoTransform(im_geotrans)  # 写入仿射变换参数
        dataset.SetProjection(im_proj)  # 写入投影

        if im_bands == 1:
            dataset.GetRasterBand(1).WriteArray(im_data)  # 写入数组数据
        else:
            for i in range(im_bands):
                dataset.GetRasterBand(i + 1).WriteArray(im_data[i])
        del dataset

实战

写这篇文章的目的是因为我目前深度学习拼接上的作物分布图只是一张PNG图片,没有地理坐标信息,现在需要通过代码添加上:

SoyaMap

from osgeo import gdal, osr

path = f"img/predict2020/SoyaMap.png"
# 读取图像
image = Image.open(path)
# 转换为numpy数组
image_array = (1-np.array(image)/255).astype(np.int8)
# 创建一个空间参考对象 ,将空间坐标系设置为EPSG:4326
srs = osr.SpatialReference()
srs.ImportFromEPSG(4326)
# 地理转换信息,图像左上角的经纬度坐标点和像素大小
geotransform = [115.86991557438377,8.983152841195215E-5, 0.0, 33.789500591456914, 0.0, -8.983152841195215E-5]
write_img("img/predict2020/SoyaMap.tif",srs.ExportToWkt(),geotransform,image_array)

导出成功后,使用Arcgis打开制图,简直不要太酷啦。

涡阳大豆分布图2020

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1344014.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

超维空间S2无人机使用说明书——51、基础版——使用yolov8进行目标跟踪

引言:为了提高yolo识别的质量,提高了yolo的版本,改用yolov8进行物体识别,同时系统兼容了低版本的yolo,包括基于C的yolov3和yolov4,以及yolov7。 简介,为了提高识别速度,系统采用了G…

解决VNC连接Ubuntu服务器打开终端出现闪退情况

服务器环境 阿里云ECS服务器 操作系统:Ubuntu 20.0.4 如何使用VNC连接阿里云ECS服务器 1.阿里云官方指导:通过VNC搭建Ubuntu 18.04和20.04图形界面 2.新手入门ECS——ubuntu 20.04安装图形化界面和本地VNC连接 问题描述 使用VNC连接上新申请阿里云服…

Python 实现 PDF 到 Word 文档的高效转换(DOC、DOCX)

PDF(Portable Document Format)已成为一种广泛使用的电子文档格式。PDF的主要优势是跨平台,可以在不同设备上呈现一致的外观。然而,当我们需要对文件内容进行编辑或修改,直接编辑PDF文件会非常困难,而且效果…

分布式技术之分布式数据存储系统

文章目录 什么是分布式数据存储系统?分布式数据存储系统三要素顾客:生产和消费数据导购:确定数据位置货架:存储数据 CAP 理论指出,在分布式系统中,不能同时满足一致性、可用性和分区容错性,指导…

408计算机组成原理错题知识点拾遗

个人向错题相关部分整理,涵盖真题、模拟、课后习题等。 408相关: 408数据结构错题知识点拾遗 408数据结构常考算法基础训练等待完善 408计算机组成原理错题知识点拾遗408操作系统错题知识点拾遗等待完善408计算机网络错题知识点拾遗 408计算机网络各层协…

MYSQL的UPDATE时锁表机制

(笔记,只为获取流量券) MySQL中,UPDATE 操作涉及到行级锁和表级锁的概念,具体取决于事务隔离级别和被更新的条件, 无索引的情况下: 当表没有索引的情况下,UPDATE 操作通常会涉及到表级锁。这是…

使用Halcon 采集图像并进行简单处理rgbl_to_gray/threshold/connection/fill_up

使用Halcon 采集图像并进行简单处理 文章目录 使用Halcon 采集图像并进行简单处理 下面介绍一个简单的采集图像的例子。在Halcon中利用图像采集接口,使用USB3.0相机实时拍摄图像。采集到图像后对图像进行简单的阀值分割处理,将有物体的区域标记出来。 &a…

------- 计算机网络基础

1.1概述 是什么? 答出独立计算机通信线路连接实现资源共享 计算机网络组成 从组成部分看: 硬件软件协议 从工作方式看: 边缘部分和核心部分 从功能组成看: 通信子网和资源子网 计算机网络性能指标 速率是指数据传输的物理速度,吞吐量是指实际的数据传输…

iPhone 13 Pro 更换『移植电芯』和『超容电池』体验

文章目录 考虑换电池Ⅰ 方案一Ⅱ 方案二 总结危险 Note系列地址 简 述: 首发买的iPhone 13P &#xff08;2021.09&#xff09;&#xff0c;随性使用一年出头&#xff0c;容量就暴跌 85%&#xff0c;对比朋友一起买的同款&#xff0c;还是95%。这已经基本得一天两充 >_<&a…

【机组期末速成】指令系统|机器指令概述|操作数类型与操作类型|寻址方式|指令格式

&#x1f3a5; 个人主页&#xff1a;深鱼~&#x1f525;收录专栏&#xff1a;计算机组成原理&#x1f304;欢迎 &#x1f44d;点赞✍评论⭐收藏 目录 前言&#xff1a; 一、本章考点总览 二、考点分析 1、以下有关指令系统的说法中错误的是&#xff08; &#xff09;。 2…

使用LOTR合并检索提高RAG性能

RAG结合了两个关键元素:检索和生成。它首先使用语义搜索等高级技术来浏览大量数据&#xff0c;包括文本、图像、音频和视频。RAG的本质在于它能够检索相关信息&#xff0c;然后作为下一阶段的基础。生成组件利用大型语言模型的能力&#xff0c;解释这些数据块&#xff0c;制作连…

操作系统大题

目录 作业一&#xff1a; 前驱图 作业二&#xff1a;信号量 作业三&#xff1a;同步算法 1‘’生产者消费者问题 解1&#xff1a; 解2&#xff1a;利用AND信号量解决生产者-消费者问题 解3. 利用管程解决生产者-消费者问题 2‘’ 哲学家进餐问题&#xff08;The Dinning…

Conda:Python环境管理的瑞士军刀

在数据科学和机器学习的世界中&#xff0c;管理各种库和依赖关系的重要性不容忽视。Conda 就是为此而生的强大工具。本文将深入探讨 Conda 的简介、功能以及使用示例&#xff0c;帮助你更好地理解和使用这个工具。 Conda 简介 Conda 是一个开源的包管理系统和环境管理系统&am…

MPLS动态协议LDP配置示例

一、预习&#xff1a; MPLS是一种根据报文中携带的标签来转发数据的技术&#xff0c;两台LSR必须在它们之间转的数据 的标签使用上“达成共识”。LSR之间可以运行LDP来告知其他LSR本设备上的标签绑定信息&#xff0c;从而实现标签报文的正确转发。 LSR&#xff1a;Label Switch…

跨进程通信 macOS XPC 创建实例

一&#xff1a;简介 XPC 是 macOS 里苹果官方比较推荐和安全的的进程间通信机制。 集成流程简单&#xff0c;但是比较绕。 主要需要集成 XPC Server 这个模块&#xff0c;这个模块最终会被 apple 的根进程 launchd 管理和以独立进程的方法唤起和关闭&#xff0c; 我们主app 进…

网络运行状况监控工具

网络运行状况是网络在其操作和环境约束范围内按预期运行的能力&#xff0c;但是&#xff0c;随着云和人工智能等技术的出现&#xff0c;网络变得越来越复杂&#xff0c;维护其 IT 基础设施是一项越来越繁琐的任务。为了确保网络可靠性&#xff0c;组织需要了解每个端点的运行状…

【c/c++】指针例图基础详解

文章目录 指针变量内存指针详解例1例2练习&答案解析 指针变量内存 int main(){// 各类型变量占字节数printf("char: %d\n",sizeof(char)); // 1printf("short: %d\n",sizeof(short)); // 2printf("int: %d\n",sizeof(int)); // 4pri…

详解C语言单链表接口函数

准备工作 创建一个头文件&#xff08;SList.h&#xff09;,两个源文件&#xff08;SList.c和test.c&#xff09; SList.h:用于包含库函数的头文件&#xff0c;链表节点结构体声明&#xff0c;接口函数的声明等【另外两个源文件要包含SList.h这个头文件&#xff0c;才能使用其…

【项目管理】CMMI-项目总体计划模版

目录 1、总体目录结构 2、重点章节概要示例 2.1 第四章 项目管理 2.2 第六章 实施与交付计划 2.3 第七章 运维计划 1、总体目录结构 2、重点章节概要示例 2.1 第四章 项目管理 2.2 第六章 实施与交付计划 2.3 第七章运维计划

【2023年终总结】纵是一路仆仆风尘,也莫忘了仰头

文章目录 1. 写在前面2. 关于生活3. 关于工作4. 关于以后 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向感兴趣的朋…