在matplotlib中翻转图像

0 投票
2 回答
3757 浏览
提问于 2025-04-18 13:19

我在用matplotlib画图的时候,发现图像顺时针旋转了90度,这似乎是个常见的问题。所以我需要把它逆时针旋转90度,才能显示出我想要的图像。不过,当我尝试绘制数据的转置时,出现了一个错误提示,内容是“图像数据的维度无效”。我还试着把原点设置为下方,因为这似乎也是解决此类问题的一种方法,但这样只是把图像在x轴上翻转了。请问我该怎么解决这个问题?这是我的原始代码:

from dipy.reconst.dti import color_fa
cfa = color_fa(FA, tenfit.evecs)
cfa_img = nib.Nifti1Image(cfa.astype(np.float32), img.get_affine())
data_cfa = cfa_img.get_data()
import matplotlib.pyplot as plt
plt.figure('color_fa')
plt.imshow(data_cfa[:,:,6,:])
plt.show()

这段代码显示的是一张192x192的图像的第6个切片。

当我把imshow那一行改成:

plt.imshow(data_cfa[:,:,6,:].T)

我就收到了那个错误提示。

我对python和matplotlib还很陌生,所以任何帮助都非常感谢!

2 个回答

1

试试 scipy.ndimage.rotate 这个方法(下面有示例代码)。跟 .T 不同,后者会把所有的轴都交换(可以参考 @DrV 的回答),而 ndimage.rotate 是专门用来保持颜色信息不变的。它还可以处理任意角度的旋转(比如 31.4 度)。如果想看更多的例子,可以去看看这个链接:http://scipy-lectures.github.io/advanced/image_processing/#geometrical-transformations

data_cfa = rand(10,10,7,3)

plt.subplot(211)
plt.imshow(data_cfa[:,:,6,:])
plt.title('Original')

plt.subplot(212)
plt.imshow(ndimage.rotate(data_cfa[:,:,6,:], 90))
plt.title('Rotated by 90')

plt.show()
3

问题在于你正在尝试对一个三维的图像进行转置。你的图像的尺寸是 N x M x 3,也就是说它有 N 行、M 列和 3 个颜色通道。你想把它变成 M x N x 3 的数组,也就是旋转图像,但颜色通道要保持不变。

如果你使用 .T 方法,结果会得到一个 3 x M x N 的数组,这并不是你想要的。这就是出错的原因。

你应该用 .transpose(1,0,2) 来代替 .T。这样可以转置前两个维度,而第三个维度保持不变。现在图像就会按照你想要的方式旋转了:

plt.imshow(data_cfa[:,:,6,:].transpose(1,0,2))

想了解更多,可以查看 np.transpose 的文档:http://docs.scipy.org/doc/numpy/reference/generated/numpy.transpose.html

(如果你的图像是 N x M 的灰度图像,那么使用 .T 方法就是正确的选择。)

撰写回答