DICOM Dateien einlesen in java mit VTK

Mitglied seit
01.09.2009
Beiträge
8
Renomée
0
Hallo Programmierer Gemeinde,

ich liese DICOM Dateien in JAVA mit der Klassenbibliothek VTK.
VTK bietet die Klasse vtkDICOMIamageReader um DICOM Bilder einzulesen.
Ich habe etwas 2800 DICOM Dateien, die ich einlesen möchte, aber ich kann nur nur etwa 1300 Dateien lesen wenn ich mehr versuchte bekomme die Fehlermeldung

#
# A fatal error has been detected by the Java Runtime Environment:
#
# Internal Error (0xe06d7363), pid=2808, tid=3984
#
# JRE version: 6.0_15-b03
# Java VM: Java HotSpot(TM) Client VM (14.1-b02 mixed mode windows-x86 )
# Problematic frame:
# C [kernel32.dll+0x12afb]
#
# An error report file with more information is saved as:
# C:\Programme\Eclipse\Eclipse ganmede \Workspace \VTK\hs_err_pid2808.log
#
# If you would like to submit a bug report, please visit:
# httpx://java.sun.com/webapps/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#


mit

Code:
vtkDICOMImageReader dicomReader= new vtkDICOMImageReader();
dicomReader.SetDirectoryName("C:/Dokumente und Einstellungen/Desktop/CT_2800_Files");
dicomReader.Update();

liese ich die Dateien ein.
Diese 2800 Bilder sind 1,4 GB zusammen, es könnte auch es Speicherproblem sein, aber ich habe echt keine Ahnung wo das Problem liegen kann???.

Falls jemand eine idee hat bin ich dankebar

Gruss
zeitreisender
 
Speichermangel würde normalerweise einen OutOfMemoryError auslösen - trotzdem wäre ein Tuning mit dem -Xmx-Paramater mal ein Versuch wert.

Ist diese VTK-Bibliothek komplett in Java geschrieben oder werden da DLLs mit JNI verwendet?
Falls nein, würde ich es vll wirklich mal mit einem Bug-Report bei Sun versuchen, falls ja würde ich mich mal an die VTK-Leute wenden.

Wirklich weiterhelfen kann ich aber wohl nicht :-/ sorry


edit: Ist die Bibliothek quelloffen? Falls ja, kannst du den Code in Eclipse angeben und mal mit dem Debugger den Code durchgehen. Fremd-Bibliotheken versteht man zwar meist nicht (bzw. nicht so schnell), aber vll hilft es dir wenn du siehst in welcher Gegend der Fehlerauftritt.
 
Zuletzt bearbeitet:
Hallo ThePsycho,

erstmal vielen dank für deine Antwort;D,
VTK ist ein opens source c++ Klassenbibliothek für die Visualisiuerung die man auch in JAVA, Python tcl anwenden kann. Dafür benutze ich die notwendige DLLs.
VTK schreibt dass die vtkDICOMImageReader nicht alle DICOM dateien einlesen kann.
Ich muss einen andere Möglichkeit suchen große Datensätze zu lesen.
Erste Möglichkeit wäre diese DICOM Dateien in Raw daten zu konvertieren und dann sie lesen.

vielen Dank
 
Der vtkDicomReader scheint mir ohnehin nur rudimentär implementiert zu sein (Stichwort DICOM-Tags).
Eine Alternative könnte der Reader von ITK sein, wo mir eine solche Einschränkung nicht bekannt ist. Danach kannst du die Daten in ein VTK-Datentyp konvertieren. Allerdings weiß ich nicht ob sich der Aufwand einer zweiten Bibliothek für dich wirklich lohnt.
 
Hallo DerSpud,

daran habe ich auch gedacht aber ITK ist auch ein grosses Bibliothek mit vielen Funktionen und Filtern, die ich nicht benötige also lohnt sich nicht ein 2. Bibliothek zu benutzen.
Solange man keine große Datensätze hat, reicht die Klasse vtKDicomImageReader aus.
ich habe eine Datensatz von 512x512x1300 und es funktioniert aber mit großere Datensätzen dann sturzt mein Programm ab.

Ich danke dir

mfg
zeitreisender
 
