如何解决使用光栅显示 tiff 图像的特定部分,而无需加载整个文件
我有一个包含地图的大型 tiff 文件(大约 2GB)。我已经能够成功读取数据,甚至使用以下 python 代码显示它:
import rasterio
from rasterio.plot import show
with rasterio.open("image.tif") as img:
show(img)
data = img.read()
这很好用。但是,我需要能够显示此地图的特定部分,而不必将整个文件加载到内存中(因为它占用了太多 RAM,并且在许多其他 PC 上不可行)。为此,我尝试使用 Window 类 rasterio,但是当我尝试显示地图时,结果与显示完整地图的方式不同(好像它导致数据丢失):
import rasterio
from rasterio.plot import show
from rasterio.windows import Window
with rasterio.open("image.tif") as img:
data = img.read(window=Window(0,100000,100000))
show(data)
所以我的问题是,如何在不必将整个文件加载到内存中的情况下显示地图的一部分,同时还使它看起来好像是从完整的地图图像中裁剪出来的?
提前致谢:)
解决方法
它在第一种情况下显示得很好,但在第二种情况下显示良好的原因是,在第一种情况下,您将 rasterio.DatasetReader
的实例传递给 show
(show(img)
),但在第二种情况下,您传入一个 numpy 数组 (show(data)
)。 DatasetReader
包含附加信息,特别是 show
使用的仿射变换和颜色解释。
show
在第一种情况下(对于 RGB 数据)所做的其他事情可以为窗口情况重新创建,如下所示:
import rasterio
from rasterio.enums import ColorInterp
from rasterio.plot import show
from rasterio.windows import Window
with rasterio.open("image.tif") as img:
window = Window(0,100000,100000)
# Lookup table for the color space in the source file
source_colorinterp = dict(zip(img.colorinterp,img.indexes))
# Read the image in the proper order so the numpy array will have the colors in the
# order expected by matplotlib (RGB)
rgb_indexes = [
source_colorinterp[ci]
for ci in (ColorInterp.red,ColorInterp.green,ColorInterp.blue)
]
data = img.read(rgb_indexes,window=window)
# Also pass in the affine transform corresponding to the window in order to
# display the correct coordinates and possibly orientation
show(data,transform=img.window_transform(window))
(我通过查看源代码 here 弄清楚了 show
的作用)
对于具有单通道的数据,用于绘图的底层 matplotlib 库根据数据的最小值和最大值缩放颜色范围。要获得与以前完全相同的颜色,您需要知道整个图像的最小值和最大值,或者一些相当接近的值。
然后你可以明确告诉 matplotlib 的 imshow
如何缩放:
with rasterio.open("image.tif") as img:
window = Window(0,100000)
data = img.read(window=window,masked=True)
# adjust these
value_min = 0
value_max = 255
show(data,transform=img.window_transform(window),vmin=value_min,vmax=value_max)
额外的 kwargs(如此处的 vmin
和 vmax
)将传递给 matplotlib.axes.Axes.imshow
,如 here 所记录。
来自 matplotlib documenation:
vmin、vmax:浮动,可选
当使用标量数据且没有明确的范数时, vmin 和 vmax 定义颜色图覆盖的数据范围。默认情况下,颜色图涵盖所提供数据的完整值范围。当给出范数时,不推荐使用 vmin/vmax。使用 RGB(A) 数据时,忽略参数 vmin/vmax。
那样你也可以改变它使用的颜色图等
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。