当前位置:   article > 正文

Python实现医学影像DICOM批量转换_python 多个文件dicom转换成jpg

python 多个文件dicom转换成jpg

现如今针对医学核磁共振MR影像的研究越来越多,但由于各种原因,从各个医院收集原始患者核磁共振影像BMP文件的难度非常大。而患者的原始DICOM文件相较MR文件更易收集,所以我们提出使用Python实现DICOM批量转换为jpg、png图像。

1.安装库

  1. pip install numpy
  2. pip install cv2
  3. pip install simpleitk
  4. pip install os

2.定义一个DICOM转JPG的函数

该函数读取图像的像素值信息,并转换为数组形式,在归一化、转换至0-255像素值区间内之后重新转换为三通道的RGB图。

  1. # 定义dicom to jpg转换函数
  2. def dicom2jpg(img, low_window, high_window, save_path):
  3. """
  4. :param img: dicom图像的像素值信息
  5. :param low_window: dicom图像像素值的最低值
  6. :param high_window: dicom图像像素值的最高值
  7. :param save_path: 新生成的jpg图片的保存路径
  8. :return:
  9. """
  10. oldimg = np.array([low_window * 1., high_window * 1.]) # 将像素值转换为array
  11. newimg = (img - oldimg[0]) / (oldimg[1] - oldimg[0]) # 将像素值归一化0-1
  12. newimg = (newimg * 255).astype('uint8') # 再转换至0-255,且将编码方式由原来的unit16转换为unit8
  13. # 将单通道转换成三通道
  14. img_out = np.zeros([newimg.shape[0], newimg.shape[1], 3])
  15. img_out[:, :, 0] = newimg
  16. img_out[:, :, 1] = newimg
  17. img_out[:, :, 2] = newimg
  18. # 用cv2写入图像指令,保存jpg即可
  19. cv2.imwrite(save_path, img_out, [int(cv2.IMWRITE_JPEG_QUALITY), 100])

3.批量转换

我们假设目标影像文件是存放在三级文件夹中,当然二级文件夹和更多级的文件夹思路相同。

我们首先需要输入影像文件存储的文件夹。

 input_root = r'C:\Users\ediso\Desktop\shizhuang\shizhuang'

 并输入想要转入的目标文件夹。

output_root = r'C:\Users\ediso\Desktop\out'

接着便可以实现DICOM文件的批量转换了。

  1. if __name__ == '__main__':
  2. input_root = r'C:\Users\ediso\Desktop\shizhuang\shizhuang'
  3. dir_list = os.listdir(input_root) # 打开文件夹中的图像的文件名,作为列表返回
  4. output_root = r'C:\Users\ediso\Desktop\out'
  5. if not os.path.exists(output_root):
  6. os.makedirs(output_root)
  7. # 开始遍历日期文件夹下的每个子文件夹
  8. print('The 1th class dir ' + str(input_root) + ' have ' + str(len(dir_list)) + ' files' + '*' * 50)
  9. for _dir in dir_list:
  10. if _dir != 'VERSION':
  11. dir_in1_path = os.path.join(input_root, _dir)
  12. dir_out1_path = os.path.join(output_root, _dir)
  13. if not os.path.exists(dir_out1_path):
  14. os.makedirs(dir_out1_path)
  15. dir_in2_path_list = os.listdir(dir_in1_path)
  16. print('The 2th class dir '+str(_dir)+' have ' + str(len(dir_in2_path_list))+' files'+'*'*50)
  17. # debug 使用
  18. j = 1
  19. for i in dir_in2_path_list:
  20. if i != 'VERSION':
  21. document = os.path.join(dir_in1_path, i)
  22. # countname = str(count) # 将设置的变量数字1,转换为字符串,作为名称使用
  23. countfullname = _dir + '-' +str(j) + '.jpg'
  24. output_jpg_path = os.path.join(dir_out1_path, countfullname) # 设置保存每张图片的路径
  25. j = j+1
  26. image = sitk.ReadImage(document)
  27. img_array = sitk.GetArrayFromImage(image)
  28. img_array = np.squeeze(img_array, axis=0)
  29. high = np.max(img_array) # 找到最大的
  30. low = np.min(img_array)# 找到最小的
  31. print(str(_dir)+'/'+str(i)+' have max and min pixel are:'+str(high)+' and '+str(low))
  32. # 调用函数,开始转换
  33. dicom2jpg(img_array, low, high, output_jpg_path)
  34. # count += 1 # 为下一张图像的名称作准备,加1变成2