Hast du schon versucht die Daten in zwei Schritten einzulesen? Also erst mal bis zum Bild 1300 und dann den Rest? Müsstest halt die Bilder in zwei Verzeichnissen unterbringen da der vtkReader nur einzelne Dateien oder ganze Verzeichnisse einlesen kann.

Hast du dir schon die DICOM-Header angeschaut ob die Größenangaben in den richtigen Tags stehen und das keine Multiframe-Bilder vorkommen? (Vor allem da schauen wo der Reader mit dem Error abbricht, 2800 Bilder sind doch ne ganze Menge ;D)

Was steht den in der Errorreportfile? VTK gibt normalerweise auch Fehlermeldungen in einem Error-Fenster aus (ist in der nativen C++ Version jedenfalls so).
 
hallo DerSpud,

der Reader erwartet einen Verzeeichnis
Code:
dicomReader.SetDirectoryName("d:/test");
wo er die DICOM Daten einlesen soll. Mit 2 Verzeichnisse wurde es nicht klappen.
Auch mit den DICOM-Header ist alles okay.
VTK erzeugt mir eine Datei mit der Fehlermeldung aber ich werde damit nicht schlauer*noahnung*???.

------------------------------------------------------------------------------------------------------------------------------
#
# A fatal error has been detected by the Java Runtime Environment:
#
# Internal Error (0xe06d7363), pid=772, tid=1676
#
# JRE version: 6.0_15-b03
# Java VM: Java HotSpot(TM) Client VM (14.1-b02 mixed mode, sharing windows-x86 )
# Problematic frame:
# C [kernel32.dll+0x12afb]
#
# If you would like to submit a bug report, please visit:
# httpx://java.sun.com/webapps/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

--------------- T H R E A D ---------------

Current thread (0x003a6800): JavaThread "main" [_thread_in_native, id=1676, stack(0x008c0000,0x00910000)]

siginfo: ExceptionCode=0xe06d7363, ExceptionInformation=0x19930520 0x0090f9d0 0x030ece84

Registers:
EAX=0x0090f928, EBX=0x00000000, ECX=0x00000000, EDX=0x002f0000
ESP=0x0090f924, EBP=0x0090f978, ESI=0x0090f9b0, EDI=0x13c00000
EIP=0x7c812afb, EFLAGS=0x00000206

Top of Stack: (sp=0x0090f924)
0x0090f924: 04326968 e06d7363 00000001 00000000
0x0090f934: 7c812afb 00000003 19930520 0090f9d0
0x0090f944: 030ece84 03220000 00000000 785838da
0x0090f954: c3104591 13c00000 043269c8 00000000
0x0090f964: 785838da 7848beba 04326560 04326a14
0x0090f974: 0090f954 0090f9b0 7857dbf9 e06d7363
0x0090f984: 00000001 00000003 0090f9a4 e06d7363
0x0090f994: 00000001 00000000 00000000 00000003

Instructions: (pc=0x7c812afb)
0x7c812aeb: 8d 7d c4 f3 a5 5f 8d 45 b0 50 ff 15 10 15 80 7c
0x7c812afb: 5e c9 c2 10 00 85 ff 0f 8e 36 93 ff ff 8b 55 fc


Stack: [0x008c0000,0x00910000], sp=0x0090f924, free space=318k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C [kernel32.dll+0x12afb]
C [MSVCR90.dll+0x5dbf9]

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j vtk.vtkAlgorithm.Update_51()V+0
j vtk.vtkAlgorithm.Update()V+1
j mip.vtkMip.renderMip()V+96
j mip.vtkMip.main([Ljava/lang/String;)V+119
v ~StubRoutines::call_stub

--------------- P R O C E S S ---------------

Java Threads: ( => current thread )
0x02aa8c00 JavaThread "Low Memory Detector" daemon [_thread_blocked, id=2560, stack(0x02d20000,0x02d70000)]
0x02aa3c00 JavaThread "CompilerThread0" daemon [_thread_blocked, id=2416, stack(0x02cd0000,0x02d20000)]
0x02aa1400 JavaThread "Attach Listener" daemon [_thread_blocked, id=604, stack(0x02c80000,0x02cd0000)]
0x02aa0000 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=648, stack(0x02c30000,0x02c80000)]
0x02a61400 JavaThread "Finalizer" daemon [_thread_blocked, id=300, stack(0x02be0000,0x02c30000)]
0x02a5cc00 JavaThread "Reference Handler" daemon [_thread_blocked, id=2196, stack(0x02b90000,0x02be0000)]
=>0x003a6800 JavaThread "main" [_thread_in_native, id=1676, stack(0x008c0000,0x00910000)]

