Fully automatic detection of the vertebrae in 2D CT images – the Talk

Yea finally I gave the talk for my Publication “Fully automatic detection of the vertebrae in 2D CT images” Paper 7962-11 at SPIE Medical Imaging 2011, Conference 7962 Image Processing (see index) in front of about 200 people.

Everything went fine. Just some nice questions right after the talk and some hints afterwards. Hey – some guys even remembered the talk 2 days later! 🙂

Thanks, SPIE Medical Imaging.

Performanceanalyse mit JVisualVM – evil synchronized

In einem meiner kleinen Projekte werden an einer Stelle etliche Threads gestartet, die jeweils ein Bild einlesen, skalieren und wieder auf die Platte schreiben. – Die ganze Zeit hat mich schon das GefĂŒhl beschlichen, dass das zu langsam lĂ€uft, untersucht hatte ich das bisher nur nie. Nachdem genau diese FunktionalitĂ€t heute definitv zu langsam war, kam ich um eine Analyse wohl doch nicht mehr herum. Also erst mal untersuchen, was da vor sich geht:

  • Programm gestartet,
  • JVisualVM gestartet (zu finden im bin-Verzeichnis einer JDK-Installation),
  • VisualVM auf das laufende Programm verbunden, und die Threads anzeigen lassen
  • kritische Funktion im Programm gestartet

Und siehe da: die Threads werden gestartet, aber nur immer genau einer ausgefĂŒhrt (siehe Bild). Alle anderen Threads die laufen sollten stehen auf “Monitor”. Das ist leicht daran zu erkennen, dass zwar alle PictureScaleWorker ausgefĂŒhrt werden, aber niemals gleichzeitig alle grĂŒn (also im Running State) sind sondern immer nur einer. Na das sollte ja nicht so sein!

Aber was machen die eigentlich und worauf warten die? Also erst mal einen Thread Dump erstellen (Button oben rechts), vielleicht bringt der ja ein paar Infos:

Dann zu einem der betreffenden Threads scrollen und nachsehen, ob dort etwas auffÀllig ist.

Thread.State: BLOCKED (on object monitor)
at de.locked.gallery.utils.ImageUtils.read (ImageUtils.java:83)

Blocked on object monitor – das sieht nach einem synchronized aus. Und betreffende Zeile 83 ist tatsĂ€chlich synchronized – was ich bei einem der letzten Refactorings offenbar ĂŒbersehen habe. Mittlerweile ist die Synchronisierung auf dieser Methode zum GlĂŒck nicht mehr nötig und ich kann die EinschrĂ€nkung ohne Gewissenbisse entfernen. Und siehe da, auf einmal laufen auch alle Threads gleichzeitig, was auf 8 Kernen doch einen spĂŒrbaren Unterschied macht. – Willkommen im Multi-Core Zeitalter.

Ohne die JVisualVM wĂ€re ich frĂŒher oder spĂ€ter wohl auch an die Stelle gekommen – aber ich bezweifle ernsthaft dass ich die Stelle innerhalb weniger Minuten gefunden hĂ€tte.

Dazu auch ein interessantes Video.

Selektionsfenster in SwingX-WS / JXMapKit

Um in der Mapkomponente von JXMapKit eine Selektion (Rechteck mit Rahmen und leicht transparenter FĂŒllung) zu zeichnen, wird lediglich ein entsprechender Painter und ein Mouseadapter benötigt. Der Code dazu sieht folgendermaßen aus:

Der Painter & MouseListener:

public class SelectionPainter extends MouseAdapter implements Painter<JXMapViewer> {

    private Rectangle rect, start, end;
    private Color borderColor = new Color(0, 0, 200);
    private Color regionColor = new Color(0, 0, 200, 75);

    public SelectionPainter() {
    }

    @Override
    public void mousePressed(MouseEvent e) {
        if (e.getButton() != MouseEvent.BUTTON1) {
            rect = null;
            start = null;
        } else {
            start = new Rectangle(e.getPoint());
            ((JXMapViewer) e.getSource()).setPanEnabled(false);
        }
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        if (start != null) {
            end = new Rectangle(e.getPoint());
            rect = start.union(end);
        }
        ((JXMapViewer) e.getSource()).repaint();
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        if (start == null) {
            return;
        }
        end = new Rectangle(e.getPoint());
        rect = start.union(end);
        ((JXMapViewer) e.getSource()).setPanEnabled(true);
        ((JXMapViewer) e.getSource()).repaint();
    }

