Convierta una imagen en formato dicom médico a una salida en formato jpg (python)

Listo para trabajar

  • 1. Descarga python
  • 2. Descarga pycharm
  • 3. Configure la ruta del archivo .script en el directorio de python al entorno del sistema PATH, reinicie y podrá usar el comando pip
  • 4. Use la herramienta de administración de paquetes anaconda para instalar simpleITK, cv2, pydiocm (el maestro 5 me dijo: use el pip de conda para instalar un paquete, que se actualiza automáticamente desde el sitio web oficial, y también puedo especificar el número de versión)
  • E:\>CD conda
    E:\conda>pip install opencv-python
    E:\conda>pip install simoleITK
    E:\conda>pip install pydicom

     Si la instalación falla directamente con pip, puede reemplazar el espejo

  • 5. Utilice el comando pip para instalar la fuente de espejo Tsinghua:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pydicom

 

 Importar imágenes dicom, generar imágenes jpg

1. Ingrese pycharm, cree un nuevo proyecto PY01, el directorio es E: \ pythontrain \ py01,

  • 2. Cree un nuevo archivo hello2.py e ingrese el código en el archivo hello2.py:

  • 3. Al mismo tiempo, importe una imagen dicom que debe procesarse en la carpeta del proyecto, lo que importé aquí es 15092560.dcm

  • 4. Ingrese el siguiente código en el archivo hello2.py, el propósito es leer en la imagen y obtener la información de metadatos de datos de la imagen dicom importada:
import pydicom
import os

info = {}
# 读取dicom文件
dcm = pydicom.read_file("15092560.dcm")
# 通过字典关键字来获取图像的数据元信息(当然也可以根据TAG号)
# 这里获取几种常用信息
info["PatientID"] = dcm.PatientID               # 患者ID
info["PatientName"] = dcm.PatientName           # 患者姓名
info["PatientAge"] = dcm.PatientAge             # 患者年龄
info['PatientSex'] = dcm.PatientSex             # 患者性别
info['StudyID'] = dcm.StudyID                   # 检查ID
info['StudyDate'] = dcm.StudyDate               # 检查日期
info['StudyTime'] = dcm.StudyTime               # 检查时间
info['InstitutionName'] = dcm.InstitutionName   # 机构名称
info['Manufacturer'] = dcm.Manufacturer         # 设备制造商
info['StudyDescription']=dcm.StudyDescription   # 检查项目描述

print(info)

  •  5. Ejecute el código, el resultado es el siguiente, lea la identificación del paciente, el nombre, la edad y otros elementos de datos:
C:\Users\Administrator\AppData\Local\Programs\Python\Python38\python.exe E:/pythontrain/py01/hello2.py
{'PatientID': 'MCS10002', 'PatientName': 'S400_典型儿童体部', 'PatientAge': '016Y', 'PatientSex': 'M', 'StudyID': 'P101123', 'StudyDate': '20200119', 'StudyTime': '095310', 'InstitutionName': '安科影像中心', 'Manufacturer': 'Anke', 'StudyDescription': 'S400典型_儿科_体部(Child)'}

Process finished with exit code 0

La relación entre el almacenamiento de bits de datos (BitsStored), la asignación de bits de datos (BitsAllocated), el tipo de símbolo de datos (PixelRepresentation), el desplazamiento de escala de grises (RescaleIntercept) y el valor de los datos (PixelData) en sí:

( 1) BitsAllocated : Es el número de bits correspondiente al número de bytes asignados a cada píxel. Por ejemplo, un solo byte es 8 y dos bytes son 16 ....... Leer los datos dicom y almacenarlos en la memoria de la computadora Es mejor utilizar el tipo de datos BitsAllocated correspondiente, como short o unsigned short cuando BitsAllocated = 16

(2) PixelRepresentation: es el tipo de almacenamiento de los datos, 0 representa almacenamiento sin firmar, 1 representa almacenamiento firmado;

