笔者目前的主要对遥感的研究方法如下,其中对大图及其结果处理和分析主要使用Arcgis、Envi等遥感专用软件,可以方便的进行可视化,尤其是当研究分析的图像为多光谱的大范围的大图时,直接进行波段组合观察预测的准确性,并可以分析标签的诸多属性。
遥感图像常见的保存格式为tif,其包含了地理投影坐标等信息。python的GDAL提供了读写分析。一般而言,笔者用到了GDAL的读图功能,尤其是当操作的图像为大图时,能够方便的只读取特定的行列数,而不必担心爆内存、读取的图像为多波段。之后广泛使用python的numpy库、opencv-python库等。当转为了npy文件或者png文件后,使用pytorch的dataloader或者keras的fit iter等一批批的输入了网络模型中。
大图的滑动预测,输出的一般为类别值,比如常见的遥感影像识别(遥感分类、语义分割)。笔者的常见操作是,将其保存为了一个uint8的png灰度图像,其值为预定义对应的类别值。
我们将其添加到Arcgis,观看效果。对结果进行图层属性显示效果修改。
但是我们发现,预测结果和遥感图像坐标不对应。预测结果的png是没有坐标投影的。这里我们使用代码,将遥感图像的投影信息,赋给预测结果(工作有点忙,我就少废话了,就此进行收尾)。重新进行显示,放大观察结果,并进行结果输出。
本文所用代码如下。
import gdal
import numpy as np
import cv2
# 读取tif数据集
def readTif(fileName, xoff=0, yoff=0, data_width=0, data_height=0):
dataset = gdal.Open(fileName)
# 栅格矩阵的列数,行数,波段数
# width = dataset.RasterXSize
# height = dataset.RasterYSize
# bands = dataset.RasterCount
# 获取数据
if data_width 0:
data_width = dataset.RasterXSize
if data_height 0:
data_height = dataset.RasterYSize
data = dataset.ReadAsArray(xoff, yoff, data_width, data_height)
# 获取仿射矩阵信息,投影信息
geotrans = dataset.GetGeoTransform()
proj = dataset.GetProjection()
return data, geotrans, proj
# 保存tif文件函数
def writeTiff(im_data, im_geotrans, im_proj, path):
if 'int8' in im_data.dtype.name:
datatype = gdal.GDT_Byte
elif 'int16' in im_data.dtype.name:
datatype = gdal.GDT_UInt16
else:
datatype = gdal.GDT_Float32
if len(im_data.shape) == 2:
im_data = np.array([im_data])
im_bands, im_height, im_width = im_data.shape
# 创建文件
driver = gdal.GetDriverByName("GTiff")
dataset = driver.Create(path, im_width, im_height, im_bands, datatype)
if (dataset is not None):
dataset.SetGeoTransform(im_geotrans) # 写入仿射变换参数
dataset.SetProjection(im_proj) # 写入投影
for i in range(im_bands):
dataset.GetRasterBand(i + 1).WriteArray(im_data[i])
del dataset
im_data, im_geotrans, im_proj = readTif("output/caijian.tif", 0, 0, 520, 256)
# im_data = np.transpose(im_data,(1,2,0))
# print(im_data.shape)
# img = cv2.imshow("",im_data[:,:,::-1]) # RGB2BGR
# cv2.waitKey(0)
im_data2, _, _ = readTif("output/pred_final.png", 0, 0, -1, -1)
writeTiff(im_data2, im_geotrans, im_proj, "output/save.tif")