<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Schnelles Prototyping fur die medizinische Bildverarbeitung</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Danial Bin Mohamed Saruji</string-name>
          <email>d.saruji@dkfz-heidelberg.de</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Michael Mu¨ller</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Hans-Peter Meinzer</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Abteilung Medizinische und Biologische Informatik, Deutsches Krebsforschungszentrum</institution>
          ,
          <addr-line>DKFZ</addr-line>
        </aff>
      </contrib-group>
      <fpage>214</fpage>
      <lpage>218</lpage>
      <abstract>
        <p>Kurzfassung. Prototypen spielen in der medizinischen Bildverarbeitung eine wichtige Rolle, da sie eine schnelle Evaluation eines neu entwickelten Algorithmus erlauben. Hierfu¨r bietet sich die Nutzung einer interpretierten Sprache an, da die Entwicklungszeit, im Vergleich zu kompilierten Sprachen, ku¨rzer ist. Um diese Mo¨glichkeiten auch fu¨r C++ Bibliotheken zu erhalten, ko¨nnen Schnittstellen erzeugt werden mit denen der Zugriff auf Funktionen der Bibliothek, von einer interpretierten Umgebung aus, mo¨glich wird. Es existieren verschiedene Verfahren um automatisch Schnittstellen fu¨r C/C++ Code zu generieren. In diesem Paper wird die Integration eines solchen Verfahrens examplarisch an dem Open-Source Toolkit MITK beschrieben.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>Einleitung</title>
      <p>
        Code generieren. In diesem Paper wird die Integration eines generischen
Wrappingverfahrens, beispielhaft am Medical Image and Interaction Toolkit (MITK),
beschrieben, um Teile der Klassen-Bibliothek skriptfa¨hig zu machen und somit
schnelles Prototyping zu ermo¨glichen. Dazu wurde ein automatisiertes Verfahren
gesucht um die Mo¨glichkeit zu bieten einfach und schnell Klassen skriptfa¨hig zu
machen. Als Zielsprache wurde hierbei zuna¨chst die Skriptsprache Python [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]
verwendet, jedoch sollte auch die Mo¨glichkeit geboten werden andere
Zielsprachen zu integrieren.
2
2.1
      </p>
    </sec>
    <sec id="sec-2">
      <title>Material und Funktionen</title>
      <sec id="sec-2-1">
        <title>Medical Image and Interaction Toolkit (MITK)</title>
        <p>
          MITK [
          <xref ref-type="bibr" rid="ref2">2</xref>
          ] ist ein Open-Source Framework zur Entwicklung von interaktiver
medizinischer Bildverarbeitungssoftware. Es baut auf dem Insight Segmentation
and Registration Toolkit (ITK) und dem Visualizationtoolkit (VTK) auf und
erweitert diese um weitere Funktionalita¨ten. ITK bietet Algorithmen fu¨r die
Segmentierung und Registrierung von mehrdimensionalen Daten. VTK ist ein
Visualisierungssystem und bietet eine große Zahl von Visualisierungsalgorithmen.
Als Build System verwenden alle drei Toolkits CMake, welches ein
plattformu¨bergreifendes Buildsystem fu¨r C/C++ Projekte ist, um Projekt-Dateien fu¨r
verschiedene Entwicklungsumgebungen zu erzeugen. Sowohl VTK als auch ITK
verwenden ein generisches Wrappingverfahren um Wrapper fu¨r die Sprachen
Python, Java und TCL zu generieren. VTK verwendet dabei ein vollsta¨ndig selbst
entwickeltes Verfahren unter der Verwendung von Yacc und Lex. ITK verwendet
CSWIG, welches eine modifizierte Version des Entwicklungswerkzeugs Simplified
Wrapper and Interface Generator (SWIG) ist, um Schnittstellen zu erzeugen.
2.2
        </p>
      </sec>
      <sec id="sec-2-2">
        <title>Wrapper</title>
        <p>Um die Funktionen aus der MITK Bibliothek in Python aufrufen zu ko¨nnen,
