1. 程式人生 > 其它 >使用Python讀取多通道tif格式圖片

使用Python讀取多通道tif格式圖片

技術標籤:pythongdalopencv影象處理

使用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 (長, 寬, 通道數)恰好是相反的, 因此需要進行一次轉置變成傳統的影象形狀格式:

img = tmp_img.T # 轉置

比如這張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)