    @Override
    public void paint(Graphics2D gd, JXMapViewer t, int i, int i1) {
        if (rect != null) {
            gd.setColor(regionColor);
            gd.fillRect(rect.x, rect.y, rect.width, rect.height);
            gd.setColor(borderColor);
            gd.drawRect(rect.x, rect.y, rect.width, rect.height);
        }
    }
}

Verbindung zur Map-Komponente:

 SelectionPainter sp = new SelectionPainter();
mapKit.getMainMap().addMouseListener(sp);
mapKit.getMainMap().addMouseMotionListener(sp);
mapKit.getMainMap().setOverlayPainter(sp);

mapKit ist dabei eine Instanz von org.jdesktop.swingx.JXMapKit.

Artikel mit gepatchtem SwingX-WS

Fully automatic detection of the vertebrae in 2D CT images

FINALLY submitted the paper which we sent to the SPIE Medical Imaging Conference  (and got accepted!)

Abstract:

Knowledge about the vertebrae is a valuable source of information for several annotation tasks. In recent years, the research community spent a considerable effort for detecting, segmenting and analyzing the vertebrae and the spine in various image modalities like CT or MR. Most of these methods rely on prior knowledge like the location of the vertebrae or other initial information like the manual detection of the spine. Furthermore, the majority of these methods require a complete volume scan. With the existence of use cases where only a single slice is available, there arises a demand for methods allowing the detection of the vertebrae in 2D images. In this paper, we propose a fully automatic and parameterless algorithm for detecting the vertebrae in 2D CT images. Our algorithm starts with detecting candidate locations by taking the density of bone-like structures into account. Afterwards, the candidate locations are extended into candidate regions for which certain image features are extracted. The resulting feature vectors are compared to a sample set of previously annotated and processed images in order to determine the best candidate region. In a final step, the result region is readjusted until convergence to a locally optimal position. Our new method is validated on a real world data set of more than 9 329 images of 34 patients being annotated by a clinician in order to provide a realistic ground truth.

More Information and the paper as PDF can be found at my publication site.

Excel 2007: DiagrammflÀchen schraffieren

Schraffuren fĂŒr Diagramme gibt es in Excel 2007 offenbar leider nicht mehr. Abhilfe schafft jedoch ein Add-In.

Am besten, das Add-In nach C:Dokumente und Einstellungen[Benutzername]AnwendungsdatenMicrosoftAddIns kopieren und dann der Installationsanleitung folgen:

  • Excel-Button drĂŒcken (der große runde button oben links)
  • letzte Zeile: Excel-Optionen
  • Add-Ins
  • fast ganz unten: “Gehe zu”
  • Durchsuchen
  • PatternFills.xlam anklicken und fertig

Anwendung

  • Diagramm anklicken
  • Diagrammtools > Format > ganz rechts gibt es jetzt eine “Patterns” SchaltflĂ€che
blank

GoogleMail: DateianhÀnge aus E-Mails löschen

Google ist der Meinung, dass es unnötig sei AnhÀnge/Attachments aus eMails zu löschen. Dummerweise bin ich anderer Meinung. Trotz mittlerweile mehr als 7.5 GB potentiellem Speicherplatz bei Google Mail, will ich nicht jeden Mist an den Mails kleben lassen.

Da ich per IMAP und Thunderbird auf meine Mails zugreife, kann ich die AnhĂ€nge wenigstens im Thunderbird löschen. Gesagt getan – nur wird der belegte Speicher dadurch nicht weniger sondern mehr. Das Problem ist, dass bei jedem Löschen eines Anhangs, eine Kopie der Nachricht (inklusive dem Anhang!) im Ordner “Alle Nachrichten” verbleibt und zusĂ€tzlich eine Mail ohne Anhang erstellt wird.

Die Lösung ist folgendermaßen:

  • Thunderbird per IMAP mit Google verbinden (Anleitung von Google)
  • Die unerwĂŒnschten AnhĂ€nge löschen – dabei werden unerwĂŒnschte Mailduplikate erstellt.
  • Das Thunderbird Addon Remove Duplicate Messages installieren und so konfigurieren:
  • Extras > Add-ons > “Remove Duplicate Messages” Einstellungen > Lösche bevorzugt “grĂ¶ĂŸere” E-Mail
  • AnhĂ€nge löschen nicht vergessen (z.B. den Ordner “Alle Nachrichten” nach GrĂ¶ĂŸe sortieren und dann die Mails durchsehen)
  • Rechts Klick auf den Ordner “Alle Nachrichten” > “Doppelte Nachrichten entfernen”
  • Dort noch schnell die Ausgabe kontrollieren, bestĂ€tigen und fertig.

Die gelöschten Duplikate sollten jetzt im Papierkorb sein, den man bei Bedarf noch löschen kann. Kurz darauf sollte man die Änderung auch in der GoogleMail OberflĂ€che sehen.

