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
逆坐标变换矩阵,将输出坐标映射到输入坐标。如果
ndim
是input
的维数,则给定矩阵必须具有以下形状之一:(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()
将图像旋转90度并投射到扩展画布上
>>> matrix = ((0, 1), (1, 0)) >>> im3 = affine_transform(im, matrix, output_shape=(1024, 1024)) >>> plt.imshow(im3) >>> plt.show()
偏移旋转以使图像居中
>>> 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()