我有一堆图像。堆栈中的第一个看起来像这样:
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)
所以看起来有:
大
我的目标是在堆栈中提取图像。然后,我想显示该图像。听起来很简单。
这是我的策略。我想对此有任何想法/反馈:
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)
这是我得到的:
不知怎的,我的图像现在有各种颜色,看起来很糟糕。
我的问题在哪里开始 - 有谁知道发生了什么?显然,我的方法很简单,也不令人满意。但我不确定到底要去哪里。
额外的东西,可能不太相关
此时,我试图将频道缩减为一个,然后复制回三个,以便imshow
可以阅读它,我会保存详细信息,但它给了我这个:
答案 0 :(得分:1)
此解决方案适用于我。请验证输入数组中的值范围是.as-console-wrapper { max-height: 100% !important; top: 0; }
范围还是0-255
数据类型。仅仅尺寸不足以再现结果。例如,以下设置适用于我:
uint8
我得到的情节如下:
答案 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)