我是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()
但是它仍然以黄色和白色显示图像。
答案 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")
以外的库,例如rasterio
或cv2
,从RGB(A)图像中读取波段的顺序以及尺寸顺序可能会有所不同。如果您需要更改绘图方法的尺寸顺序,可以执行以下操作
PIL