4.完整代码

在完整代码中,我们为了防止整个程序因为某些未知问题报错添加了一个防报错机制。

  1. import numpy as np
  2. import cv2
  3. import os
  4. import SimpleITK as sitk
  5. # 定义dicom to jpg转换函数
  6. def dicom2jpg(img, low_window, high_window, save_path):
  7. """
  8. :param img: dicom图像的像素值信息
  9. :param low_window: dicom图像像素值的最低值
  10. :param high_window: dicom图像像素值的最高值
  11. :param save_path: 新生成的jpg图片的保存路径
  12. :return:
  13. """
  14. oldimg = np.array([low_window * 1., high_window * 1.]) # 将像素值转换为array
  15. newimg = (img - oldimg[0]) / (oldimg[1] - oldimg[0]) # 将像素值归一化0-1
  16. newimg = (newimg * 255).astype('uint8') # 再转换至0-255,且将编码方式由原来的unit16转换为unit8
  17. # 将单通道转换成三通道
  18. img_out = np.zeros([newimg.shape[0], newimg.shape[1], 3])
  19. img_out[:, :, 0] = newimg
  20. img_out[:, :, 1] = newimg
  21. img_out[:, :, 2] = newimg
  22. # 用cv2写入图像指令,保存jpg即可
  23. cv2.imwrite(save_path, img_out, [int(cv2.IMWRITE_JPEG_QUALITY), 100])
  24. if __name__ == '__main__':
  25. input_root = r'D:\DeepLearning\cervical\BianqueNet+\input\dicom\1'
  26. dir_list = os.listdir(input_root) # 打开文件夹中的图像的文件名,作为列表返回
  27. output_root = r'D:\DeepLearning\cervical\BianqueNet+\input\dicom_out'
  28. if not os.path.exists(output_root):
  29. os.makedirs(output_root)
  30. # 开始遍历日期文件夹下的每个子文件夹
  31. print('The 1th class dir ' + str(input_root) + ' have ' + str(len(dir_list)) + ' files' + '*' * 50)
  32. for _dir in dir_list:
  33. try:
  34. if _dir != 'VERSION' and _dir != '.DS_Store':
  35. dir_in1_path = os.path.join(input_root, _dir)
  36. dir_out1_path = os.path.join(output_root, _dir)
  37. if not os.path.exists(dir_out1_path):
  38. os.makedirs(dir_out1_path)
  39. dir_in2_path_list = os.listdir(dir_in1_path)
  40. print('The 2th class dir '+str(_dir)+' have ' + str(len(dir_in2_path_list))+' files'+'*'*50)
  41. # debug 使用
  42. j = 1
  43. for i in dir_in2_path_list:
  44. if i != 'VERSION'and i != '.DS_Store':
  45. document = os.path.join(dir_in1_path, i)
  46. # countname = str(count) # 将设置的变量数字1,转换为字符串,作为名称使用
  47. countfullname = _dir + '-' +str(j) + '.jpg'
  48. output_jpg_path = os.path.join(dir_out1_path, countfullname) # 设置保存每张图片的路径
  49. j = j+1
  50. image = sitk.ReadImage(document)
  51. img_array = sitk.GetArrayFromImage(image)
  52. img_array = np.squeeze(img_array, axis=0)
  53. high = np.max(img_array) # 找到最大的
  54. low = np.min(img_array)# 找到最小的
  55. print(str(_dir)+'/'+str(i)+' have max and min pixel are:'+str(high)+' and '+str(low))
  56. # 调用函数,开始转换
  57. dicom2jpg(img_array, low, high, output_jpg_path)
  58. except Exception as e:
  59. print("---------------------------------------------------------the conversion of " + str(
  60. document) + " is failed!")
  61. pass
  62. continue

github:https://github.com/tiebro/DICOM2JPG-PNG 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/289822
推荐阅读
相关标签
  

闽ICP备14008679号