使用Python讀取多通道tif格式圖片
阿新 • • 發佈:2021-02-18
使用Python讀取多通道tif格式圖片
Python
如何讀取單通道或者三通道圖片想必大家都會了, 使用cv2.imread
或者PIL
當中的Image.open
這兩種方法, 都是可以的, 其中函式的引數和使用注意事項別的部落格也有提到, 這裡不再贅述.
這裡要講的是如何讀取多通道(比如四通道, 五通道, 六通道, 七通道等)的tif格式的圖片, 這類圖片通常在地理資訊軟體當中合成(如ENVI), 並且存在超過3個的通道數量,通常這類影象用一般的看圖軟體也無法開啟.
於是就要用到gdal
這個包, 具體而言程式碼如下(假設我們的多通道圖片為7bands.tif
那麼讀取這張圖片的程式碼為:
from osgeo import gdal
data = gdal.Open('7bands.tif')
用下面的程式碼顯示通道數量:
num_bands = data.RasterCount
print(num_bands)
將多通道的圖片資料變成numpy
當中多維陣列的形式:
tmp_img = data.ReadAsArray()
接下來需要使用到各個通道的資料時就方便多了, 但需要注意的是, 上面tmp_img
的shape
是(通道數, 寬, 長)和傳統影象多維陣列的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)