使用Python读取多通道tif格式图片

Python如何读取单通道或者三通道图片想必大家都会了, 使用cv2.imread或者PIL当中的Image.open这两种方法, 都是可以的, 其中函数的参数和使用注意事项别的博客也有提到, 这里不再赘述.
这里要讲的是如何读取多通道(比如四通道, 五通道, 六通道, 七通道等)的tif格式的图片, 这类图片通常在地理信息软件当中合成(如ENVI), 并且存在超过3个的通道数量,通常这类图像用一般的看图软件也无法打开.
于是就要用到gdal这个包, 具体而言代码如下(假设我们的多通道图片为7bands.tif):
7bands.tif
那么读取这张图片的代码为:

from osgeo import gdal
data  = gdal.Open('7bands.tif')

用下面的代码显示通道数量:

num_bands = data.RasterCount
print(num_bands)

将多通道的图片数据变成numpy当中多维数组的形式:

tmp_img = data.ReadAsArray()

接下来需要使用到各个通道的数据时就方便多了, 但需要注意的是, 上面tmp_imgshape是(通道数, 长, 宽)和传统图像多维数组的shape (长, 宽, 通道数)是不一样的, 因此需要进行一次transpose变成传统的图像形状格式:

img = tmp_img.transpose(2, 0, 1) 

比如这张7bands.tif前3个通道是RGB, 我们就能用下面的代码取出这三个通道的数据:

img_rgb = img[:,:,0:3]

当然, 还需要注意的是数组中数据的dtype, 一般而言读出来是np.float, 直接使用可能会出现一些异常的结果. 我们需要将其转化为np.uint8, 作为传统图像数组当中的dtype:

import numpy as np
img_rgb = np.array(img_rgb, dtype = np.uint8)
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