在numpy数组中以3个通道图像的堆栈获取并显示一个图像

时间:2018-01-26 00:47:02

标签: python image numpy matplotlib imshow

我有一堆图像。堆栈中的第一个看起来像这样:

enter image description here

import dicom as dc
dcm = dc.read_file('full_stack.dcm')
dcm = dcm.pixel_array
print type(dcm)
print dcm.shape

这给了我

<type 'numpy.ndarray'>

(3, 180, 480, 640)

所以看起来有:

  • 3个频道
  • 180张图片
  • 宽度为480
  • 身高是640

我的目标是在堆栈中提取图像。然后,我想显示该图像。听起来很简单。

这是我的策略。我想对此有任何想法/反馈:

1)获取一张图片。使用基本切片来获取堆栈中的第10个图像

dcm1 = dcm[0:, 10:11]
dcm1.shape
(3, 1, 480, 640)

2)要使用plt.imshow在pyplot中实际绘制它,我们需要这样的形状:(r,c,channels)。所以我猜想通过蛮力击败图像。

dcm2 = np.squeeze(dcm1, axis=1)  # throw away the '1'...this makes me nervous
print 'threw away the "1":              ', dcm2.shape
dcm3 = np.swapaxes(dcm2, 0,2)
print 'swapped the first and last dim:  ', dcm3.shape
dcm4 = np.swapaxes(dcm3, 0,1)
print 'swapped the first and second dim:', dcm4.shape

现在,我已经破坏了这张糟糕的形象:

threw away the "1":               (3, 480, 640)
swapped the first and last dim:   (640, 480, 3)
swapped the first and second dim: (480, 640, 3)

绘图的时间!什么可能去wrnog?

imgplot = plt.imshow(dcm4)

这是我得到的:

enter image description here

不知怎的,我的图像现在有各种颜色,看起来很糟糕。

我的问题在哪里开始 - 有谁知道发生了什么?显然,我的方法很简单,也不令人满意。但我不确定到底要去哪里。

额外的东西,可能不太相关

此时,我试图将频道缩减为一个,然后复制回三个,以便imshow可以阅读它,我会保存详细信息,但它给了我这个:

enter image description here

2 个答案:

答案 0 :(得分:1)

此解决方案适用于我。请验证输入数组中的值范围是.as-console-wrapper { max-height: 100% !important; top: 0; }范围还是0-255数据类型。仅仅尺寸不足以再现结果。例如,以下设置适用于我:

uint8

我得到的情节如下:

enter image description here

答案 1 :(得分:0)

我对dicom图像一无所知,我没有文件可以测试这个,但我认为一个简单的转置操作应该能够为你提供所需的输出

import numpy as np

a = np.random.rand(3,1,480,640)
b = np.transpose(a[:,0,:,:], axes=[1,2,0])
print (b.shape) # (480L, 640L, 3L)