wurden Wrapper erzeugt. Diese bilden Schnittstellen u¨ber die Funktionen aus
einer anderen Programmiersprache aufgerufen werden ko¨nnen und enthalten die
notwendigen Datentypkonvertierungen. Um Wrapper manuell zu erzeugen muss
fu¨r jede Funktion, auf die Zugriff gewa¨hrt werden soll, eine Wrapper Funktion
erstellt werden. Hierfu¨r mu¨ssen die notwendigen Typkonvertierungen
implementiert, mo¨gliche Fehler abgefangen und teilweise Klassen/Strukturen erweitert
werden. Zudem muss die Speicherverwaltung beru¨cksichtigt und Zugriff auf
Variablen, Strukturen und Klassen ermo¨glicht werden. Dies ist bei umfangreichen
Bibliotheken sehr zeitaufwa¨ndig. Es existieren jedoch verschiedene Verfahren,
um Python Schnittstellen automatisch fu¨r C/C++ Code zu generieren.
2.3</p>
      </sec>
      <sec id="sec-2-3">
        <title>CableSWIG</title>
        <p>
          Fu¨r die Erzeugung von Python Schnittstellen in MITK wurde CableSWIG [
          <xref ref-type="bibr" rid="ref3">3</xref>
          ]
verwendet. CableSWIG ist eine Sammlung von Werkzeugen zur Erzeugung von
Wrappern, welche C/C++ Module fu¨r andere Sprachen verfu¨gbar macht. Dabei
werden 19 verschiedene Zielsprachen unterstu¨tzt. Es besteht aus drei
Werkzeugen: CSWIG, CableIDX und GCCXML. In Abb. 1 wird das CableSwig
Wrappingverfahren dargestellt. Die Cable Konfigurationsdatei definiert fu¨r welche
Klassen Schnittstellen erzeugt werden sollen. Es kann fu¨r jede Klasse eine Cable
Konfigurationsdatei erstellt werden, es ist aber auch mo¨glich mehrere Klassen
in einer zu definieren. Zudem ist es mo¨glich mehrere Konfigurationsdateien in
einem gemeinsamen Packet/Modul zu kombinieren. GCCXML ist ein
Entwicklungstool das XML Dateien aus C++ Code generiert. CableIDX erzeugt aus der
XML Beschreibung eine sogenannte Indexdatei, welche Informationen daru¨ber
entha¨lt fu¨r welche Klassen Schnittstellen erzeugt werden sollen und in welchen
Bibliotheken sich diese befinden. Die erstellten XML und Index Dateien werden
als Input an CSWIG u¨bergeben, der daraus die jeweiligen Wrapperklassen
erstellt. Zusa¨tzlich ko¨nnen noch SWIG Konfigurationsdateien u¨bergeben werden
mit denen die meisten Aspekte der Wrappergenerierung, wie z.B.
individuelle Typkonvertierung, Klassen-/Strukturenerweiterung, Speicherverwaltung oder
Exception Handling, individuell angepasst werden ko¨nnen.
3
3.1
        </p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>Ergebnisse</title>
      <sec id="sec-3-1">
        <title>Wrappen des MITK Core</title>
        <p>Mit diesem Wrappingverfahren wurden Wrapperklassen fu¨r den Core Teil von
MITK generiert. Dieser besteht aus Klassen die von (nahezu) allen MITK
Applikationen beno¨tigt werden. Es handelt sich dabei um Klassen fu¨r die
Datenverwaltung, Synchronisation mehrerer Ansichten auf die gleichen Daten, Input und
Output verschiedener Bildtypen und Interaktionen. Dabei sollte das
Wrappingverfahren mo¨glichst einfach in das CMake Build System integriert werden, damit
auch Python Schnittstellen fu¨r neue Klassen auf schnelle und problemlose Weise
generiert werden ko¨nnen (Abb. 2). Mit Hilfe von CableSwig wurde das MITK
Core Erweiterungsmodul fu¨r Python erzeugt. Die normalen Python Module
bestehen aus einer schlichten Textdatei mit Python-Programmanweisungen. Im
Gegensatz dazu ist das Erweiterungsmodul ein Shared Object, bzw. eine DLL,
Abb. 1. CableSwig
Wrappingverfahren.</p>
        <p>Abb. 2. MITK Core Wrapping.
die eine Initialisierungsfunktion fu¨r Python exportiert. Mit dem Modul besteht
nun die Mo¨glichkeit in Python Zugriff auf die MITK Core Klassen zu erhalten,
wobei das Erweiterungsmodul als Schnittstelle dient und die notwendigen
Wrapper fu¨r die Funktionen der Ausgangsbibliothek entha¨lt. Dabei greift das Modul
auf Funktionen der Python C Api zu, welche bei Python standardma¨ßig
mitgeliefert wird. Diese API dient C/C++ Programmierern dazu, Erweiterungsmodule
zu schreiben oder Python in ihre eigene Applikation einzubinden. Sie bietet
beispielsweise Funktionen an, um Python Objekte in C Objekte zu konvertieren
und auch umgekehrt. Der Entwickler kann nun die C++ Klassen, die sich im
MITK Core befinden, in einer interpretierten Umgebung aufrufen. Dadurch kann
er z.B. einen Algorithmus schnell und einfach implementieren und testen, ohne
diesen vorher noch kompilieren zu mu¨ssen. Zudem existieren die C++-Klassen
bereits als Maschinencode, wodurch die Laufzeitgeschwindigkeit nicht gemindert
wird.
3.2</p>
      </sec>
      <sec id="sec-3-2">
        <title>MITK Python Modul</title>
        <p>Zur Entwicklung mit Python in MITK wurde ein MITK Python Modul
