scipy.ndimage.

affine_transform#

scipy.ndimage.affine_transform(input, matrix, offset=0.0, output_shape=None, output=None, order=3, mode='constant', cval=0.0, prefilter=True)[源代码]#

应用仿射变换。

给定输出图像像素索引向量 o,其像素值由输入图像在位置 np.dot(matrix, o) + offset 处确定。

此函数执行“拉取”(或“反向”)重采样,通过将输出空间转换为输入空间来定位数据。仿射变换通常以“推送”(或“正向”)方向进行描述,即从输入转换到输出。如果您拥有用于“推送”变换的矩阵,请在此函数中使用其逆矩阵 (numpy.linalg.inv)。

参数:
inputarray_like

输入数组。

matrixndarray

逆坐标变换矩阵,将输出坐标映射到输入坐标。如果 ndiminput 的维数,则给定的矩阵必须具有以下形状之一:

  • (ndim, ndim):对应于每个输出坐标的线性变换矩阵。

  • (ndim,):假设二维变换矩阵是对角矩阵,且对角线由给定值指定。随后将使用利用问题可分性的更高效算法。

  • (ndim + 1, ndim + 1):假设变换使用齐次坐标 [1] 指定。在这种情况下,传递给 offset 的任何值都将被忽略。

  • (ndim, ndim + 1):同上,但齐次变换矩阵的最后一行始终为 [0, 0, ..., 1],因此可以省略。

offset浮点数或序列,可选

应用变换时数组的偏移量。如果是浮点数,offset 在每个轴上都相同。如果是序列,offset 应包含每个轴的一个值。

output_shape整数元组,可选

形状元组。

outputarray or dtype, optional

放置输出的数组,或返回数组的数据类型。默认情况下,将创建一个与输入具有相同数据类型的数组。

orderint, optional

样条插值的阶数,默认为 3。阶数必须在 0-5 的范围内。

mode{‘reflect’, ‘grid-mirror’, ‘constant’, ‘grid-constant’, ‘nearest’, ‘mirror’, ‘grid-wrap’, ‘wrap’}, optional

mode 参数决定了输入数组如何在边界之外进行扩展。默认为 ‘constant’。每个有效值的行为如下(请参阅额外的图和有关 边界模式 的详细信息)。

'reflect' (d c b a | a b c d | d c b a)

输入通过最后像素的边缘反射进行扩展。此模式有时也称为半样本对称。

‘grid-mirror’

这是 ‘reflect’ 的同义词。

'constant' (k k k k | a b c d | k k k k)

输入通过用由 cval 参数定义的相同常数值填充所有边界之外的值来扩展。在输入边界之外不执行插值。

‘grid-constant’ (k k k k | a b c d | k k k k

输入通过用由 cval 参数定义的相同常数值填充所有边界之外的值来扩展。插值也发生在输入范围之外的样本上。

'nearest' (a a a a | a b c d | d d d d)

输入通过复制最后像素进行扩展。

'mirror' (d c b | a b c d | c b a)

输入通过最后像素的中心反射进行扩展。此模式有时也称为全样本对称。

‘grid-wrap’ (a b c d | a b c d | a b c d

输入通过环绕到对边进行扩展。

‘wrap’ (d b c d | a b c d | b c a b

输入通过环绕到相反的边缘来扩展,但方式是使最后一个点和初始点完全重叠。在这种情况下,在重叠点处选择哪个样本并未明确定义。

cval标量,可选

如果 mode 为 'constant',则用于填充输入超出边缘的值。默认值为 0.0。

prefilterbool, optional

确定在插值之前是否使用 spline_filter 对输入数组进行预滤波。默认值为 True,如果 order > 1,则会创建一个存储滤波值的临时 float64 数组。如果将其设置为 False,且 order > 1,则输出会略微模糊,除非输入已经过预滤波(即它是对原始输入调用 spline_filter 的结果)。

返回:
affine_transformndarray

变换后的输入。

附注

给定的矩阵和偏移量用于通过仿射变换查找输出中每个点在输入中对应的坐标。输入在这些坐标处的值通过请求阶数的样条插值确定。超出输入边界的点将根据给定的模式(mode)进行填充。

0.18.0 版本变更:在此之前,对仿射变换的准确解释取决于矩阵是以一维还是二维数组形式提供的。如果为矩阵参数提供了一维数组,则索引 o 处的输出像素值由输入图像在位置 matrix * (o + offset) 处确定。

对于复值 input,此函数独立变换实部和虚部组件。

1.6.0 版本已添加: 添加了复值支持。

数组 API 标准支持

affine_transform 除了支持 NumPy 外,还对符合 Python Array API 标准的后端提供实验性支持。请考虑通过设置环境变量 SCIPY_ARRAY_API=1 并提供 CuPy、PyTorch、JAX 或 Dask 数组作为数组参数来测试这些功能。支持以下后端与设备(或其他功能)的组合。

CPU

GPU

NumPy

不适用

CuPy

不适用

PyTorch

JAX

⚠️ 无 JIT

Dask

⚠️ 计算图

不适用

有关更多信息,请参阅 对数组 API 标准的支持

参考文献

示例

使用 affine_transform 拉伸图像

>>> from scipy.ndimage import affine_transform
>>> from scipy.datasets import face
>>> from matplotlib import pyplot as plt
>>> import numpy as np
>>> im = face(gray=True)
>>> matrix = (0.5, 2)
>>> im2 = affine_transform(im, matrix)
>>> plt.imshow(im2)
>>> plt.show()
../../_images/scipy-ndimage-affine_transform-1_00_00.png

将图像旋转 90 度并投影到扩大的画布上

>>> matrix = ((0, 1), (1, 0))
>>> im3 = affine_transform(im, matrix, output_shape=(1024, 1024))
>>> plt.imshow(im3)
>>> plt.show()
../../_images/scipy-ndimage-affine_transform-1_01_00.png

偏移旋转,使图像居中

>>> output_shape = (1200, 1200)
>>> offset = (np.array(im.shape) - output_shape) / 2
>>> im4 = affine_transform(im, matrix, offset=offset, output_shape=output_shape)
>>> plt.imshow(im4)
>>> plt.show()
../../_images/scipy-ndimage-affine_transform-1_02_00.png