Other Threads:
0x02a5b000 VMThread [stack: 0x02b40000,0x02b90000] [id=1512]
0x02aab000 WatcherThread [stack: 0x02d70000,0x02dc0000] [id=2632]

VM state:not at safepoint (normal execution)

VM Mutex/Monitor currently owned by a thread: None

Heap
def new generation total 960K, used 343K [0x22990000, 0x22a90000, 0x22e70000)
eden space 896K, 31% used [0x22990000, 0x229d5d10, 0x22a70000)
from space 64K, 100% used [0x22a80000, 0x22a90000, 0x22a90000)
to space 64K, 0% used [0x22a70000, 0x22a70000, 0x22a80000)
tenured generation total 4096K, used 59K [0x22e70000, 0x23270000, 0x26990000)
the space 4096K, 1% used [0x22e70000, 0x22e7ecd0, 0x22e7ee00, 0x23270000)
compacting perm gen total 12288K, used 599K [0x26990000, 0x27590000, 0x2a990000)
the space 12288K, 4% used [0x26990000, 0x26a25f98, 0x26a26000, 0x27590000)
ro space 8192K, 63% used [0x2a990000, 0x2aea9920, 0x2aea9a00, 0x2b190000)
rw space 12288K, 53% used [0x2b190000, 0x2b804dd0, 0x2b804e00, 0x2bd90000)

