Python的affine_transform不进行平移?

1 投票
1 回答
1633 浏览
提问于 2025-04-17 12:53

我有一张图片(保存为numpy数组),我想用一个变换矩阵来改变它。假设这个变换矩阵是:

[[  0.99729046  -0.07356456  22.57990962]
 [  0.07356456   0.99729046 -12.99879896]
 [  0.           0.           1.        ]]

我想通过 `scipy.ndimage.interpolation` 来实现这个变换。

image = affine_transform(image, matrix, mode="reflect")

如果我只是旋转它:

[[  0.99729046  -0.07356456 0.]
 [  0.07356456   0.99729046 0.]
 [  0.           0.         1.]]

效果很好,但是当我想同时旋转和移动它,或者只是移动它时,结果看起来就很奇怪。我不知道为什么 :S

原始图片:
http://img408.imageshack.us/img408/9373/eiffel.jpg

变换后的图片:
http://img861.imageshack.us/img861/8971/blatm.jpg

1 个回答

3

我觉得ndimage其实并不处理彩色图像。它把你数组的最后一个(3,)维度当作第三个空间维度来处理。

你提供的矩阵实际上只是旋转矩阵,而不是仿射矩阵。文档上对此似乎没有说明清楚。你应该通过offset参数传入位移向量。这个位移向量的第三个元素也包含了“颜色位移”。

同样的情况也适用于上面Travis Vaught评论中的shift方法。正确的写法是ndimage.shift(img, (10.0, 10.0, 0.0), mode="wrap")——当然,前提是你不想做一些奇怪的颜色位移。

原则上,你可以告诉ndimage不要在颜色轴上移动图像,但分别处理每个颜色元素应该会快一些。

撰写回答