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)[source]#

应用仿射变换。

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

这执行“拉取”(或“向后”)重采样,将输出空间转换到输入空间以定位数据。仿射变换通常以“推”(或“向前”)方向描述,将输入转换为输出。如果你有一个用于“推”变换的矩阵,请在此函数中使用它的逆矩阵 (numpy.linalg.inv)。

参数:
input类数组

输入数组。

matrixndarray

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

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

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

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

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

offset浮点数或序列,可选

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

output_shape整型元组,可选

形状元组。

output数组或数据类型,可选

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

order整型,可选

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

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

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。

prefilter布尔值,可选

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

返回:
affine_transformndarray

变换后的输入。

注意

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

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

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

1.6.0 版中新增:添加了复数值支持。

参考文献

示例

使用 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