Dynamic libraries:
0x00400000 - 0x00424000 C:\Programme\Java\jre6\bin\javaw.exe
0x7c910000 - 0x7c9c9000 C:\WINDOWS\system32\ntdll.dll
0x7c800000 - 0x7c908000 C:\WINDOWS\system32\kernel32.dll
0x77da0000 - 0x77e4a000 C:\WINDOWS\system32\ADVAPI32.dll
0x77e50000 - 0x77ee2000 C:\WINDOWS\system32\RPCRT4.dll
0x77fc0000 - 0x77fd1000 C:\WINDOWS\system32\Secur32.dll
0x7e360000 - 0x7e3f1000 C:\WINDOWS\system32\USER32.dll
0x77ef0000 - 0x77f39000 C:\WINDOWS\system32\GDI32.dll
0x7c340000 - 0x7c396000 C:\Programme\Java\jre6\bin\msvcr71.dll
0x6d800000 - 0x6da8b000 C:\Programme\Java\jre6\bin\client\jvm.dll
0x76af0000 - 0x76b1e000 C:\WINDOWS\system32\WINMM.dll
0x6d7b0000 - 0x6d7bc000 C:\Programme\Java\jre6\bin\verify.dll
0x6d330000 - 0x6d34f000 C:\Programme\Java\jre6\bin\java.dll
0x6d290000 - 0x6d298000 C:\Programme\Java\jre6\bin\hpi.dll
0x76bb0000 - 0x76bbb000 C:\WINDOWS\system32\PSAPI.DLL
0x6d7f0000 - 0x6d7ff000 C:\Programme\Java\jre6\bin\zip.dll
0x10000000 - 0x1004e000 C:\Programme\VTK\VTKBin\bin\Release\vtkCommonJava.dll
0x02fd0000 - 0x0316c000 C:\Programme\VTK\VTKBin\bin\Release\vtkCommon.dll
0x03180000 - 0x031b5000 C:\Programme\VTK\VTKBin\bin\Release\vtksys.dll
0x71a10000 - 0x71a27000 C:\WINDOWS\system32\WS2_32.dll
0x77be0000 - 0x77c38000 C:\WINDOWS\system32\msvcrt.dll
0x71a00000 - 0x71a08000 C:\WINDOWS\system32\WS2HELP.dll
0x78520000 - 0x785c3000 C:\WINDOWS\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_6f74963e\MSVCR90.dll
0x78480000 - 0x7850e000 C:\WINDOWS\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_6f74963e\MSVCP90.dll
0x71a30000 - 0x71a3a000 C:\WINDOWS\system32\WSOCK32.dll
0x03230000 - 0x032a9000 C:\Programme\VTK\VTKBin\bin\Release\vtkFilteringJava.dll
0x032c0000 - 0x034c4000 C:\Programme\VTK\VTKBin\bin\Release\vtkFiltering.dll
0x034e0000 - 0x0351f000 C:\Programme\VTK\VTKBin\bin\Release\vtkIOJava.dll
0x03530000 - 0x0383a000 C:\Programme\VTK\VTKBin\bin\Release\vtkIO.dll
0x03850000 - 0x0386b000 C:\Programme\VTK\VTKBin\bin\Release\vtkDICOMParser.dll
0x03880000 - 0x038a1000 C:\Programme\VTK\VTKBin\bin\Release\vtkNetCDF.dll
0x038c0000 - 0x0392f000 C:\Programme\VTK\VTKBin\bin\Release\vtkmetaio.dll
0x03940000 - 0x03952000 C:\Programme\VTK\VTKBin\bin\Release\vtkzlib.dll
0x03970000 - 0x0398c000 C:\Programme\VTK\VTKBin\bin\Release\vtkpng.dll
0x039a0000 - 0x039be000 C:\Programme\VTK\VTKBin\bin\Release\vtkjpeg.dll
0x039d0000 - 0x03a17000 C:\Programme\VTK\VTKBin\bin\Release\vtktiff.dll
0x03a30000 - 0x03a4c000 C:\Programme\VTK\VTKBin\bin\Release\vtkexpat.dll
0x73ac0000 - 0x73ad7000 C:\WINDOWS\system32\AVIFIL32.dll
0x774b0000 - 0x775ed000 C:\WINDOWS\system32\ole32.dll
0x77bb0000 - 0x77bc5000 C:\WINDOWS\system32\MSACM32.dll
0x75ec0000 - 0x75ee1000 C:\WINDOWS\system32\MSVFW32.dll
0x7e670000 - 0x7ee91000 C:\WINDOWS\system32\SHELL32.dll
0x77f40000 - 0x77fb6000 C:\WINDOWS\system32\SHLWAPI.dll
0x773a0000 - 0x774a3000 C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83\COMCTL32.dll
0x03a80000 - 0x03ab1000 C:\Programme\VTK\VTKBin\bin\Release\vtkImagingJava.dll
0x03ac0000 - 0x03cef000 C:\Programme\VTK\VTKBin\bin\Release\vtkImaging.dll
0x03d00000 - 0x03d7f000 C:\Programme\VTK\VTKBin\bin\Release\vtkGraphicsJava.dll
0x03d90000 - 0x041ac000 C:\Programme\VTK\VTKBin\bin\Release\vtkGraphics.dll
0x041c0000 - 0x041e7000 C:\Programme\VTK\VTKBin\bin\Release\vtkverdict.dll
0x04200000 - 0x04260000 C:\Programme\VTK\VTKBin\bin\Release\vtkRenderingJava.dll
0x04390000 - 0x04694000 C:\Programme\VTK\VTKBin\bin\Release\vtkRendering.dll
0x046a0000 - 0x046ad000 C:\Programme\VTK\VTKBin\bin\Release\vtkftgl.dll
0x5f0d0000 - 0x5f19c000 C:\WINDOWS\system32\OPENGL32.dll
0x68fc0000 - 0x68fe0000 C:\WINDOWS\system32\GLU32.dll
0x736d0000 - 0x7371b000 C:\WINDOWS\system32\DDRAW.dll
0x73b30000 - 0x73b36000 C:\WINDOWS\system32\DCIMAN32.dll
0x046c0000 - 0x04718000 C:\Programme\VTK\VTKBin\bin\Release\vtkfreetype.dll
0x6d360000 - 0x6d366000 C:\Programme\Java\jre6\bin\jawt.dll
0x6d000000 - 0x6d14a000 C:\Programme\Java\jre6\bin\awt.dll
0x72f70000 - 0x72f96000 C:\WINDOWS\system32\WINSPOOL.DRV
0x76330000 - 0x7634d000 C:\WINDOWS\system32\IMM32.dll
0x04c40000 - 0x04c5b000 C:\Programme\VTK\VTKBin\bin\Release\vtkVolumeRenderingJava.dll
0x04c70000 - 0x05041000 C:\Programme\VTK\VTKBin\bin\Release\vtkVolumeRendering.dll
0x5b0f0000 - 0x5b128000 C:\WINDOWS\system32\uxtheme.dll
0x746a0000 - 0x746ec000 C:\WINDOWS\system32\MSCTF.dll
---------------------------------------------------------------------------------------------------------------------------

