DICOM-Bilder mit Python Part 2 entfernen

Dies ist eine Fortsetzung von DICOM-Bilder mit Python entfernen. Die Informationen sind ab September 2017.

PyDicom scheint jetzt eine Version von 1.0.0a1 zu haben, wenn es von github heruntergeladen wird.

_versions.py


"""Pure python package for DICOM medical file reading and writing."""

__version__ = '1.0.0a1'
__version_info__ = (1, 0, 0, 'alpha', 0)

Es scheint jedoch, dass Pydicom, das mit Conda-Forge oder PyPI installiert werden kann, immer noch 0,9,9 beträgt. Seit 1.0 und höher gibt es verschiedene Änderungen, daher enthält das Dokument auch ein Kapitel mit dem Namen Übergang zu pydicom 1.x. Vorerst werde ich diese Seite in Übereinstimmung mit 0.9.9 erstellen.

Holen Sie sich ein Beispiel-DICOM-Bild

In DICOM-Bilder mit Python entfernen, das ich zuvor geschrieben habe, ist Osirix '[DICOM-Bildbibliothek](http: //) die Quelle für DICOM-Bildbeispiele. Ich habe www.osirix-viewer.com/resources/dicom-image-library/) vorgestellt, aber jetzt scheinen nur Osirix-Benutzer darauf zugreifen zu können.

Aus diesem Grund möchte ich die folgenden zwei Quellen für den Erhalt von DICOM-Bildbeispielen vorstellen.

Alle DICOM-Header anzeigen

Die Ihnen bekannten DICOM-Header können wie folgt angezeigt werden: Welche Modalität hat dieses Bild? Es wird angezeigt.

import dicom
dcm = dicom.read_file('CT_small.dcm')
print(dcm.Modality)

Wenn Sie nur alles im Text anzeigen möchten, müssen Sie nichts tun.

import dicom
dcm = dicom.read_file('CT_small.dcm')
print(dcm)

Was ist, wenn Sie alle Überschriften (aber nicht die Bilder) wie folgt drucken möchten? `Print (dcm)`? Also habe ich versucht, den Quellcode ein wenig zu verfolgen.

Dann gab es einen Hinweis in 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

Zeigt die Eigenschaft `` `showVR``` anscheinend den Datentyp des DICOM-Headers an? Es scheint, dass es eine Flagge von ist.

Was für eine VR gibt es? Das liegt daran, dass Sie sich unbedingt die [DICOM-Spezifikationen] ansehen sollten (http://dicom.nema.org/dicom/2013/output/chtml/part05/sect_6.2.html).

In diesem Sinne werden alle Metadaten-Tags, Namen, Typen und Anzeigen in .append () aufgelistet, wenn Sie nur `__str__ ()` `` `dataelem.py``` drücken. Es scheint, dass Sie alle Daten erhalten können, indem Sie so etwas tun.

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)

Erstellen Sie ein MIP-Bild aus 3D-Bilddaten

Wie unter Entfernen von DICOM-Bildern mit Python beschrieben, können Sie Slices kombinieren, um 3D-Daten zu erstellen. Bilddaten aus DICOM-Dateien können als numpy-Array aus pixel_array abgerufen werden.

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()

Infolgedessen werden DICOM-Bilddaten in einem dreidimensionalen Array namens img3d gespeichert. Um dies zu visualisieren, wird es mit einer Methode namens MIP (Maximum Intensity Projection) oder MinIP (Minimum Intensity Projection) in ein zweidimensionales Bild konvertiert.

Mit welcher Achse möchten Sie ein Bild des Querschnitts der dreidimensionalen Bilddaten erstellen? Und welche Pixelachse sollte als repräsentativer Wert verwendet werden, wenn ein zweidimensionales Bild entlang dieser Achse erstellt wird? Davon abgesehen verwendet MIP das Pixel mit der höchsten Helligkeit als repräsentativen Wert und MinIP das Pixel mit der niedrigsten Helligkeit als repräsentativen Wert.

Welcher Querschnitt sollte auch für den menschlichen Körper verwendet werden? Dafür hat jeder Abschnitt einen Namen. Wikipedia-Artikel: Anatomical_plane

Unabhängig davon, ob Sie den Maximalwert oder den Minimalwert verwenden, können Sie das numpy-Array von hier aus verwenden.

#Unterlassung
max0 = np.nanmax(img3d, axis=0)
max1 = np.nanmax(img3d, axis=1)
max2 = np.nanmax(img3d, axis=2)

