DICOM-Serien mit Python sinnvoll umbenennen

Haben Sie auch schon mal das Problem gehabt, dass Sie eine Bilderserie aus Ihrem Pacs exportiert oder auf CD gebrannt haben, und dann hatten die einzelnen DICOM-Dateien in der Serie so kryptische Namen wie EE48F5A2EE60E5C2EE61ACB1  und so weiter? Keine der tatsächlichen Ordnung der Bilderserie entsprechende Nummerierung oder Benennung? Wenn Sie dann die Bilder in ein anderes Format umwandeln (JPEG oder PNG) geht alles durcheinander. Die DICOM-Meta-Informationen, also Bildnummer oder ggf. Schichtposition gehen verloren und ein Sortieren kann sehr mühsam sein. Vielleicht wollen Sie ja auch eine bewegte Serie als GIF-Bild abspeichern.

Killian-Jamieson-Divertikel
Killian-Jamieson-Divertikel unter dem oberen Ösophagussphinkter als GIF-Datei (>5 MB)

Und wenn das dann mehr als vielleicht 10 Bilder sind, dann sollten die schon in der richtigen Reihenfolge sein, sonst macht es keinen Spaß.

Umbennen

Also müssen die DICOM-Dateien umbenannt werden. Und zwar bevor sie in ein anderes Format konvertiert werden, denn wir brauchen noch die Bildnummer aus den DICOM-Informationen. Wie kann man das nun am besten bewerkstelligen? Das PACS liefert nur die kryptischen Dateinamen. Ich brauche aber eine Software, die einerseits DICOM versteht, andererseits Dateien nach meinen Wünschen umbenennen kann. Ich möchte also, dass ich nachher die Bilder so benannt habe, dass die Bildnummer Teil des Dateinamens ist und die Sortierung somit erhalten bleibt.

Nachdem ich da nichts Fertiges im Internet gefunden habe, habe ich mich daran gemacht, selber ein kleines Programm (oder Script) zu schreiben, welches den Job tut.

Python

Dabei wollte ich nicht eine neue DICOM-Library erfinden. Es gibt für verschiedene Sprachen eine ganze Reihe solcher Programmbibliotheken im Netz, die man auch frei benutzen darf. Als relativ einfache, aber für diesen Zweck sehr brauchbare Sprache bot sich Python an. Diese Sprache ist bei Linux in der Regel schon mit dabei, ist aber auch für Windows oder andere Betriebssystem verfügbar. Deutschsprachige Infos gibt es zum Beispiel hier oder in der Wikipedia. Und es gibt auch für Python auch die oben erwähnte Library für das Auslesen der DICOM-Informationen. Die heißt pydicom und ist schnell installiert. Dann kann ich loslegen:

#############################################################
# dicomrename.py von onkelpaul.de
#
# Benennt DICOM-Dateien in einem Verzeichnis so um, dass sie
# Seriennummer und Bildnummer im Dateinamen enthalten:
#
# > python dicomrename.py ./DICOM/abcd/efgh -p -d
# 
#   ABCDEF --> 011-0123-Anonymous_Male-ABCDEF
#
# Also Serie 11, Bild 123 von Patient Anonymous_Male.
#
# Die Option -p haengt den Patientennamen an den neuen
# Dateinamen an, die Option -d den alten Dateinamen.
# Die Option -r dreht die Reihenfolge um.
#############################################################
#
# ACHTUNG: Dateien werden nicht kopiert, sondern umbenannt!
#
#############################################################

print "DICOM-Serien umbenennen"
import sys
import os
import dicom

# Wenn kein Verzeichnis angegeben, in dem aktuellen Verzeichnis '.' suchen:
# Erster Parameter ist der Name des Scripts, also sys.argv[0].
if len(sys.argv) == 1:
  path = "."
else:
  path = sys.argv[1]

# Damit es egal ist, ob man zum Schluss einen / (oder \ bei Windows) eingegeben hat:
# Letztes Zeichen ist path[-1], os.sep ist je nach Linux oder Windows / oder \.
# path[:-1] gibt den String vor dem letzten Zeichen, also ggf. ohne os.sep.
if path[-1] == os.sep:
  path = path[:-1]
print "Verzeichnis " + path

# Hole alle Dateien aus dem Verzeichnis:
dicomfiles = [f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))]

# Jetzt Dateien, die wirklich DICOM sind, zaehlen:
# Wir brauchen die Anzahl, wenn die Reihenfolge umgedreht werden soll.
anzahl = 0
for old_name in dicomfiles:
  try:
    ds = dicom.read_file(path + os.sep + old_name)
    anzahl = anzahl + 1
  except dicom.errors.InvalidDicomError:
    if not old_name[0] == '.': # versteckte Dateien ignorieren
      print old_name + ' IST KEIN DICOM-FILE'
print str(anzahl) + " DICOM-Dateien gefunden"

