Python读取栅格图像并对像元数据处理后导出到表格文件中

本文介绍基于Python 语言中的gdal模块,读取一景.tif格式的栅格遥感影像 文件,提取其中每一个像元的像素数值 ,对像素值加以计算 (辐射定标)后,再以一列数据 的形式将计算后的各像元像素数据 保存在一个.csv格式文件中的方法。

首先,我们明确一下本文的需求。现在有一个栅格遥感影像 文件,其为.tiff格式的文件(但其实和.tif格式文件的操作方法是一样的),且像元的数值都是真实数值乘上10000之后的。这一遥感影像如下图所示,可以看到其各个波段的像元像素数据都是几百、几千的范围。

我们现在希望,对于这一景遥感影像的第一个波段(如果大家需要对多个波段加以这一操作,那么就在本文的代码中加以循环,分别对多个波段依次加以同样的处理就好),提取出其中每一个像元的数值;随后对提取出来的数据加以辐射定标,即除以10000,并将结果保存在一个.csv格式文件中,且以一列 的形式来保存。这里本文之所以需要用多行一列 而非多行多列矩阵 格式来存放数据,是因为后面需要将这些像素数据当作神经网络的预测样本,即一行 表示一个样本 ,所以就需要保存为多行一列 ;如果大家需要保存为多行多列矩阵格式,那代码的思路还是一致的,就是在导出数据之前将其保存为二维矩阵格式的变量就好。

知道了需求,我们就可以开始代码的撰写;具体代码如下。

python 复制代码
# -*- coding: utf-8 -*-
"""
Created on Wed Nov 29 01:32:28 2023

@author: fkxxgis
"""

import csv
from osgeo import gdal

file_path = "E:/04_Reconstruction/05_Image_Test/GF1WFV4.16m.2021252035621.48STB.000000_SR.tiff"
dataset = gdal.Open(file_path, gdal.GA_ReadOnly)

band = dataset.GetRasterBand(1)
data = band.ReadAsArray()
dataset = None

data = data * 0.0001
data_one_column = data.flatten()

csv_file = "E:/04_Reconstruction/05_Image_Test/column_1.csv"
with open(csv_file, 'w', newline='') as file:
    writer = csv.writer(file)
    writer.writerow(["Value"])
    writer.writerows([[value] for value in data_one_column])

其中,我们首先导入所需的库。在这里,csv库用于处理.csv格式文件,gdal库(从osgeo模块中导入)则用于读取和处理遥感影像文件;随后,定义遥感影像文件路径------file_path用来指定要读取的遥感影像文件的路径。

接下来,我们打开遥感影像文件。dataset = gdal.Open(file_path, gdal.GA_ReadOnly)意味着我们以只读方式打开遥感影像文件,并将返回的Dataset对象赋值给变量dataset;随后,获取第一个波段的像元值,这可以通过band = dataset.GetRasterBand(1)来完成(需要注意,这里波段编号的索引是从1开始的);随后,data = band.ReadAsArray()意思是将波段的像元值读取为一个二维数组,并将结果赋值给变量data。随后,我们需要关闭遥感影像文件,通过将dataset变量设为None,释放对遥感影像文件的引用,从而关闭文件。

其次,我们对像元值进行处理。首先,完成辐射定标,也就是通过data = data * 0.0001将像元值乘以0.0001;随后,将处理后的像元值按列展平------在这里,data_one_column = data.flatten()表示我们使用flatten()方法将二维数组展平为一维数组,并将结果赋值给变量data_one_column

最后,将上述处理好的数据写入.csv格式文件。其中,csv_file指定要写入的.csv格式文件的路径;with open(csv_file, 'w', newline='') as file表示我们使用open()函数打开.csv格式文件,并创建一个csv.writer对象,同时指定文件的写入模式为覆盖写入'w'writer.writerow(["Value"])意味着我们写入.csv格式文件的第一行,即表头,这里是一个标题为Value的列;最后,writer.writerows([[value] for value in data_one_column])通过迭代data_one_column中的每个值,并将其作为单独的列表传递给writer.writerows()方法,从而将每个值写入.csv格式文件的一行中。

运行上述代码,即可得到如下图所示的结果.csv格式文件。

其中,第一行就是我们的列名;后面几行数据都是0,这是由于原本的遥感影像在左上角区域NoData 值(大家看我们本文的第一张图就能看到)导致的。如果往下继续拖动这个.csv格式文件,就会看到处理后的非0数据了。

至此,大功告成。

相关推荐
四口鲸鱼爱吃盐11 分钟前
Pytorch | 利用GRA针对CIFAR10上的ResNet分类器进行对抗攻击
人工智能·pytorch·python·深度学习·计算机视觉
汤姆和佩琦14 分钟前
24-12-28-pytorch深度学习中音频I/O 中遇到的问题汇总
人工智能·pytorch·python·深度学习·音视频·i/o
IT管理圈26 分钟前
50个JAVA常见代码大全:学完这篇从Java小白到架构师
java·windows·python
kkkkkkkkkkaZZL31 分钟前
图片拼接|横向拼接|竖向拼接|正方形拼接|其他模式拼接 python
python·opencv·计算机视觉
网安kk32 分钟前
2025年三个月自学手册 网络安全(黑客技术)
linux·网络·python·安全·web安全·网络安全·密码学
CM莫问4 小时前
tokenizer、tokenizer.encode、tokenizer.encode_plus比较
人工智能·python·深度学习·语言模型·大模型·tokenizer·文本表示
web135085886355 小时前
Python毕业设计选题:基于python的白酒数据推荐系统_django+hive
python·django·课程设计
云空7 小时前
《解锁 Python 数据分析的强大力量》
python·数据挖掘·数据分析
MUTA️7 小时前
专业版pycharm与服务器连接
人工智能·python·深度学习·计算机视觉·pycharm
xuanfengwuxiang8 小时前
安卓帧率获取
android·python·测试工具·adb·性能优化·pycharm