Edu*_*rdo 3 python scipy affinetransform
这段代码:
from scipy.ndimage.interpolation import affine_transform
import numpy as np
...
nzoom = 1.2
newimage = affine_transform(self.image, matrix=np.array([[nzoom, 0],[0, nzoom]]))
Run Code Online (Sandbox Code Playgroud)
失败:
RuntimeError: affine matrix has wrong number of rows
Run Code Online (Sandbox Code Playgroud)
矩阵有什么问题?我也试过matrix=[nzoom, nzoom],根据我对文档的阅读应该做同样的事情,但它以同样的方式失败。
原始代码不适用于 2x2 矩阵的原因是所讨论的图像是 3 维的。请注意,第三维是[R,G,B],但scipy.ndimage不知道非空间维度;它将所有维度都视为空间维度。使用 2x2 矩阵的示例都是 2D“灰色”图像。
解决方案#1:
affine_transform将输出坐标映射o到源(输入)坐标s为:
s = numpy.dot(matrix,o) + offset
Run Code Online (Sandbox Code Playgroud)
其中matrix和offset是 的参数affine_transform。在多通道图像的情况下,我们不想转换第 3 维。即,我们想要一个输出点对应的源坐标
o == [x, y, z] # column vector
Run Code Online (Sandbox Code Playgroud)
成为
s == [c00*x + c01*y + dx, c10*x + c11*y + dy, z] # column vector
Run Code Online (Sandbox Code Playgroud)
为了达到这个结果,我们需要
matrix = [[ c00, c01, 0],
[ c10, c11, 0],
[ 0, 0, 1]]
offset = [dx, dy, 0] # column vector
Run Code Online (Sandbox Code Playgroud)
解决方案#2:
另一种解决方案是将 RGB 图像分成 3 个通道,分别变换每个通道,然后将它们组合在一起,
r = rgb[..., 0]
g = rgb[..., 1]
b = rgb[..., 2]
matrix = np.array([[c00, c01], [c10, c11]])
offset = [dx dy]
r = affine_transform(r, matrix=matrix, offset=offset)
g = affine_transform(g, matrix=matrix, offset=offset)
b = affine_transform(b, matrix=matrix, offset=offset)
rgb = np.dstack((r, g, b))
Run Code Online (Sandbox Code Playgroud)
我没有为任何一个解决方案计时,但我希望 #2 比 #1 慢。