灰度像素阵列从DICOM到RGB-imag的转换

2024-03-29 01:46:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在读DICOM灰度图像文件

gray = dicom.dcmread(file).pixel_array

我有(x,y)形状,但我需要RGB(x,y,3)形状

我试着用CV转换

img = cv2.cvtColor(gray, cv2.COLOR_GRAY2RGB)

为了测试,我把它写到文件cv2.imwrite('dcm.png', img)

我有一个极端黑暗的图像输出,这是错误的,什么是正确的方式,转换pydicom图像到RGB?在


Tags: 图像img图像文件rgbarraycv2cv灰度
2条回答

为了回答你的问题,你需要提供更多的信息,并且更加清晰。在

首先你想做什么?你想在内存中只得到一个(x,y,3)数组吗?或者你想把dicom文件转换成一个.png文件。。。它们是完全不同的东西。在

第二,你的dicom图像是什么样的?在

它很可能是一个16位的灰度图像(除非是超声波或是nuc-med),这意味着数据是16位的,这意味着上面的gray数组是16位数据。在

所以首先要了解的是窗口调平以及如何以8位显示16位图像。看看这里:http://www.upstate.edu/radiology/education/rsna/intro/display.php。在

如果它是一个16位的图像,如果你想以rgb格式的灰度图像来查看,那么你需要知道你正在使用或需要的窗口级别,并在保存之前进行适当的调整。在

第三,就像lenik提到的above,在使用之前,您需要将dicom的斜率/截距值应用于像素数据。在


如果您的问题只是为rgb创建一个额外维度的新数组(因此大小(r,c)到(r,c,3)),那么这很简单

# 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]

这将给你第三维度。但是这些值仍然是16位的,而不是8位,如果您希望它是RGB的话。(假设使用dcmread读取的图像是CT、MR或等效的16位dicom,那么数据类型很可能是uint16)。在

如果您希望它是RGB,那么您需要将值从16位转换为8位。为此,您需要确定一个窗口/级别,并应用它从整个16位数据范围中选择8位值。在


可能上面的问题-I've got extremely dark image on output which is wrong-实际上是正确的,但它是暗的,因为默认情况下使用的窗口/级别cv使其“看起来”暗,或者它是正确的,但没有应用斜率/截距。在


如果您想将dicom转换成png(或jpg),那么您可能应该使用PIL或{},而不是{}。这两种方法都提供了保存16位2D数组的简单方法(在上面的代码中,'gray'就是这样),这两种方法都允许您在保存为png或jpg时指定窗口和级别。CV是完全超量的(意味着加载更大/更慢,以及更高的学习曲线)。在

一些使用matplotlib的pseudo代码。你需要调整的vmin/vmax值-这里的值对于CT图像来说差不多可以。在

^{pr2}$

这将保存一个png版本,但也绘制了轴。要保存为不带轴和空白的图像,请使用以下命令:

^{3}$

阅读DICOM文件的完整教程在这里:https://www.kaggle.com/gzuidhof/full-preprocessing-tutorial

基本上,您必须从DICOM文件中提取参数slope和{},并计算每个像素:hu = pixel_value * slope + intercept所有这些都在教程的代码示例和图片中解释过。在

相关问题 更多 >