Ich schreibe nur
Code:
vtkDICOMImageReader dicomReader= new vtkDICOMImageReader();
dicomReader.SetDirectoryName("C:/Dokumente und Einstellungen/Desktop/CT_2800_Files");
dicomReader.Update();
und bei mehr als 1300 bekomme ich diese Fehlermeldund.
Für kleinere Datensätze läuft alles ohne Fehler.


danke
 
hallo DerSpud,

der Reader erwartet einen Verzeeichnis
Code:
dicomReader.SetDirectoryName("d:/test");
wo er die DICOM Daten einlesen soll. Mit 2 Verzeichnisse wurde es nicht klappen.

Du kannst ja zwei Reader-Objekte erzeugen, welche jeweils ein Verzeichnis einlesen.
Code:
vtkDICOMImageReader dicomReader1= new vtkDICOMImageReader();
vtkDICOMImageReader dicomReader2= new vtkDICOMImageReader();
dicomReader1.SetDirectoryName("C:/CT_0_1299");
dicomReader2.SetDirectoryName("C:/CT_1300_2800");
dicomReader1.Update();
dicomReader2.Update();

Die Outputs der beiden Reader könntest du mit einem Filter wieder zusammensetzen. Die Daten aus dem zweiten Reader musst du wahrscheinlich noch um die "Dicke" des ersten in der Z-Achse verschieben, da ich annehme das nach dem Einlesen beide Datensätze bei Z=0 anfangen werden.
 
hallo DerSpud,

ich weiss nicht ob das funktioniert ausserdem musste ich dann dann jedesmal gucken ob ich sehr viele Schichten habe und dann die Dateien trennen.
Jetzt versuche anders ich lade meine Daten als RAW Daten und benutze die Klasse vtkImageReader statt die DICOM Dateien mit der Klasse vtkDICOMImageReader.
Und das gute ist, ich kann alle Daten einlesen. Aber das Ergebniss sieht anders aus, das Bild ist viel heller als wenn ich die DICOM Dateien einlese.
hast du da eine Ahnung ????
Das wäre vielleicht die bessere Lösung.

vielen dank;D
 
Zuletzt bearbeitet:
Hast recht, das ist die bessere Lösung ;)

Kuck dir mal die Skalarwerte bestimmter Pixel, einmal mit DICOMReader und einmal mit ImageReader eingelesen, an. Wenn die sich unterscheiden, macht der DICOMReader wahrscheinlich eine Anpassung anhand der im DICOM-Header abgespeicherten Window/Level Informationen.

Entscheidend ist auch der Skalar-Typ des Reader-Outputs. Ist das der gleiche Typ? DICOM-Bilder haben meist 12bit, d.h. du brauchst min. einen 16Bit Datentyp. Ich weiß nicht ob das der ImageReader alles automatisch einstellt. Da ist der DICOMReader im Vorteil, da er den Header zum Teil ausliest.

Wie die Bilder letztendlich angezeigt werden hängt auch von der ImageView ab, hier kannst du auch nochmal Level und Window (Helligkeit/Kontrast) einstellen, da ja die 12bit auf die 8bit deines Monitors abgebildet werden müssen, kann also durchaus sein das nur die Darstellung unterschiedlich ist.
 
Hallo DerSpud,

ich dachte das wäre die perfekte Lösung.
Die RAW Daten sind von Type Short aber egal was ich mache die Ergenbisse sind immer sehr hell. Ich habe versucht die Daten als char zu benutzen aber das ändert nichts.
Ich habe aufgegeben. ich danke dir für deine Hilfe.

mfg
Zeitreisender
 
Zurück
Oben Unten