[英]How can I open a specific dataset (band) from a multi dataset MODIS image using Rasterio? Rasterio IndexError: band index out of range
[英]Extracting RGB from a 4-band image (rasterio)
我是python的初學者,但是我仍然對它的庫很熟悉,如果這是一個新手問題,我深表歉意。 我只想顯示4個波段(R,G,B,NIR)的圖像。 我要刪除NIR並保留其他3.怎么做? 由於rasterio返回的是對象而不是圖像,因此我無法使用split函數。
from rasterio.plot import show
from matplotlib import pyplot
dataset = rasterio.open('sample.tif')
show(dataset)
這當然會顯示錯誤的結果(白色和黃色的圖像)。
編輯,我嘗試了以下方法:
img_combined = cv2.merge((dataset.read(1),dataset.read(2),dataset.read(3)))
%matplotlib qt
plt.imshow(img_combined)
plt.xticks([]), plt.yticks([])
plt.show()
但它仍以黃色和白色顯示圖像。
通常,數據集是一個數組,其中每個元素都是您要查找的波段。 給定您的代碼,dataset [0]是R波段,dataset [1]是G波段,依此類推。
所以,
show(dataset[0])
將顯示R波段。
為了僅顯示RGB波段(非alpha波段)或任何特定波段,您需要同時使用read方法和show方法。
import rasterio
from rasterio.plot import show
#to display RGB
dataset = rasterio.open('sample.tif')
show(dataset.read([1,2,3]))
#to display just the red band:
show(dataset.read(1))
樂隊順序
頻段的順序很重要,根據TIFF的不同,它們的順序也可以不同。 數據文檔應概述波段順序,並希望可以從數據本身中讀取(我的經驗通常不是這種情況)。
您可以先嘗試檢查樂隊標簽(盡管,您仍然想參考文檔)。
>>>src.descriptions
(None, None, None, None)
如果此處未標記任何內容,則應參考數據文檔。
假設訂購了4個波段作為BGRN(如近紅外-近紅外); 然后,您需要前三個頻段,但順序相反。
data = src.read([3,2,1])
規范化和數據類型
如果您的波段不是RGB順序,則很可能是16位整數數據類型,您可能希望通過imshow
(或寫入其他圖像編碼,例如PNG和JPEG)繪制8位。 首先將數據標准化為0-255,然后從uint16
為uint8
。 請注意,這樣做會降低精度,因此您需要對原始數據進行分析。
import numpy
def normalize(x, lower, upper):
"""Normalize an array to a given bound interval"""
x_max = numpy.max(x)
x_min = numpy.min(x)
m = (upper - lower) / (x_max - x_min)
x_norm = (m * (x - x_min)) + lower
return x_norm
# Normalize each band separately
data_norm = numpy.array([normalize(data[i,:,:], 0, 255) for i in range(data.shape[0])])
data_rgb = data_norm.astype("uint8")
圖像庫和數據尺寸
如果您使用的不是rasterio
的庫,例如cv2
或PIL
,則從RGB(A)圖像中讀取波段的順序以及尺寸順序可能會有所不同。 如果需要更改繪圖方法的尺寸順序,則可以執行以下操作
# Make the first (band) dimension the last
plt.imshow(numpy.moveaxis(data, 0, -1))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.