使用gdal读取遥感影像并显示图像
使用gdal读取遥感影像并显示图像
ytkz学习遥感编程要注意的一个地方是 :
gdal读取图像返回的矩阵,和python图像库读取图像返回的矩阵,二者格式大小是不一致的。
这也是我自己在学习遥感编程曾经混淆的一个知识点。
实践对比
假设此时影像是一个3通道的图像。
使用gdal读取:
ds = gdal.Open(file)
if ds is None:
raise Exception("无法打开文件")
array = ds.ReadAsArray()
返回的矩阵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)
使用PIL读取文件后,返回的是一个对象。此时要借助numpy把该对象转换为矩阵。
返回的矩阵img_array的大小为 (8082,5133,3)
使用opencv读取:
import cv2
img_cv2 = cv2.imread(file)
使用opencv读取文件后,直接返回图像矩阵。
返回的矩阵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()