在matplotlib中翻转图像
我在用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 个回答
试试 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()
问题在于你正在尝试对一个三维的图像进行转置。你的图像的尺寸是 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
方法就是正确的选择。)