implementiert, welches eine GUI mit Python Konsole (Abb. 3, A) und Skript Editor
(Abb. 3, B) liefert. Die Konsole bietet Tab Completion und Texthighlighting.
Mit dieser kann der Entwickler interaktiv arbeiten, d.h die eingegebenen
Befehle werden sofort ausgefu¨hrt. Dies kann vor allem zum Testen von kleineren
Abschnitten des Quelltextes nu¨tzlich sein. Mit dem Skripteditor ist es mo¨glich
Skripte zu erstellen, zu speichern und auch wieder zu laden. Der Editor bietet
ebenfalls Texthighlighting an.
4</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>Diskussion</title>
      <p>Durch die Integration des CableSwig Wrappingverfahrens in das MITK Build
System ist es mo¨glich einfach und schnell Erweiterungsmodule fu¨r Python zu
generieren. Das Verfahren ist ein voll automatisierter Prozess, der einen großen
Teil der Arbeit u¨bernimmt. Es ist leicht erweiterbar, um weitere Zielsprachen zu
nutzen. Durch das MITK Python Modul besteht nun die Mo¨glichkeit
interaktiv zu entwickeln, dies ist vor allem bei schnellem Prototyping von Vorteil. Es
kann beispielsweise ein Bild geladen, verschiedene Filter daran ausprobiert und
angezeigt werden, ohne C++ Code schreiben und kompilieren zu mu¨ssen. Die
Laufzeit wird nicht gemindert, da die C++ Algorithmen bereits als
Maschinencode vorhanden sind. Es existieren zudem umfangreiche Python Module aus den
unterschiedlichsten Bereichen, auch aus der Bildverarbeitung, die der Entwickler
einfach importieren und nutzen kann. Nachteilig an dem Wrappingverfahren ist,
dass Template Klassen explizit instaziiert werden mu¨ssen. Daneben wird viel
Code fu¨r die Wrapper generiert, was insbesondere bei Template
Instanziierungen zu einer sehr großen Datei fu¨hren kann. Um die Entwicklung mit Python
noch einfacher zu gestalten, ko¨nnte eine GUI zur grafischen Programmierung
implementiert werden. Hierdurch ko¨nnte Quelltext anhand von strukturierten</p>
      <p>Abb. 3. MITK Python Modul mit Skripteditor (A) und Konsole (B).
Modellen erzeugt werden. Auch zur testgetriebenen Entwicklung ko¨nnte Python
genutzt werden. Die Python Standardbibliothek stellt zwei Module bereit mit
denen Abschnitte des Programms durch automatisierte Testdurchla¨ufe auf Fehler
u¨berpru¨ft werden ko¨nnen.</p>
    </sec>
    <sec id="sec-5">
      <title>Literaturverzeichnis</title>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <surname>Sanner</surname>
            <given-names>MF</given-names>
          </string-name>
          .
          <article-title>Python: a programming language for software integration and development</article-title>
          .
          <source>J Mol Graph Model</source>
          .
          <year>1999</year>
          ;
          <volume>17</volume>
          :
          <fpage>57</fpage>
          -
          <lpage>61</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <surname>Wolf</surname>
            <given-names>I</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Vetter</surname>
            <given-names>M</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Wegner</surname>
            <given-names>I</given-names>
          </string-name>
          , et al.
          <article-title>The medical imaging interaction toolkit</article-title>
          .
          <source>Med Image Anal</source>
          .
          <year>2005</year>
          ;
          <volume>9</volume>
          (
          <issue>6</issue>
          ):
          <fpage>594</fpage>
          -
          <lpage>604</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <surname>Lehmann G PZ</surname>
            ,
            <given-names>B R. WrapITK</given-names>
          </string-name>
          <article-title>: enhanced languages support for the insight toolkit</article-title>
          .
          <source>Insight J</source>
          .
          <year>2006</year>
          ; p.
          <fpage>4</fpage>
          -
          <lpage>35</lpage>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>