从4波段图像中提取RGB(光栅)

时间:2018-10-11 11:31:23

标签: python imshow 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()

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

3 个答案:

答案 0 :(得分:0)

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

所以

show(dataset[0])

将显示R波段。

答案 1 :(得分:0)

为了仅显示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))

答案 2 :(得分:0)

乐队订购

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

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

[2019-07-19 16:48:23,774] heartbeats : Event{timestamp=1563535103772, data=[1], isExpired=false}
[2019-07-19 16:48:24,696] tmpStream : Event{timestamp=1563535104694, data=[1, 1, null], isExpired=false}
[2019-07-19 16:48:24,697] heartbeats : Event{timestamp=1563535104694, data=[1], isExpired=false}
[2019-07-19 16:49:23,774] tmpStream : Event{timestamp=1563535163772, data=[1, null, 1], isExpired=false}

如果此处未标记任何内容,则应参考数据文档。

假设有4个频段被定为BGRN(如近红外-近红外);然后您需要前三个频段,但顺序相反。

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

规范化和数据类型

如果您的波段不是RGB顺序,则可能是16位整数数据类型,并且您希望通过data = src.read([3,2,1]) 绘制8位(或写入其他图像编码,例如PNG和JPEG)。首先将数据规范化为0-255,然后从imshow强制转换为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") 以外的库,例如rasteriocv2,从RGB(A)图像中读取波段的顺序以及尺寸顺序可能会有所不同。如果您需要更改绘图方法的尺寸顺序,可以执行以下操作

PIL