(3) BitsStored: en archivos dicom, BitsStored es el bit de almacenamiento efectivo en BitsAllocated. Si PixelRepresentation = 1 (almacenamiento firmado), entonces el bit HighBit de BitsStored es el bit de signo. Por ejemplo, cuando BitsStored = 12 y HighBit = 11, significa que el bit más alto en el bit de almacenamiento válido (BitsStored) es el bit de signo. En este momento, los datos representan el rango Es -2048 (es decir, 2 ^ 11) ~ 2043 (es decir, 2 ^ 11-1);

(4) RescaleIntercept: se utiliza para obtener el valor de gris de salida, es decir, el resultado de agregar RescaleIntercept al valor de PixelData de cada píxel. Por ejemplo, el nivel de gris de un píxel en una imagen es 1024 y el desplazamiento RescaleIntercept = -1024, entonces la salida correspondiente del píxel es 1024 + (- 1024) = 0;

(5) .Se puede ver en (3) y (4) que el signo o no firmado almacenado en la imagen no puede determinar el positivo o negativo de la escala de grises de salida de la imagen , sino que está determinado por el resultado de la adición de RescaleIntercept y PixelData. Por ejemplo, en una imagen almacenada sin un signo, el nivel de gris de un determinado píxel es 255, pero el desplazamiento RescaleIntercept = -1024, luego el nivel de gris de salida = 255-1024 = -769;

(6). De (3) y (4), se puede ver que el tipo de datos de la escala de grises de salida de la imagen no es necesariamente el mismo que el ancho de bits asignado . Por ejemplo, BitsAllocated = 8, la escala de grises máxima es 255. Si el desplazamiento es -2048, entonces la salida La escala de grises es 1793 y se debe usar el tipo corto para guardarlo.


  • 8. Convierta una imagen en formato dicom a una imagen en formato jpg
import pydicom
import matplotlib.pyplot as plt
import numpy as np
import os

filename = "test.dcm"
jpgname = "test.jpg"
# 读取dicom文件
dcm = pydicom.read_file("15092560.dcm")
# 获取图像唯一标识符UID
uid = dcm.SOPInstanceUID
# 获取像素矩阵
img_arr = dcm.pixel_array
# 打印矩阵大小
print(img_arr.shape)
# 获取像素点个数
lens = img_arr.shape[0]*img_arr.shape[1]
# 获取像素点的最大值和最小值
arr_temp = np.reshape(img_arr,(lens,))
max_val = max(arr_temp)
min_val = min(arr_temp)
# 图像归一化
img_arr = (img_arr-min_val)/(max_val-min_val)
# 绘制图像并保存
plt.figure(figsize=(12,12),dpi=250) # 图像大小可以根据文件不同进行设置
plt.imshow(img_arr,cmap=plt.cm.bone)
plt.title("UID:{}".format(uid))
plt.savefig(jpgname)
plt.close()

Ejecute el código, el resultado es el siguiente, se genera el tamaño de la matriz de imagen .dcm y la imagen en formato dicom se convierte en una imagen en formato jpg:

9. Analizar la imagen jpg y procesarla con la biblioteca cv

import cv2
from PIL import Image
import numpy as np
from skimage.io import  imread

filepath = 'test.jpg'

cv2_im = cv2.imread(filepath)
print('cv2_im shape ',cv2_im.shape) # (height, width, ch)

im = Image.open(filepath)
print('PIL image size', im.size) # (width, height, ch)
pil_im = np.asarray(im)
print('pil_im shape ',pil_im.shape) # (height, width, ch)

sk_im = imread(filepath)
print('sk_im shape', sk_im.shape) # (height, width, ch)

Ejecute el resultado, genere la salida de .jpg:

(Información correspondiente: frame_num, width, height) Parámetros de frame: frame_num, que representa el número de capas de tomografía computarizada.

Supongo que te gusta

Origin blog.csdn.net/luoyir1997/article/details/108033440
Recomendado
Clasificación