如何解决如何从光栅 python 中的巨大 .tif 文件中获取掩码?
我有一个大 (~3GB) 的 .tif 文件,其中嵌入了地理信息。
我在 .shp 文件中保存了一些多边形(由 GPS 坐标表示),用于描述图像中我感兴趣的特定区域。
我想获得每个多边形所指的图像的裁剪,以及该裁剪上多边形的蒙版。
我可以根据多边形的边界框读取窗口,
但后来我无法匹配从 rasterio.read 函数创建的 numpy 数组中的多边形:
from math import ceil
import rasterio
import fiona
with fiona.open("shapes.shp","r") as shapefile:
shapes = [feature["geometry"] for feature in shapefile]
tif_fn = 'large_file.tif'
my_tif = rasterio.open(tif_fn)
bound_1 = rasterio.features.bounds(shapes[0])
bbox_1 = rasterio.windows.from_bounds(*bound_1,my_tif.transform)
window_transform1 = rasterio.windows.transform(window=bbox_1,transform=my_tif.transform)
mask = rasterio.features.geometry_mask([shapes[0]],out_shape=(ceil(bbox_1.width),ceil(bbox_1.height)),transform=window_transform,invert=True)
img_crop = my_tif.read([1,2,3],window=bbox_1) # pretty fast,~2 seconds
plt.imshow(img_crop)
plt.imshow(mask,alpha=0.2)
plt.show() # bad match of image and mask...
我已经尝试将 rasterio.mask.mask
与基于 this tutorial 的 crop=True
一起使用,但是在处理大文件时花费的时间太长。 (~50 秒)
# takes 50 seconds...
out_image,out_transform = rasterio.mask.mask(my_tif,shapes,crop=True,filled=True)
out_meta = rsrc.meta
有没有办法制作一个子数据集对象并从中获取掩码?
或者一种将裁剪和蒙版组合在一起的方法?
谢谢!
解决方法
第一个选项只是固定的,只需使用裁剪后的图像形状作为蒙版:
img_crop = my_tif.read([1,2,3],window=bbox_1) # pretty fast,~2 seconds
mask = rasterio.features.geometry_mask([shapes[0]],out_shape=(img_crop.shape[1],img_crop.shape[2]),transform=window_transform1,invert=True)
rasterio.mask.mask
的问题在于我试图为我的所有形状制作遮罩,而不是为每个形状制作遮罩。我需要像这样更改代码:
# takes 6 seconds,way better.
out_image,out_transform = rasterio.mask.mask(my_tif,[shapes[0]],crop=True,filled=True)
out_meta = rsrc.meta
original_image_cropped = my_tif.read([1,window=bbox_1)
plt.imshow(original_image[[0,1,2]])
plt.imshow(out_image[0],alpha=0.2)
plt.show()
# out_image is the crop,and read
请注意,我只屏蔽了一种形状,而不是所有形状。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。