??本文介紹基于Python語言中的gdal模塊,讀取一景.tif格式的柵格遙感影像文件,提取其中每一個(gè)像元的像素?cái)?shù)值,對(duì)像素值加以計(jì)算(輻射定標(biāo))后,再以一列數(shù)據(jù)的形式將計(jì)算后的各像元像素?cái)?shù)據(jù)保存在一個(gè).csv格式文件中的方法。
??首先,我們明確一下本文的需求?,F(xiàn)在有一個(gè)柵格遙感影像文件,其為.tiff格式的文件(但其實(shí)和.tif格式文件的操作方法是一樣的),且像元的數(shù)值都是真實(shí)數(shù)值乘上10000之后的。這一遙感影像如下圖所示,可以看到其各個(gè)波段的像元像素?cái)?shù)據(jù)都是幾百、幾千的范圍。

??我們現(xiàn)在希望,對(duì)于這一景遙感影像的第一個(gè)波段(如果大家需要對(duì)多個(gè)波段加以這一操作,那么就在本文的代碼中加以循環(huán),分別對(duì)多個(gè)波段依次加以同樣的處理就好),提取出其中每一個(gè)像元的數(shù)值;隨后對(duì)提取出來的數(shù)據(jù)加以輻射定標(biāo),即除以10000,并將結(jié)果保存在一個(gè).csv格式文件中,且以一列的形式來保存。這里本文之所以需要用多行一列而非多行多列的矩陣格式來存放數(shù)據(jù),是因?yàn)楹竺嫘枰獙⑦@些像素?cái)?shù)據(jù)當(dāng)作神經(jīng)網(wǎng)絡(luò)的預(yù)測(cè)樣本,即一行表示一個(gè)樣本,所以就需要保存為多行一列;如果大家需要保存為多行多列的矩陣格式,那代碼的思路還是一致的,就是在導(dǎo)出數(shù)據(jù)之前將其保存為二維矩陣格式的變量就好。
??知道了需求,我們就可以開始代碼的撰寫;具體代碼如下。
# -*- 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])
??其中,我們首先導(dǎo)入所需的庫。在這里,csv庫用于處理.csv格式文件,gdal庫(從osgeo模塊中導(dǎo)入)則用于讀取和處理遙感影像文件;隨后,定義遙感影像文件路徑——file_path用來指定要讀取的遙感影像文件的路徑。
??接下來,我們打開遙感影像文件。dataset = gdal.Open(file_path, gdal.GA_ReadOnly)意味著我們以只讀方式打開遙感影像文件,并將返回的Dataset對(duì)象賦值給變量dataset;隨后,獲取第一個(gè)波段的像元值,這可以通過band = dataset.GetRasterBand(1)來完成(需要注意,這里波段編號(hào)的索引是從1開始的);隨后,data = band.ReadAsArray()意思是將波段的像元值讀取為一個(gè)二維數(shù)組,并將結(jié)果賦值給變量data。隨后,我們需要關(guān)閉遙感影像文件,通過將dataset變量設(shè)為None,釋放對(duì)遙感影像文件的引用,從而關(guān)閉文件。
??其次,我們對(duì)像元值進(jìn)行處理。首先,完成輻射定標(biāo),也就是通過data = data * 0.0001將像元值乘以0.0001;隨后,將處理后的像元值按列展平——在這里,data_one_column = data.flatten()表示我們使用flatten()方法將二維數(shù)組展平為一維數(shù)組,并將結(jié)果賦值給變量data_one_column。
??最后,將上述處理好的數(shù)據(jù)寫入.csv格式文件。其中,csv_file指定要寫入的.csv格式文件的路徑;with open(csv_file, 'w', newline='') as file表示我們使用open()函數(shù)打開.csv格式文件,并創(chuàng)建一個(gè)csv.writer對(duì)象,同時(shí)指定文件的寫入模式為覆蓋寫入'w';writer.writerow(["Value"])意味著我們寫入.csv格式文件的第一行,即表頭,這里是一個(gè)標(biāo)題為Value的列;最后,writer.writerows([[value] for value in data_one_column])通過迭代data_one_column中的每個(gè)值,并將其作為單獨(dú)的列表傳遞給writer.writerows()方法,從而將每個(gè)值寫入.csv格式文件的一行中。
??運(yùn)行上述代碼,即可得到如下圖所示的結(jié)果.csv格式文件。

??其中,第一行就是我們的列名;后面幾行數(shù)據(jù)都是0,這是由于原本的遙感影像在左上角區(qū)域是NoData值(大家看我們本文的第一張圖就能看到)導(dǎo)致的。如果往下繼續(xù)拖動(dòng)這個(gè).csv格式文件,就會(huì)看到處理后的非0數(shù)據(jù)了。
??至此,大功告成。