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.
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.
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)
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].
Ich habe die Fortsetzung von [DICOM-Bilder mit Python entfernen] geschrieben (http://qiita.com/fukuit/items/ed163f9b566baf3a6c3f).
Recommended Posts