Ceci est une suite de Se débarrasser des images DICOM avec Python. Les informations datent de septembre 2017.
PyDicom semble maintenant avoir une version de 1.0.0a1 une fois téléchargé depuis github.
_versions.py
"""Pure python package for DICOM medical file reading and writing."""
__version__ = '1.0.0a1'
__version_info__ = (1, 0, 0, 'alpha', 0)
Cependant, il semble que pydicom qui peut être installé avec conda-forge ou PyPI soit toujours 0.9.9. Comme il y a eu plusieurs changements depuis la version 1.0, il y a un chapitre appelé Transition vers pydicom 1.x dans le document. Pour le moment, je créerai cette page conformément à la version 0.9.9.
Dans Se débarrasser des images DICOM avec Python j'ai écrit plus tôt, [DICOM Image Library] d'Osirix (http: //) est la source d'échantillons d'images DICOM. J'ai présenté www.osirix-viewer.com/resources/dicom-image-library/), mais maintenant il semble que seuls les utilisateurs d'Osirix puissent y accéder.
Pour cette raison, je voudrais vous présenter les deux sources suivantes pour obtenir des échantillons d'images DICOM.
Pour les en-têtes DICOM que vous connaissez, vous pouvez les afficher comme suit: Quelle modalité cette image est-elle prise? Il est affiché.
import dicom
dcm = dicom.read_file('CT_small.dcm')
print(dcm.Modality)
De plus, si vous souhaitez simplement tout afficher sous forme de texte, vous n'avez rien à faire.
import dicom
dcm = dicom.read_file('CT_small.dcm')
print(dcm)
Alors que faire si vous voulez imprimer tous les en-têtes (mais pas les images) comme ceci `` print (dcm) ''? Alors, j'ai essayé de chasser un peu le code source.
Ensuite, il y avait un indice dans pydicom / dataelem.py.
dataelem.py
def __str__(self):
"""Return str representation of the element."""
repVal = self.repval
if self.showVR:
s = "%s %-*s %s: %s" % (str(self.tag), self.descripWidth,
self.description()[:self.descripWidth],
self.VR, repVal)
else:
s = "%s %-*s %s" % (str(self.tag), self.descripWidth,
self.description()[:self.descripWidth], repVal)
return s
Apparemment, la propriété `` showVR '' indique-t-elle le type de données de l'en-tête DICOM? Il semble que ce soit un drapeau de.
Quel genre de VR existe-t-il? C'est parce que vous devez absolument consulter les Spécifications DICOM.
Dans cet esprit, si vous appuyez simplement sur __str__ () '' de
dataelem.py '', toutes les balises de métadonnées, noms, types et affichages seront répertoriés dans .append () Il semble que vous pouvez obtenir toutes les données en faisant quelque chose comme ça.
import dicom
dcm = dicom.read_file('CT_small.dcm')
dcm_header_list = []
for data_element in dcm:
dcm_header = '{0}\t{1}\t{2}\n'.format(str(data_element.tag),
data_element.name,
data_element.repval)
dcm_header_list.append(dcm_header)
Comme décrit dans Se débarrasser des images DICOM avec Python, vous pouvez combiner des tranches pour créer des données 3D. Les données d'image des fichiers DICOM peuvent être extraites de pixel_array sous la forme d'un tableau numpy.
import os
import dicom
import numpy as np
dcm_list = []
for root_d, _, files in os.walk('BRAINIX'):
for f in files:
_, ext = os.path.splitext(f)
if ext == '.dcm':
dcm_list.append(os.path.join(root_d, f))
ref_dcm = dicom.read_file(dcm_list[0])
width = ref_dcm.Columns
height = ref_dcm.Rows
depth = len(ref_dcm)
img3d = np.zeros((depth, height, width),
dtype = ref_dcm.pixel_array.dtype)
for dcm_file in dcm_list:
idx = dcm_list.index(dcm_file)
dcm = dicom.read_file(dcm_file)
img3d[idx, :, :] = dcm.pixel_array()
En conséquence, les données d'image DICOM sont stockées dans un tableau tridimensionnel appelé img3d. Afin de visualiser cela, il est converti en une image bidimensionnelle en utilisant une méthode appelée MIP (Maximum Intensity Projection) ou MinIP (Minimum Intensity Projection).
Sur quel axe souhaitez-vous créer une image de la section transversale des données d'image en trois dimensions? Et quel axe de pixels doit être utilisé comme valeur représentative lors de la création d'une image bidimensionnelle le long de cet axe? Cela étant dit, MIP utilise le pixel avec la luminosité la plus élevée comme valeur représentative, et MinIP utilise le pixel avec la luminosité la plus faible comme valeur représentative.
De plus, quelle section transversale doit être utilisée pour le corps humain? Pour cela, chaque section a un nom. Article Wikipédia: Anatomical_plane
Que vous utilisiez la valeur maximale ou la valeur minimale, vous pourrez utiliser le tableau numpy à partir d'ici.
#Omission
max0 = np.nanmax(img3d, axis=0)
max1 = np.nanmax(img3d, axis=1)
max2 = np.nanmax(img3d, axis=2)
Dans le cas de cette image IRM BRAINIX, axis = 0
correspond au plan coronaire, donc max0 stocke l'image MIP du plan coronaire. Après cela, `matplotlib.imshow ()`
, im = Image.fromarray (max0)
in PIL, puis ```im.show () `` Je pense que ça va.
Si la section transversale de l'image d'origine est axiale, coronale ou sagittale semble devoir être jugée à partir de l'image d'origine, mais si vous créez un tableau en trois dimensions comme `` img3d``` de cette manière, à partir de quelle coupe transversale Il sera également possible de découper.
En général, la TDM est imagée sur un plan axial, donc je pense qu'elle est tridimensionnelle [axiale, coronale, sagittale].
J'ai écrit la suite de Se débarrasser des images DICOM avec Python.
Recommended Posts