2

我是 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()

但它仍然以黄色和白色显示图像。

4

3 回答 3

3

为了仅显示 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))
于 2018-10-30T01:52:34.717 回答
1

乐队顺序

波段的顺序很重要,它们可以根据 TIFF 进行不同的排序。数据的文档应该概述波段顺序是什么,并希望它可以从数据本身中读取(我的经验是通常不是这种情况)。

您可以先尝试检查乐队标签(不过,您仍然想参考文档)。

>>>src.descriptions
(None, None, None, None)

如果那里没有任何标签,您应该参考数据文档。

假设有 4 个波段按 BGRN 排序(如 NIR——近红外);然后你会想要前三个波段,但顺序相反。

data = src.read([3,2,1])

规范化和数据类型

如果您的波段不是 RGB 顺序,它很可能是 16 位整数数据类型,并且您需要 8 位用于绘图imshow(或写入另一种图像编码,例如 PNG 和 JPEG)。首先将数据归一化为 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,则从 RGB(A) 图像中读取波段的顺序以及维度的顺序可能会有所不同。如果您需要更改绘图方法的尺寸顺序,您可以执行以下操作cv2PIL

# Make the first (band) dimension the last
plt.imshow(numpy.moveaxis(data, 0, -1))
于 2019-07-19T11:23:24.873 回答
0

通常数据集是一个数组,其中每个元素都是您要查找的波段。给定您的代码, dataset[0] 是 R 波段, dataset[1] 是 G 波段,依此类推。

所以,

show(dataset[0])

将显示 R 波段。

于 2018-10-11T11:38:14.430 回答