首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scipy.ndimage.interpolate.affine_transform失败

scipy.ndimage.interpolate.affine_transform失败
EN

Stack Overflow用户
提问于 2016-10-15 15:19:23
回答 1查看 2.4K关注 0票数 3

此代码:

代码语言:javascript
复制
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]]))

在以下方面失败:

代码语言:javascript
复制
RuntimeError: affine matrix has wrong number of rows

矩阵有什么问题?我还尝试了matrix=[nzoom, nzoom],根据我对文档的阅读,它应该做同样的事情,而且它也以同样的方式失败。

EN

回答 1

Stack Overflow用户

发布于 2016-10-16 13:58:32

原始代码不能使用2x2矩阵的原因是因为所讨论的图像是三维的。请注意,第三维空间是[R,G,B],但scipy.ndimage并不知道非空间维度,它将所有维度视为空间维度。使用2x2矩阵的例子都是二维“灰色”图像。

解决方案#1:

affine_transform将输出坐标o映射到源(输入)坐标s,如:

代码语言:javascript
复制
s = numpy.dot(matrix,o) + offset

其中matrixoffsetaffine_transform的参数。在多通道图像的情况下,我们不想转换第三维空间。也就是说,我们需要与输出点对应的源坐标。

代码语言:javascript
复制
o == [x, y, z]  # column vector

成为

代码语言:javascript
复制
s == [c00*x + c01*y + dx, c10*x + c11*y + dy, z]  # column vector

为了达到这个结果,我们需要

代码语言:javascript
复制
matrix = [[ c00, c01,  0],
          [ c10, c11,  0],
          [   0,   0,  1]]

offset = [dx, dy, 0]  # column vector

解决方案2:

另一种解决方案是将RGB图像分割成3个通道,分别转换每个通道,并将它们组合在一起,

代码语言:javascript
复制
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))

我没有对这两种解决方案进行计时,但我预计第二种解决方案的速度会更慢。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40060786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档