如何在rasteriopython中从一个巨大的.tif文件中获取掩码



我有一个很大的(~3GB(.tif文件,其中嵌入了地理信息。
我有几个多边形(用GPS坐标表示(保存在.shp文件中,这些多边形描述了我感兴趣的图像中的特定区域。

我想得到每个多边形所指的图像的裁剪,以及该裁剪上多边形的遮罩。

我可以从多边形中读取基于边界框的窗口,
但无法匹配从光栅创建的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.maskcrop=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,2,3], 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 

请注意,我只掩盖了一个形状,而不是所有形状。

相关内容

最新更新