Im Fall dieses BRAINIX-MRT-Bildes entspricht "Achse = 0" der koronalen Ebene, sodass max0 das MIP-Bild der koronalen Ebene speichert. Danach wird es zu `matplotlib.imshow ()` `, und wenn Sie dies tun` `im = Image.fromarray (max0)` in PIL und dann im.show () Ich denke, es ist in Ordnung.

Ob der Querschnitt des Originalbildes axial, koronal oder sagittal ist, scheint anhand des Originalbilds beurteilt zu werden, aber wenn Sie auf diese Weise ein dreidimensionales Array wie "img3d" erstellen, aus welchem Querschnitt Es wird auch möglich sein, auszuschneiden.

Im Allgemeinen CT-Bilder in einer axialen Ebene, daher denke ich, dass sie drei Dimensionen haben: [axial, koronal, sagittal].


Zusammenfassung

Ich habe die Fortsetzung von [DICOM-Bilder mit Python entfernen] geschrieben (http://qiita.com/fukuit/items/ed163f9b566baf3a6c3f).

Recommended Posts

DICOM-Bilder mit Python Part 2 entfernen
Entfernen Sie DICOM-Bilder in Python
Bildpixel-Manipulation in Python
Arbeiten mit DICOM-Bildern in Python
Beispiel für das Abrufen des Modulnamens und des Klassennamens in Python
Angrenzende Bilder mit Python Teil 1
Base64-Codierung von Bildern in Python 3
Objektäquivalenzbeurteilung in Python
UI-Automatisierung Teil 2 in Python
Beschleunigen Sie das Laden von Python-Bildern
Implementierung der schnellen Sortierung in Python
Abrufen von Listenelementen in Python
Python x GIS-Grundlagen (1)
Zeigen Sie DICOM-Bilder mit rudimentärem Python als Mediziner an
Zahlenerkennung in Bildern mit Python
Python x GIS-Grundlagen (3)
Abrufen der arXiv-API in Python
So sammeln Sie Bilder in Python
Zeitdelta in Python 2.7-Serie teilen
MySQL-automatische Escape-Funktion von Parametern in Python
Umgang mit JSON-Dateien in Python
Audio-Wellenform-Anzeige in Python
Erste Schritte mit Python Grundlagen von Python
Extrahieren Sie mit Python Text aus Bildern
Grundlagen von Python x GIS (Teil 2)
Das Gesetz der Zahlen in Python
Implementierung der ursprünglichen Sortierung in Python
Reversibles Verwürfeln von Ganzzahlen in Python
Wrap (Teil der) AtCoder Library in Cython zur Verwendung in Python
Konvertierung der Zeichenfolge <-> Datum (Datum, Datum / Uhrzeit) in Python
GUI-Erstellung in Python mit tkinter Teil 1
AM-Modulation und Demodulation mit Python Part 2
Übung, dies in Python zu verwenden (schlecht)
Allgemeine Relativitätstheorie in Python: Einführung
Wenden Sie verschiedene Formen von Mosaiken auf Bilder an (Python, OpenCV).
Ausgabebaumstruktur von Dateien in Python
Zeigen Sie eine Liste der Alphabete in Python 3 an
Vergleich japanischer Konvertierungsmodule in Python3
Implementieren Sie einen Teil des Prozesses in C ++
Zusammenfassung verschiedener for-Anweisungen in Python
Das Ergebnis der Installation von Python auf Anaconda
Gang of Four (GoF) -Muster in Python
Laden Sie Bilder von der URL-Liste in Python herunter
Grundlagen zum Ausführen von NoxPlayer in Python
Ich möchte einen Teil der Excel-Zeichenfolge mit Python einfärben
Massenersatz von Zeichenfolgen in Python-Arrays
Projekt Euler # 16 "Summe der Kräfte" in Python
Traffic Safety-Kun: Erkennung von Verkehrszeichen in Python
Zusammenfassung der integrierten Methoden usw. der Python-Liste
Nicht logische Operatorverwendung von oder in Python
Auf der Suche nach dem schnellsten FizzBuzz in Python
Praktisches Beispiel für hexagonale Architektur in Python
Ich habe versucht, den unter "Abrufen von Bildern von der Flickr-API mit Python" (Teil 2) veröffentlichten Vorlagencode zu überarbeiten.
Projekt Euler # 17 "Anzahl der Zeichen" in Python
Doppelte Pendelbewegungsgleichung in Python
Lesen von Zeichen in Bildern mit Python OCR
Status jedes Python-Verarbeitungssystems im Jahr 2020
Projekt Euler # 1 "Vielfaches von 3 und 5" in Python