从NumPy数组到DICOM

3

我的代码读取DICOM文件,将像素信息转换为numpy数组,然后修改numpy数组。它使用列表,因为我正在尝试同时操作多个DICOM文件。 我还没有找到任何关于如何将修改后的numpy数组重新变成DICOM文件的信息,以便我可以在Python之外使用它。

#IMPORT
import cv2
import numpy as np
from matplotlib import pyplot as plt
import matplotlib.pyplot as plt
import SimpleITK as sitk  
from glob import glob
import pydicom as dicom

data_path = "C:\\Users\\oliva\\Desktop\\Py tesis\\dicom\\"
output_path = working_path = "C:\\Users\\oliva\\Desktop\\Py tesis\\dicom1\\"
path = glob(data_path + '/*.dcm')

#Checks if we are in the correct path
print ("Total of %d DICOM images.\nFirst 5 filenames:" % len(path))
print ('\n'.join(path[:14]))

data_set = []
for element in path:
    imagen=sitk.ReadImage(element) 
    #imagen = cv2.imread(element)
    array_imagen = sitk.GetArrayViewFromImage(imagen)
    array2_imagen=array_imagen[0] 
    imagen_array_norm = np.uint8(cv2.normalize(array2_imagen, None, 0, 255, cv2.NORM_MINMAX))
    data_set.append(imagen_array_norm)     
#Check
print(len(data_set))    
print(type(data_set[1]))
plt.imshow(data_set[4], cmap=plt.cm.gray)


#Equalization
data_set_eq = equal(data_set)
print(len(data_set_eq))    
print(type(data_set_eq[6]))
plt.imshow(data_set_eq[7], cmap=plt.cm.gray)

#Filtering
data_set_m = median(data_set)
print(len(data_set_m))    
print(type(data_set_m[6]))
plt.imshow(data_set_m[8], cmap=plt.cm.gray)




#Functions
def equal(data):
    data_set_eq = []
    for element in data_set:
    imagen_array_eq = cv2.equalizeHist(element)
    data_set_eq.append(imagen_array_eq)
    return data_set_eq

def median(data):
    data_set_m = []
    for element in data_set:
        imagen_array_m =cv2.medianBlur(element,5)
        data_set_m.append(imagen_array_m)
    return data_set_m

我希望您能指导我如何从我修改后的numpy数组中生成DICOM文件。
1个回答

2
您可以将numpy数组转换回SimpleITK图像,然后将其写成Dicom格式。代码应该类似于以下内容:

您可以将numpy数组转换回SimpleITK图像,然后将其写成Dicom格式。代码应该类似于以下内容:

for x in data_set:
    img = sitk.GetImageFromArray(x)
    sitk.WriteImage(img, "your_image_name_here.dcm")

从文件名后缀,SimpleITK 知道如何写入 Dicom。

请注意,您正在进行的过滤可以在 SimpleITK 中完成。您不需要真正使用 OpenCV。请查看以下 SimpleITK 过滤器:IntensityWindowingImageFilter、AdaptiveHistogramEqualizationFilter 和 MedianImageFilter。

https://itk.org/SimpleITKDoxygen/html/classitk_1_1simple_1_1IntensityWindowingImageFilter.html https://itk.org/SimpleITKDoxygen/html/classitk_1_1simple_1_1AdaptiveHistogramEqualizationImageFilter.html https://itk.org/SimpleITKDoxygen/html/classitk_1_1simple_1_1MedianImageFilter.html


2
如果出现以下错误,请使用.astype('uint16')进行转换,这将完美解决问题。 itk::ERROR: GDCMImageIO(00000180CCE9B010): 传递了浮点缓冲区,但未指定存储的像素类型。目前不支持此操作 - Max Kuchenkiller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接