Epson Perfection 1240U mit Windows7 64bit und Windows 10

Epson stellt fĂŒr den relativ alten Scanner “Epson Perfection 1240U” (aus dem Jahr 2001) keine 64bit Treiber fĂŒr Windows 7 oder Windows 10 bereit.

Anstatt einen neuen Scanner zu kaufen scheint es mindestens 3 Lösungen zu geben:

Kauf zusÀtzlicher Software (bei Win 7)

  1. Die Empfehlung von Epson ist, die Software VueScan von Hamrick zuinstallieren. Vorteil: es geht! Nachteil: Die Software kostet ca. 30€
  2. In einem Windows 7-Forum wird ein modifizierter Treiber zum Download angeboten. Aber ehrlich gesagt habe ich Skrupel irgendwelche modifizierten Treiber aus nicht absolut vertrauenswĂŒrdigen Quellen zu installieren.
  3. Einen original Epson-Treiber eines anderen Scanners verwenden. Der Tip kommt ĂŒbrigens aus dem selben Forum – da ich den Beitrag in einigen Monaten / Jahren nicht mehr wiederfinden werde, wenn ich es brauche: hier nochmal eine Beschreibung:

Epson Perfection 1240U mit Windows7 64bit:

  1. Scanner abstecken
  2. Epson Perfection 2400 Treiber fĂŒr Windows 7 von Epson runterladen (EPSON Scan 3.0.4 vom 17. Juli 2009 / 20,68 MB)  Download
  3. Treiber installieren
  4. Scanner anstecken (findet keine Treiber)
  5. Start > Systemsteuerung > GerÀtemanager: dort sollte jetzt ein neues GerÀt mit gelbem Icon sein (der Scanner)
  6. Rechtsklick > Eigenschaften > Treiber > Treiber aktualisieren
  7. “Auf dem Computer nach Treibersoftware suchen”
  8. “Aus einer Liste von GerĂ€tetreibern auf dem Computer AuswĂ€hlen” > “BildverarbeitungsgerĂ€te”
  9. Hersteller: Epson, Modell: Epson Perfection 2400 auswÀhlen und bestÀtigen

Mit IrvanView kann man nun scannen!

Zeitaufwand: minimal

Epson Perfection 1240U mit Windows10

Ich habe den Scanner mittlerweile entsorgt, aber er scheint auch unter Windows 10 noch seinen Dienst zu tun. Wie mir in einem Kommentar mitgeteilt wurde könnte es ungefÀhr wie folgt gehen:

  1. Start
  2. Einstellungen
  3. GerĂ€te unter „Verwandte Einstellungen“ (rechts unten) „GerĂ€te und Drucker“ auswĂ€hlen.
  4. Den Scanner auswĂ€hlen (Windows 10 schlĂ€gt erst mal nur vor das GerĂ€t zu entfernen, da kein passender Treiber verfĂŒgbar ist.)
  5. Rechtsklick > Eigenschaften
  6. Hardware > Eigenschaften
  7. Einstellungen Àndern > Treiber > Treiber aktualisieren.

TeXnicCenter: PDF vor Compilierung schließen

Sollte TeXnicCenter einen Fehler melden wie “Beim Öffnen dieses Dokuments ist ein Fehler aufgetreten”, liegt es evtl. daran, dass das PDF noch offen ist.

TeXnicCenter-Ausgabeprofile
TeXnicCenter-Ausgabeprofile

Zum automatischen Schließen des PDFs definiert man das “LaTeX => PDF”-Profil derart (siehe Screenshot rechts):

  1. Ausgabe > Ausgabeprofile definieren > Profil links wĂ€hlen, rechts den Reiter  “Viewer”
  2. Projektausgabe betrachten: [x] DDE Komando, Kommando: [DocOpen(“%bm.pdf”)], Server: acroview, Thema: control
  3. Suche in Ausgabe: [x] DDE Komando, Kommando: [DocOpen(“%bm.pdf”)], Server: acroview, Thema: control
  4. Vor Compilierung Ausgabe schließen: [x] DDE Komando, Kommando: [DocClose(“%bm.pdf”)], Server: acroview, Thema: control

Alternativ kann man sich eine der folgenden Profile runterladen und importieren. Einmal mit und einmal ohne die Pfade zu Acrobat.

“Latex => PDF”-Profil ohne Pfad (sollte bei den meisten funktionieren)
“Latex => PDF”-Profil mit Pfad (wird nicht funktionieren, falls Acrobat nicht im exakt selben Verzeichnis wie bei mir installiert ist)

Links zum Thema: