簡體   English   中英

從4波段圖像中提取RGB(光柵)

[英]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,然后從uint16uint8 請注意,這樣做會降低精度,因此您需要對原始數據進行分析。

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的庫,例如cv2PIL ,則從RGB(A)圖像中讀取波段的順序以及尺寸順序可能會有所不同。 如果需要更改繪圖方法的尺寸順序,則可以執行以下操作

# Make the first (band) dimension the last
plt.imshow(numpy.moveaxis(data, 0, -1))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM