Se débarrasser des images DICOM avec Python Partie 2

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.

Obtenir un exemple d'image DICOM

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.

Afficher tous les en-têtes 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)

Créer une image MIP à partir de données d'image 3D

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].


Résumé

J'ai écrit la suite de Se débarrasser des images DICOM avec Python.

Recommended Posts

Se débarrasser des images DICOM avec Python Partie 2
Débarrassez-vous des images DICOM en Python
Manipulation des pixels d'image en Python
Travailler avec des images DICOM en Python
Exemple d'obtention du nom du module et du nom de la classe en Python
Images en bordure avec python Partie 1
Encodage base64 des images en Python 3
Jugement d'équivalence d'objet en Python
UI Automation Partie 2 en Python
Accélérer le chargement des images Python
Implémentation du tri rapide en Python
Obtenir des éléments de liste en Python
Principes de base de Python x SIG (1)
Affichez des images DICOM avec Python rudimentaire en tant que professionnel de la santé
Reconnaissance des nombres dans les images avec Python
Principes de base de Python x SIG (3)
Obtenir l'API arXiv en Python
Comment collecter des images en Python
Diviser timedelta dans la série Python 2.7
Échappement automatique des paramètres MySQL en python
Gestion des fichiers JSON en Python
Affichage de la forme d'onde audio en Python
Premiers pas avec Python Bases de Python
Extraire du texte d'images avec Python
Principes de base de Python x SIG (partie 2)
La loi des nombres en python
Implémentation du tri original en Python
Brouillage réversible d'entiers en Python
Envelopper (partie de) la bibliothèque AtCoder en Cython pour une utilisation en Python
Conversion de la chaîne <-> date (date, datetime) en Python
Création d'interface graphique en python à l'aide de tkinter partie 1
Modulation et démodulation AM avec Python Partie 2
Pratique d'utilisation de ceci en Python (mauvais)
Théorie générale de la relativité en Python: Introduction
Appliquer diverses formes de mosaïques aux images (Python, OpenCV)
Arborescence de sortie des fichiers en Python
Afficher une liste d'alphabets en Python 3
Comparaison des modules de conversion japonais en Python3
Implémenter une partie du processus en C ++
Résumé de diverses instructions for en Python
Le résultat de l'installation de python sur Anaconda
Modèles Gang of Four (GoF) en Python
Télécharger des images à partir de la liste d'URL en Python
Principes de base pour exécuter NoxPlayer en Python
Je veux colorer une partie de la chaîne Excel avec Python
Remplacement en bloc des chaînes dans les tableaux Python
Projet Euler # 16 "Somme des pouvoirs" en Python
Traffic Safety-kun: Reconnaissance des panneaux de signalisation en Python
Résumé des méthodes intégrées, etc. de la liste Python
Utilisation d'opérateurs non logiques de ou en python
À la recherche du FizzBuzz le plus rapide en Python
Exemple pratique d'architecture hexagonale en Python
J'ai essayé de refactoriser le code du modèle publié dans "Obtenir des images de l'API Flickr avec Python" (Partie 2)
Projet Euler # 17 "Nombre de caractères" en Python
Equation de mouvement à double pendule en python
Lire des caractères dans des images avec Python OCR
Statut de chaque système de traitement Python en 2020
Projet Euler # 1 "Multiple de 3 et 5" en Python