<p>为了回答你的问题,你需要提供更多的信息,并且更加清晰。在</p>
<p>首先你想做什么?你想在内存中只得到一个(x,y,3)数组吗?或者你想把dicom文件转换成一个.png文件。。。它们是完全不同的东西。在</p>
<p>第二,你的dicom图像是什么样的?在</p>
<p>它很可能是一个16位的灰度图像(除非是超声波或是nuc-med),这意味着数据是16位的,这意味着上面的<code>gray</code>数组是16位数据。在</p>
<p>所以首先要了解的是窗口调平以及如何以8位显示16位图像。看看这里:<a href="http://www.upstate.edu/radiology/education/rsna/intro/display.php" rel="nofollow noreferrer">http://www.upstate.edu/radiology/education/rsna/intro/display.php</a>。在</p>
<p>如果它是一个16位的图像,如果你想以rgb格式的灰度图像来查看,那么你需要知道你正在使用或需要的窗口级别,并在保存之前进行适当的调整。在</p>
<p>第三,就像lenik提到的<a href="https://stackoverflow.com/a/58851356/9423009">above</a>,在使用之前,您需要将dicom的斜率/截距值应用于像素数据。在</p>
<hr/>
<p>如果您的问题只是为rgb创建一个额外维度的新数组(因此大小(r,c)到(r,c,3)),那么这很简单</p>
<pre><code># orig is your read in dcmread 2D array:
r, c = orig.shape
new = np.empty((w, h, 3), dtype=orig.dtype)
new[:,:,2] = new[:,:,1] = new[:,:,0] = orig
# or with broadcasting
new[:,:,:] = orig[:,:, np.newaxis]
</code></pre>
<p>这将给你第三维度。但是这些值仍然是16位的,而不是8位,如果您希望它是RGB的话。(假设使用dcmread读取的图像是CT、MR或等效的16位dicom,那么数据类型很可能是uint16)。在</p>
<p>如果您希望它是RGB,那么您需要将值从16位转换为8位。为此,您需要确定一个窗口/级别,并应用它从整个16位数据范围中选择8位值。在</p>
<hr/>
<p>可能上面的问题-<code>I've got extremely dark image on output which is wrong</code>-实际上是正确的,但它是暗的,因为默认情况下使用的窗口/级别cv使其“看起来”暗,或者它是正确的,但没有应用斜率/截距。在</p>
<hr/>
<p>如果您想将dicom转换成png(或jpg),那么您可能应该使用<code>PIL</code>或{<cd4>},而不是{<cd5>}。这两种方法都提供了保存16位2D数组的简单方法(在上面的代码中,'<code>gray</code>'就是这样),这两种方法都允许您在保存为png或jpg时指定窗口和级别。CV是完全超量的(意味着加载更大/更慢,以及更高的学习曲线)。在</p>
<p>一些使用matplotlib的pseudo代码。你需要调整的vmin/vmax值-这里的值对于CT图像来说差不多可以。在</p>
^{pr2}$
<p>这将保存一个png版本,但也绘制了轴。要保存为不带轴和空白的图像,请使用以下命令:</p>
^{3}$