计算机视觉中,我们经常使用医学图像,我们拥有的几乎所有数据库都包含 DICOM 图像。Dicom 图像不仅仅是一张图像,它包含像素信息、患者信息等。

在这种情况下,我们只需要将图像可视化或将其保存为 JPG 或 PNG,以便我们可以使用任何我们想要的软件打开它。

为此,我们需要额外的库来与 Python 一起使用。第一个是Pydicom,它是一个专门用于 Dicom 图像的库,第二个是Pillow,我更喜欢用它来显示和保存 JPG 图像。最后,第三个是Numpy来操作数组。

我会一步一步地和你一起做所有的过程,所以不要担心。以下是我们将一起遵循的步骤:

  • 安装库
  • 提取像素数组
  • 重新缩放图像
  • 显示和保存新图像

1.安装库

正如我们所说,我们需要两个库来完成这个过程,安装它们是非常重要的。您可以通过输入以下命令来使用终端:

pip install pydicom
pip install pillow
pip install numpy

2.提取像素数组

你知道一张 Dicom 图像包含很多关于患者的信息……所以我们要显示或提取的图像是 Dicom 图像中存在的信息之一。这个图像称为“像素阵列”。为此,我们需要做的就是从图像中调用这个组件。

ds = pydicom.dcmread('the path to the image')
new_image = ds.pixel_array.astype(float)

如您所见,我们用两行代码来完成这项工作。第一行打开 Dicom 图像,第二行将从中提取像素阵列,这就是这部分的内容。通过astype函数将数据类型转为float类型。我这样做是因为在下一步中我们将缩放像素,所以如果我们将它们保留为整数,那么在缩放之后我们将有上溢或下溢可能。为此,我们需要使用浮点像素,这样我们就不会丢失信息。

3.重新缩放图像

现在要使用图像,我们应该重新调整其像素并将它们的值设置在0和255之间。

scaled_image = (np.maximum(new_image, 0) / new_image.max()) * 255.0

4.显示和保存图像

我们将使用 Pillow 库创建图像。但在此之前,我们需要将其转换为8 位无符号整数。

scaled_image = np.uint8(scaled_image)
final_image = Image.fromarray(scaled_image)

要显示它,您可以使用这行代码:

final_image.show()

现在,如果您想将其保存为 jpg 或 png 图像。您可以使用 Pillow 中的save函数。

final_image.save('image.jpg')
final_image.save('image.png')

5.如何将一组 Dicom 图像转换为 JPG

现在,您看到了如何将一张 Dicom 图像转换为 JPG 或 PNG。您可以应用相同的程序来转换一组 Dicom 图像。您需要做的就是创建函数。第一个将返回文件夹中图像的名称,第二个将像我们之前所做的那样进行转换。

import os
import numpy as np
import pydicom
from PIL import Image

def get_names(path):
    names = []
    for root, dirnames, filenames in os.walk(path):
        for filename in filenames:
            _, ext = os.path.splitext(filename)
            if ext in ['.dcm']:
                names.append(filename)
    
    return names

def convert_dcm_jpg(name):
    
    im = pydicom.dcmread('Database/'+name)

    im = im.pixel_array.astype(float)

    rescaled_image = (np.maximum(im,0)/im.max())*255 # float pixels
    final_image = np.uint8(rescaled_image) # integers pixels

    final_image = Image.fromarray(final_image)

    return final_image

if __name__ == '__main__':
	names = get_names('Database')
	for name in names:
	    image = convert_dcm_jpg(name)
	    image.save(name+'.png')

参考目录

https://pycad.co/how-to-convert-a-dicom-image-into-jpg-or-png/

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