>>> from env_helper import info; info()
页面更新时间: 2024-04-10 14:53:50
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-18-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

3.3. NumPy 掩膜

如果需要,可以将数据集带区读取为 numpy-masked 数组。

>>> import rasterio
>>> src = rasterio.open("/gdata/rasterio/RGB.byte.tiff")
>>> blue = src.read(1, masked=True)
>>> blue.mask
/usr/lib/python3/dist-packages/rasterio/__init__.py:304: NotGeoreferencedWarning: Dataset has no geotransform, gcps, or rpcs. The identity matrix will be returned.
  dataset = DatasetReader(path, driver=driver, sharing=sharing, **kwargs)
False

如前所述,此掩膜与gdal波段掩膜相反。要获得符合GDAL RFC 15的掩膜,请执行以下操作:

>>> msk = (~blue.mask * 255).astype('uint8')

对于任何整数值,都可以依赖此栅格标识。 N .

>>> N = 1
>>> (~src.read(N, masked=True).mask * 255 == src.read_masks(N)).all()
True

3.3.1. 数据集掩膜

有时每波段的掩膜是不合适的。在这种情况下,您可以从波段(或其他辅助数据)中手动构造一个遮罩; 或者使用栅格数据集 src.dataset_mask() 功能。 这将返回一个具有由以下条件确定的gdal样式掩膜的二维数组,其优先级为:

  • 如果.msk文件、数据集范围的alpha或内部掩膜存在,它将用作数据集掩膜。

  • 如果带阴影节点数据值的4波段rgba,则波段4将用作数据集掩膜。

  • 如果存在nodata值,请使用带掩膜的二进制或()。

  • 如果不存在no data值,则返回一个包含所有有效数据的掩膜(255)

请注意,这与read_掩膜和gdal rfc15不同,因为它适用于每个数据集,而不是每个波段。

3.3.2. 栅格文件中的节点数据表示法

nodata的存储和表示方式因数据格式和配置选项而异。 虽然栅格在阅读时为这些细节提供了一个抽象, 但在创建、操作和写入栅格数据时,了解这些差异通常很重要。

  1. nodata值 : src.nodata 值用于定义应掩膜哪些像素。

  2. 阿尔法带 :对于RGB图像,有时会提供额外的第4波段(包含gdal样式的8位掩膜)来明确定义该掩膜。

  3. 内部掩膜带 :gdal提供了存储额外的布尔1位掩膜的能力,该掩膜存储在数据集内部。此选项依赖于具有 GDAL_TIFF_INTERNAL_MASK=True . 否则,将从外部写入掩膜。

  4. 外掩膜带 :同上,但遮罩带存储在侧车中 .msk 文件(默认)。

3.3.3. 互操作性的解读

图像处理软件

一些Python图像处理软件包对数组的组织方式与栅格不同。三维数组的解释 rasterio 是:

(bands, rows, columns)

而图像处理软件如 scikit-image , pillow 和 matplotlib 通常是:

(rows, columns, bands)

行数定义了数据集的高度,列是数据集的宽度。

numpy提供了一种有效交换轴顺序的方法,您可以使用以下重塑函数在栅格和图像轴顺序之间进行转换:

>>> import rasterio
>>> from rasterio.plot import reshape_as_raster, reshape_as_image
>>>
>>> raster = rasterio.open("/gdata/rasterio/RGB.byte.tiff").read()
>>> raster.shape
(1, 300, 500)
>>> image = reshape_as_image(raster)
>>> image.shape
(300, 500, 1)
>>> raster2 = reshape_as_raster(image)
>>> raster2.shape
(1, 300, 500)

3.3.4. 数据集对象

栅格和 gdal 每个都有数据集对象。当然不是同一类,但也不是完全不同的类。在每种情况下,通常通过“opener”函数获取数据集对象: rasterio.open() 或 gdal.Open() .

这样,Python开发人员就可以减少读取文档的时间,数据集对象由 rasterio.open() 基于python的文件对象建模。它甚至有 close() 方法 gdal 缺少以便可以主动关闭数据集连接。

gdal 有带对象。Rasterio没有,因此也从来没有对象具有悬空的数据集指针。使用栅格,波段由一个数字索引表示,从1开始(就像gdal那样),并用作数据集方法的参数。将数据集的第一个带区读取为numpy ndarray 做这个。

>>> with rasterio.open('/gdata/rasterio/444.tiff') as src:
>>>     band1 = src.read(1)
>>> src = rasterio.open('/gdata/rasterio/444.tiff')
>>> src.indexes
(1, 2, 3)
>>> src.dtypes
('uint8', 'uint8', 'uint8')
>>> src.descriptions
(None, None, None)
>>> src.units
(None, None, None)

GeoTransform

这个 transform Rasterio数据集对象的属性与 GeoTransform 一个gdal数据集的属性,但Rasterio的功能更强大。它不仅是仿射变换矩阵元素的数组,而且是 Afine 并且有许多方便的方法。例如,任何栅格元素左上角的空间坐标都是数据集的 transform 矩阵和 (column, row) 元素的索引。

>>> src = rasterio.open('/gdata/rasterio/RGB.byte.tiff')
>>> src.transform * (0, 0)
(0.0, 0.0)
>>> ~src.transform * (101985.0, 2826915.0)
(101985.0, 2826915.0)
>>> from rasterio.transform import Affine
>>> Affine.from_gdal(101985.0, 300.0379266750948, 0.0,
>>>                   2826915.0, 0.0, -300.041782729805).to_gdal()
(101985.0, 300.0379266750948, 0.0, 2826915.0, 0.0, -300.041782729805)
>>> from pyproj import Proj, transform
>>> src = rasterio.open('/gdata/rasterio/RGB.byte.tiff')
>>> src.crs

这个数据无投影信息。没有转投影。

>>> # transform(Proj(src.crs), Proj('epsg:3857'), 101985.0, 2826915.0)

标签

GDAL 元数据项在栅格中称为“标记”。给定gdal元数据命名空间的标记集表示为dict。

>>> src.tags()
{}
>>> src.tags(ns='IMAGE_STRUCTURE')
{'INTERLEAVE': 'BAND'}

有效数据掩膜

Rasterio为每个数据集提供一个数组,用与gdal相同的指标表示其有效的数据掩膜: 0 对于无效数据和 255 以获取有效数据。

>>> src = rasterio.open('/gdata/rasterio/RGB.byte.tiff')
>>> src.dataset_mask()
array([[255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255],
       ...,
       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255]], dtype=uint8)
>>> src.read(1, masked=True)
masked_array(
  data=[[0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        ...,
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0]],
  mask=False,
  fill_value=999999,
  dtype=uint8)