# Und jetzt werden alle Dateien darauf geprueft, ob sie DICOM sind.
for old_name in dicomfiles:
  try:
    ds = dicom.read_file(path + os.sep + old_name)
    name = ds.PatientsName.family_name
    serie = str(ds.SeriesNumber.numerator)
    
    # Reihenfolge umdrehen?
    if '-r' in sys.argv:
      instance = str(anzahl - ds.InstanceNumber.numerator)
    else:
      instance = str(ds.InstanceNumber.numerator)
      
    # Soll der Patientenname Teil des neuen Namens werden?
    if '-p' in sys.argv:
      add_pat_name = '-' + name.replace(' ', '_')
    else:
      add_pat_name = ''

    # Soll der alte Dateiname Teil des neuen Namens werden?
    if '-d' in sys.argv:
      add_file_name = '-' + old_name
    else:
      add_file_name = ''

    # Fuehrende Nullen fuer Seriennummer auf drei Stellen und Bildnummer auf 4 Stellen. 
    # Damit wird erreicht, dass die Dateisortierung hinterher klappt. Ansonsten 
    # gaebe es bei 11 Dateien sowas wie 1, 10, 11, 2, 3...
    new_name = serie.zfill(3) + '-' + instance.zfill(4) + add_pat_name + add_file_name
    print path + os.sep + old_name + ' --> ' + path + os.sep + new_name
    os.rename(path + os.sep + old_name, path + os.sep + new_name)
  except dicom.errors.InvalidDicomError:
    if not old_name[0] == '.': # versteckte Dateien ignorieren
      print old_name + ' IST KEIN DICOM-FILE'

Was macht dieses Python-Script denn nun? Es schaut in einem angegebenen Verzeichnis nach, welche DICOM-Dateien hier vorhanden sind, nimmt sich die der Reihe nach vor und holt sich jeweils aus dem DICOM-Header, also aus den Metadaten die Seriennummer und die Bildnummer (InstanceNumber). Aus diesen setzt das Script dann einen neuen Namen nach dem Schema Serie-Bild und gegebenenfalls Serie-Bild-Patientenname-AlterDateiname zusammen. Dann wird die Datei in den neuen Namen umbenannt. Wenn die Bildnummern in der Reihenfolge umgedreht werden soll, weil die Serie sonst rückwärts laufen würde, geht das über einen Parameter beim Aufruf.

Wenn Sie Python (Windows) und pydicom installiert haben, kopieren Sie den obigen Scriptcode in eine Datei und nennen diese „dicomrename.py“, oder laden Sie die Datei hier herunter. Sie rufen das Script mit

python dicomrename.py [Verzeichnisname] [-p] [-d] [-r]

von der Konsole auf. Wenn der Verzeichnisname nicht angegeben ist, werden die Dateien im aktuellen Verzeichnis („.“) umbenannt. Der Parameter -p gibt an, ob der Patientenname Teil des neuen Namens werden soll. Der Parameter -d hängt den alten Dateinamen noch an. Man kann auch nur -d verwenden. Und mit dem Parameter -r kann man die Reihenfolge umdrehen. Das ist gerade bei Durchleuchtungsserien manchmal hilfreich, sonst schluckt der Patient unter Umständen nach oben.

Sie dürfen dieses Script verwenden wie Sie wollen, also auch verändern. Ich übernehme aber keinerlei Haftung für irgendetwas im Zusammenhang mit der Verwendung. Beachten Sie auch, dass das Script die Dateien umbenennt und nicht kopiert, also das Original verändert. Noch zwei kleine Bemerkungen zum Script: Ich habe die Zeichencodierung nicht angegeben, weshalb auch keine Umlaute verwendet wurden. Und: Ich habe das Ganze nicht auf Windows getestet. Hab gerade keins da 😉 . Sollte aber gehen…

… und Gimp macht ein GIF draus

Jetzt kommt uns eine Eigenschaft vom Gimp entgegen, die man eigentlich nicht sofort erwarten würde: Er versteht DICOM! Das heißt, dass wir uns hier keine weiteren Konvertierungssorgen machen müssen. Wir öffnen den Gimp mit der ersten Datei aus der Serie. Damit haben wir die richtigen Bildmaße festgelegt.

Ebenen-Fenster
Jede Ebene im Gimp wird als Einzelbild eines animierten GIF-Bildes verwendet.

Dann markieren wir die restlichen Dateien aus dem Verzeichnis und ziehen sie in das Fenster für die verschiedenen Ebenen. Jedes Bild gibt eine neue Ebene. Wir können jetzt alle Ebenen gemeinsam auf die gewünschte Größe zurechtschneiden (GIMP Rectangle und dann Bild – Auf Auswahl zuschneiden). Das Ergebnis exportieren wir als animiertes GIF und fertig!

Diffuser Ösophagusspasmus
Diffuser Ösophagusspasmus als animiertes GIF.

Eine Antwort auf „DICOM-Serien mit Python sinnvoll umbenennen“

  1. Die Installation der Library ‚pydicom‘ geht am einfachsten mit dem Tool ‚pip‘, welches man mit:

    sudo apt install python-pip

    installiert. Dann evtl. noch mit

    sudo -H pip install --upgrade pip

    auf die neueste Version upgraden und mit

    sudo -H pip install setuptools

    die SetupTools installieren.
    Die eigentliche Installierung von pydicom geht dann mit

    pip pydicom

    ggf. mit

    sudo -H pip pydicom

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.