使用gdal读取遥感影像并显示图像

学习遥感编程要注意的一个地方是 :

gdal读取图像返回的矩阵,和python图像库读取图像返回的矩阵,二者格式大小是不一致的。

这也是我自己在学习遥感编程曾经混淆的一个知识点。

实践对比

假设此时影像是一个3通道的图像。

使用gdal读取:

ds = gdal.Open(file)
if ds is None:
        raise Exception("无法打开文件")
array = ds.ReadAsArray()

image-20241128095438741

返回的矩阵array的大小为 (3,8082,5133)

python图像库一般有PIL和opencv

使用PIL读取:

from PIL import Image
import numpy as np

img  = Image.open(file)
img_array = np.array(img)

image-20241128095750299

使用PIL读取文件后,返回的是一个对象。此时要借助numpy把该对象转换为矩阵。

返回的矩阵img_array的大小为 (8082,5133,3)

使用opencv读取:

import cv2
img_cv2 = cv2.imread(file)

使用opencv读取文件后,直接返回图像矩阵。

image-20241128100817413

返回的矩阵img_cv2的大小为 (8082,5133,3)

gdal读取图像返回的矩阵大小形式为(z,x,y),

而PIL、opencv读取图像返回的矩阵大小形式为(x,y,z)

x,y是代表图像的高、宽

z代表图像的通道数(波段数)

统一处理

所以,我们一般是统一将(z,x,y)矩阵转换为(x,y,z)矩阵。

借助numpy,很容易实现。代码如下 :

img_gdal_array = np.transpose(array, (1,2,0))

可视化

在python可视化图像一般使用matplotlib

下面是gdal读取无人机tif影像,并使用matplotlib可视化的代码。一共四行。

file  = r'无人机.tif'
ds = gdal.Open(file)
array = ds.ReadAsArray()
img_gdal_array = np.transpose(array, (1,2,0))
plt.imshow(img_gdal_array),plt.show()

image-20241128113707103