python 把numpy.ndarray转为图像_python处理遥感必知或必会(1)

笔者目前的主要对遥感的研究方法如下,其中对大图及其结果处理和分析主要使用Arcgis、Envi等遥感专用软件,可以方便的进行可视化,尤其是当研究分析的图像为多光谱的大范围的大图时,直接进行波段组合观察预测的准确性,并可以分析标签的诸多属性。

python 把numpy.ndarray转为图像_python处理遥感必知或必会(1)_第1张图片

遥感图像常见的保存格式为tif,其包含了地理投影坐标等信息。python的GDAL提供了读写分析。一般而言,笔者用到了GDAL的读图功能,尤其是当操作的图像为大图时,能够方便的只读取特定的行列数,而不必担心爆内存、读取的图像为多波段。之后广泛使用python的numpy库、opencv-python库等。当转为了npy文件或者png文件后,使用pytorch的dataloader或者keras的fit iter等一批批的输入了网络模型中。

大图的滑动预测,输出的一般为类别值,比如常见的遥感影像识别(遥感分类、语义分割)。笔者的常见操作是,将其保存为了一个uint8的png灰度图像,其值为预定义对应的类别值。

我们将其添加到Arcgis,观看效果。对结果进行图层属性显示效果修改。

python 把numpy.ndarray转为图像_python处理遥感必知或必会(1)_第2张图片

但是我们发现,预测结果和遥感图像坐标不对应。预测结果的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")

你可能感兴趣的:(python)