(Dicom-Data-Set).

Transkrypt

(Dicom-Data-Set).
Przetwarzanie obrazów medycznych
Wykład
DICOM
dr inż. Robert Kazała
DICOM - Wprowadzenie
●
Digital Imaging and COmmunication in Medicine
Film and Network
[Communication protocol]
Images and Media
[File format]
24.05.2014
dr inż Robert Kazała
2
DICOM
●
●
●
Wraz z rozwojem tomografii komputerowej w latach
siedemdziesiątych konieczne stało się opracowanie standardu
umożliwiającego wymianę informacji graficznych oraz
towarzyszących im danych medycznych między różnymi
urządzeniami i systemami informatycznymi.
Pierwszy zarys standardu został opracowany w 1983 roku
przez American College of Radiology (ACR) oraz National
Electrical Manufacturers Association (NEMA) i został
opublikowany pod nazwą ACR-NEMA Standards Publication
No. 300-1985.
W 1988 roku powstała druga wersja dokumentu, zaś w 1993
roku powstała wersja trzecia, znacznie rozbudowana i
uzupełniona o nowe możliwości. Zmieniono wówczas nazwę
standardu na Digital Imaging and Communications in Medicine
– DICOM.
24.05.2014
dr inż Robert Kazała
3
DICOM
●
●
●
●
Standard DICOM powstał w celu popularyzacji cyfrowej wymiany danych,
ułatwienia tworzenia oraz rozbudowy systemów archiwizacji obrazów
PACS (ang. Picture Archiving and Comunication Systems) oraz wymiany
informacji medycznych z innymi systemami informatycznymi stosowanymi
w medycynie (ang. Hospital Information System – HIS).
DICOM jest uzupełnieniem standardu Health Level Seven – HL7 o zasady
komunikacji i wymianę obrazów w medycynie, nie występujących w
normie HL7 .
Osoby zainteresowane analizą danych medycznych bardzo szybko
spotkają się z plikami DICOM.
Obecnie istnieje duża liczba różnego rodzaju oprogramowania, które
umożliwia wgląd do plików DICOM. Przykładowo program Matlab posiada
funkcje umożliwiające analizę (dicominfo) oraz wczytywanie (dicomread)
danych medycznych z plików DICOM. Jednak po odczycie bardzo szybko
okazuje się, że informacji jest tak dużo, że ich analiza jest bardzo trudna.
24.05.2014
dr inż Robert Kazała
4
DICOM - specyfikacje
●
Dokumentacja opisująca DICOM jest redagowana przez NEMA Diagnostic Imaging and Therapy Systems
Division i dostępna w postaci zestawu następujących dokumentów:
–
PS 3.1: Introduction and Overview – zawiera wprowadzenie oraz informacje podstawowe na temat standardu
–
PS 3.2: Conformance – zawiera definicje podstawowych zasad oraz pojęć
–
PS 3.3: Information Object Definitions – definiuje informatyczną reprezentację fizycznych danych – format danych, w
postaci zbiorów parametrów (ang. Data Elements)
–
PS 3.4: Service Class Specifications – definiuje metody służące do obsługi informatycznych reprezentacji danych
–
PS 3.5: Data Structure and Encoding – określa sposób kodowania oraz niezbędne struktury wymagane do budowy
pełnej informacji o rzeczywistej informacji medycznej
–
PS 3.6: Data Dictionary – zawiera tzw. słownik danych, czyli spis wszystkich możliwych informacji występujących w
standardzie wraz z ich nazwą oraz kodami liczbowymi umożliwiającymi identyfikację danych
–
PS 3.7: Message Exchange – definiuje sposób wymiany informacji między aplikacjami
–
PS 3.8: Network Communication Support for Message Exchange – dokument definiuje sposób wymiany informacji
między aplikacjami DICOM z wykorzystaniem protokołu TCP/IP. Standard DICOM wykorzystuje warstwową strukturę
modelu ISO OSI
–
PS 3.10: Media Storage and File Format for Data Interchange – opisuje model archiwizacji danych na nośnikach
zewnętrznych. Dokument ten był podstawowym źródłem informacji na temat struktury danych na płycie CD zawierającej
dane z tomografii komputerowej
–
PS 3.11: Media Storage Application Profiles – określa wymagania stawiane aplikacjom gromadzącym dane w
standardzie DICOM
–
PS 3.12: Storage Functions and Media Formats for Data Interchange – definiuje funkcje, nośniki oraz sposoby wymiany
danych
–
PS 3.14: Grayscale Standard Display Function – określa sposoby prezentacji danych graficznych, np. sposoby kalibracji
monitorów
–
PS 3.15: Security Profiles – opisuje aspekty bezpieczeństwa danych
–
PS 3.16: Content Mapping Resource – definiuje szablony obiektów używanych w standardzie
24.05.2014
dr inż Robert Kazała
5
DICOM - opis
●
●
●
●
Standard DICOM powstał w celu odzwierciedlenia
rzeczywistych informacji medycznych w postaci
spójnego systemu informatycznego.
Rysunek zaczerpnięty z dokumentu PS 3.3,
przedstawia model rzeczywistych danych
zaimplementowany w standardzie DICOM.
Model przedstawia sposób łączenia różnych
informacji medycznych oraz zależności
występujące między nimi.
Wartości liczbowe obok strzałek określają możliwą
liczbę połączeń między informacjami.
24.05.2014
dr inż Robert Kazała
6
DICOM - model
24.05.2014
dr inż Robert Kazała
7
DICOM - informacje
●
Do najistotniejszych informacji można zaliczyć:
–
dane pacjenta (ang. patient), takie jak dane personalne, data urodzenia itp.
–
badania (ang. study), na które składają się dane o pacjencie, dane na
temat wizyt (ang. visit) oraz inne informacje opisujące badanie (ang. study
content notification). Study gromadzą informacje na temat: elementów
składowych badań (ang. study components) oraz procedur (ang. modality
performed procedure steps), a także wyniki badań (ang. results) w postaci
raportu (ang. raport) oraz poprawek (ang. amendment). Każde badanie
zawiera przynajmniej jedną serię danych.
–
serie danych służą do gromadzenia informacji uzyskanych podczas
badania. Do informacji tych zalicza się między innymi: obrazy (ang. image),
dane nieprzetworzone (ang. raw data), bitową płaszczyzna notatek (ang.
overlay), tablicę kolorów (ang. lookup table) czy krzywe opisane ciągiem
punktów (ang. curve). Przykładem serii danych jest zestaw danych (slajdów)
przedstawiających przekroje przez ciało pacjenta, otrzymane podczas
rekonstrukcji danych CT dla konkretnych parametrów rekonstrukcji (np.
rozdzielczość, odległość między przekrojami, filtr rekonstrukcji, czy parametry
okna).
24.05.2014
dr inż Robert Kazała
8
DICOM – powiązanie danych
24.05.2014
dr inż Robert Kazała
9
DICOM - budowa
●
●
●
DICOM został przystosowany do sieciowej
wymiany informacji (on-line) w architekturze
klient-serwer, poprzez protokół TCP/IP oraz do
współpracy z nośnikami wymiennymi (off-line),
takimi jak dyskietki, dyski CD czy MOD.
Wymiana danych na tych nośnikach odbywa się
poprzez systemy plików ISO 9660 oraz FAT16.
Dodatkowo dla nośników fizycznych tworzony
jest plik DICOMDIR przechowujący informację o
wszystkich plikach DICOM na nośniku.
24.05.2014
dr inż Robert Kazała
10
DICOM - budowa
24.05.2014
dr inż Robert Kazała
11
DICOM - budowa
●
●
●
●
Dla metod wymiany danych, zdefiniowano wspólną
reprezentację danych (format danych, ang. Information Object,
dokument PS 3.3) oraz rodzaje usług-serwisów (ang. Service
Classes, PS 3.4) opisujących sposób współdziałania aplikacji.
Współpraca aplikacji polega na wymianie specyficznych
rozkazów (ang. DICOM Commands, PS 3.7). Dokładnie
zdefiniowany jest poziom zgodności – wyszczególniono, jakie
informacje muszą być zawarte w konkretnych przypadkach (PS
3.7, 3.8 i 3.10).
Aby komunikacja była możliwa, dwa połączone systemy ustalają
role jakie będą pełnić podczas komunikacji. Określają, który
system jest serwerem danych (ang. Service Class Provider SCP), a który klientem (ang. Service Class User - SCU).
Określają również metodę kodowania przesyłanych danych (little
endian, big endian, JPG itp.).
24.05.2014
dr inż Robert Kazała
12
DICOM – model informacji
●
●
Wprowadzono jasno sprecyzowany i dokładnie
określony model informacji (ang. Information
Objects Definition – IOD, dokument PS 3.3),
określający format danych dla różnych typów
informacji, takich jak: obrazy, przebiegi czasowe,
obiekty graficznych, raporty, wydruki itp.
Model informacji IOD grupuje dane w
tematycznych zbiorach, zwanych Entities oraz
podzbiorach zwanych modułami. Każdy moduł
tworzony jest przez zbiór atrybutów.
24.05.2014
dr inż Robert Kazała
13
DICOM – budowa obiektu IOD
24.05.2014
dr inż Robert Kazała
14
DICOM – Data Element
●
Atrybut jest opisywany formatem elementu danych tzw.
Data Element, zdefiniowanym w słowniku danych (PS 3.6)
i stanowi podstawową jednostkę danych. Data Element
opisywany jest przy pomocy:
–
identyfikatora elementu danych (ang. Tag) złożonego z dwóch
liczb określających: grupę (ang. Group) oraz element grupy
(ang. Element), zapisywanych w postaci liczb
heksadecymalnych,
–
typu danych (ang. Value Representation), określonego w
postaci pary liter w kodzie ASCII i umożliwiającego poprawną
interpretację danych,
–
rozmiaru elementu (ang. Value Length) wyrażonego w
bajtach,
–
informacji takich jak: nazwisko pacjenta, rozdzielczość obrazu
itp.
24.05.2014
dr inż Robert Kazała
15
DICOM – Data Set
●
●
Strumień informacyjny (ang. Data Set) jest
uporządkowanym strumieniem elementów danych (ang.
Data Element) co przedstawiono na rysunku 5.
Norma w dokumencie PS 3.3 w pełni opisuje katalog
typów danych, rodzaju danych, itp.
24.05.2014
dr inż Robert Kazała
16
DICOM – Service Element
●
●
●
●
●
Oprócz definicji obiektu danych istotne jest skojarzenie z nim
elementu usługi czyli tzw. Service Element.
Obiekt Service-Obiect Pair (SOP) łączy dane z serwisami i definiuje
różne usługi związane z modelem informacji IOD. W
standardzie DICOM wprowadzono również techniki umożliwiające
jednoznaczną identyfikację oraz ochronę danych (PS 3.15),
pozwalające na sprecyzowanie zależności między danymi, np.
podczas transmisji przez sieć.
Norma nie definiuje szczegółów implementacji, wymogów
dotyczących możliwości i funkcji urządzeń oraz sposobu testowania,
czy zatwierdzania zgodności konkretnej implementacji ze standardem
DICOM.
Z tego też powodu zdarza się, że dwa różne urządzenia, będące
zgodnie ze standardem DICOM, nie są zdolne do wymiany informacji!
Jest to przejawem walki różnych producentów o wpływy na rynku.
24.05.2014
dr inż Robert Kazała
17
DICOM – nośniki fizyczne
●
●
Dane będące wynikiem badania CT mogą być
zapisane na płycie CD-R w standardzie DICOM.
Zawartość płyty zdefiniowana jest w dokumentacji
standardu w dokumencie PS 3.10.
24.05.2014
dr inż Robert Kazała
18
DICOM – nośniki fizyczne
●
●
●
Fizyczny nośnik danych zawiera pliki w formacie opisanym w
obiekcie DICOM File Format. Obiekt służy do przechowywania
informacji w postaci plików. Każdy plik zawiera informację na temat
jednego obiektu Service-Obiect Pair instance (SOP instance) oraz
informacje o pliku, tzw. DICOM File Meta Information.
Każdy obiekt DICOM File Meta Information zbudowany jest ze 128
bajtowej preambuły wypełnionej zerami, identyfikatora pliku DICOM
(ang. DICOM prefix) zawierającego czteroliterowy ciąg liter „DICM”
oraz zestawu elementów danych (ang. Data Element) opisujących
plik. Elementy te mają identyfikator postaci (0002,xxxx).
Po elementach danych należących do informacji o pliku (DICOM File
Meta Information), znajduje się zakodowany zgodnie z dokumentem
PS 3.5 ciąg elementów danych (DICOM Data Set) prezentujący
jeden obiekt Service- Obiect Pair instance. Obiektem SOP może być
np. jeden slajd CT (obraz jednej rekonstrukcji danych CT) lub obiekt
opisujący dane na nośniku, tworzący plik DICOMDIR.
24.05.2014
dr inż Robert Kazała
19
DICOM – nośniki fizyczne
●
●
●
Nośnik fizyczny zawiera katalogi z plikami, w
których to znajdują się właściwe informacje
medyczne.
Oprócz nich zawsze zapisywany jest specjalny
plik o nazwie DICODIR, opisujący zawartość
nośnika.
Rysunek przedstawia zawartość pliku DICOMDIR
oraz sposób powiązania zawartości z innymi
plikami na nośniku.
24.05.2014
dr inż Robert Kazała
20
DICOM – nośniki fizyczne
24.05.2014
dr inż Robert Kazała
21
DICOM – nośniki fizyczne
●
●
●
Plik DICOMDIR zawiera informacje na temat wszystkich plików na
nośniku. Niektóre Data Elements obiektów SOP znajdują się tylko
w pliku danych, a niektóre tylko w DICOMDIR. Dane w pliku
DICOMDIR powiązane są w hierarchiczne drzewo, którego
korzeniem są Direktory Information.
Kolejnym poziomem są dane o pacjentach, następnym badania,
potem serie, a na koniec obrazy. Przejścia między kolejnymi
poziomami zaznaczone są na rysunku pogrubioną linią, zaś
przejścia między obiektami na tym samym poziomie liniami z
numerami poziomów.
W obiektach zapisanych w DICOMDIR przechowywane są
wskaźniki do danych na tym samym i kolejnym poziomie. Dzięki
temu, możliwe jest szybkie przeszukiwanie danych w bardzo
dużych plikach. Każdy obiekt SOP zapisany w DICOMDIR posiada
również informację o pliku na nośniku (w postaci ścieżki dostępu
oraz nazwy), w którym znajduje się pełna informacja o nim.
24.05.2014
dr inż Robert Kazała
22
DICOM – pliki
●
●
●
Dane zawarte w każdym pliku DICOM podzielone są na dwie części:
–
część zawierającą informacje o pliku (Dicom-Meta-Information-Header) oraz
–
dane jednego obiektu Service-Obiect Pair Instance (Dicom-Data-Set).
Obydwie części zawierają dane w postaci strumienia informacji (ang. Data
Set), który jest uporządkowanym strumieniem elementów danych (ang. Data
Element). Strumień elementów danych można zaobserwować w
przytoczonym powyżej binarnym fragmencie pliku DICOM.
Informacje o pliku (Dicom-Meta-Information-Header) są wymagane dla
każdego pliku DICOM. Dokument PS 3.10 ściśle określa zawartość tej części
pliku. Część zawierająca dane (Dicom-Data-Set) przechowuje informacje o
jednym obiekcie typu Service-Obiect-Pair instance (SOP instance). Obiektem
tym może być np.: pojedynczy przekrój CT, pojedyncza klatka wirtualnej
bronchoskopii wygenerowana na aparacie CT lub opis zawartości nośnika,
tak jak ma to miejsce w przypadku pliku DICOMDIR.
24.05.2014
dr inż Robert Kazała
23
pydicom
●
●
●
pydicom jest biblioteką utworzoną w języku
Python służącą do przetwarzania plików DICOM
(generalnie pliki z obrazami medycznymi ale
także dane nie obrazowe takie jak np. informacje
o radioterapii).
Biblioteka nie jest przeglądarką plików
graficznych, ale jest przeznaczona do
odczytywania elementów danych DICOM jako
zmiennych języka Python i modyfikawania ich w
zależności od potrzeb za pomocą własnego kodu.
pydicom jest udostępniany na licencji MIT.
24.05.2014
dr inż Robert Kazała
24
pydicom - Datasets
●
Dataset is the base object in pydicom's object model.
●
The relationship between Dataset and other objects is:
Dataset (derived from python's dict)
---> contains DataElement instances
--> the value of the data element can be one of:
a regular value like a number, string, etc.
a list of regular values (e.g. a 3-D coordinate)
a Sequence instance
--> a Sequence is a list of Datasets (and so we come full circle)
24.05.2014
dr inż Robert Kazała
25
pydicom
●
●
●
Dataset is the main object you will work with directly.
Dataset is derived from python's dict, so it inherits (and
overrides some of) the methods of dict.
In other words it is a collection of key:value pairs,
where the key value is the DICOM (group,element) tag
(as a Tag object, described below), and the value is a
DataElement instance (also described below).
A dataset could be created directly, but you will usually
get one by reading an existing DICOM file:
>>> import dicom
●
>>> ds = dicom.read_file("rtplan.dcm") #
(rtplan.dcm is in the testfiles directory)
24.05.2014
dr inż Robert Kazała
26
pydicom
●
You can display the entire dataset by simply printing its string (str or repr) value:
>>> ds
(0008, 0012) Instance Creation Date
DA: '20030903'
(0008, 0013) Instance Creation Time
TM: '150031'
(0008, 0016) SOP Class UID
Storage
UI: RT Plan
(0008, 0018) SOP Instance UID
1.2.777.777.77.7.7777.7777.20030903150023
UI:
(0008, 0020) Study Date
DA: '20030716'
(0008, 0030) Study Time
TM: '153557'
(0008, 0050) Accession Number
SH: ''
(0008, 0060) Modality
CS: 'RTPLAN'
...
24.05.2014
dr inż Robert Kazała
27
pydicom
●
You can access specific data elements in a dataset by name
('keyword' in DICOM standard) or by DICOM tag number:
>>> ds.PatientName
'Last^First^mid^pre'
>>> ds[0x10,0x10].value
'Last^First^mid^pre'
●
●
In the latter case (using the tag number directly) a DataElement
instance is returned, so the .value must be used to get the value.
Using the keyword is preferred for more readable code, but
using tag numbers may be necessary for elements not in
pydicom's dictionaries (e.g. many private data elements).
24.05.2014
dr inż Robert Kazała
28
pydicom
●
You can also set values by name or tag number:
>>> ds.PatientID = "12345"
>>> ds.SeriesNumber = 5
>>> ds[0x10,0x10].value = 'TestName'
●
●
●
The use of names is possible because pydicom intercepts
requests for member variables, and checks if they are in the
DICOM dictionary.
It translates the name to a (group,element) number and returns
the corresponding value for that key if it exists.
The names are the descriptive text from the dictionary with
spaces and apostrophes, etc. removed.
24.05.2014
dr inż Robert Kazała
29
pydicom
●
DICOM Sequences are turned into python lists. Items in the
sequence are referenced by number, beginning at index 0 as per
python convention.
>>> ds.BeamSequence[0].BeamName
'Field 1'
>>> # Same thing with tag numbers (not as pretty!):
>>> ds[0x300a,0xb0][0][0x300a,0xc2].value
'Field 1'
>>> # yet another way, using another variable
>>> beam1 = ds.BeamSequence[0]
>>> beam1.BeamName, beam1[0x300a,0xc2].value
('Field 1', 'Field 1')
24.05.2014
dr inż Robert Kazała
30
pydicom
●
Since you may not always remember the exact name of a data
element, Dataset provides a handy dir() method, useful during
interactive sessions at the python prompt:
>>> ds.dir("pat")
['PatientBirthDate', 'PatientID', 'PatientName',
'PatientSetupSequence', 'PatientSex']
●
dir will return any DICOM tag names in the dataset that have
the specified string anywhere in the name (case insensitive).
Calling dir with no string will list all tag names available in the
dataset. You can also see all the names that pydicom knows
about by viewing the _dicom_dict.py file. You could modify that
file to add tags that pydicom doesn't already know about.
24.05.2014
dr inż Robert Kazała
31
pydicom
●
Under the hood, Dataset stores a DataElement object for each item, but when
accessed by name (e.g. ds.PatientName) only the value of that DataElement is
returned. If you need the whole DataElement (see the DataElement class
discussion), you can use Dataset's data_element() method or access the item
using the tag number:
>>> data_element = ds.data_element("PatientName")
data_element = ds[0x10,0x10]
>>> data_element.VR, data_element.value
was changed above
# or
# PatientName
('PN', 'TestName')
●
To check for the existence of a particular tag before using it, use the in keyword:
>>> "PatientName" in ds
True
24.05.2014
dr inż Robert Kazała
32
pydicom
●
To remove a data element from the dataset, use del:
>>> del ds.InstitutionName
>>> # OR del ds[0x0008,0x0080]
●
To work with pixel data, the raw bytes are available through the usual tag:
>>> ds = dicom.read_file("CT_small.dcm")
>>> pixel_bytes = ds.PixelData
●
but to work with them in a more intelligent way, use pixel_array (requires
the NumPy library):
>>> pix = ds.pixel_array
24.05.2014
dr inż Robert Kazała
33
pydicom - DataElement
●
●
The DataElement class is not usually used directly in
user code, but is used extensively by Dataset.
DataElement is a simple object which stores the
following things:
tag -- a DICOM tag (as a Tag object)
–
–
VR -- DICOM value representation -- various number
and string formats, etc
–
VM -- value multiplicity. This is 1 for most DICOM tags,
but can be multiple, e.g. for coordinates. You do not have
to specify this, the DataElement class keeps track of it
based on value.
–
value -- the actual value. A regular value like a number
or string (or list of them), or a Sequence.
24.05.2014
dr inż Robert Kazała
34
pydicom
●
●
●
The Tag class is derived from python's long, so in effect, it is just a number with some extra
behaviour:
Tag enforces that the DICOM tag fits in the expected 4-byte (group,element)
a Tag instance can be created from a long or from a tuple containing the (group,element)
separately:
>>> from dicom.tag import Tag
>>> t1=Tag(0x00100010) # all of these are equivalent
>>> t2=Tag(0x10,0x10)
>>> t3=Tag((0x10, 0x10))
>>> t1
(0010, 0010)
>>> t1==t2, t1==t3
(True, True)
●
●
Tag has properties group and element (or elem) to return the group and element portions
the is_private property checks whether the tag represents a private tag (i.e. if group number is
odd).
24.05.2014
dr inż Robert Kazała
35
pydicom + matplotlib
●
●
Matplotlib can take 2-d image information from
Dataset.pixel_array and display it.
Here is an example:
>>> import dicom
>>> import pylab
>>> ds=dicom.read_file("CT_small.dcm")
>>> pylab.imshow(ds.pixel_array,
cmap=pylab.cm.bone)
<matplotlib.image.AxesImage object at 0x0162A530>
>>> pylab.show()
>>>
24.05.2014
dr inż Robert Kazała
36
GDCM : Grassroots DICOM library
●
●
●
●
Grassroots DICOM (GDCM) jest implementacją standardu DICOM
stworzoną dla zapewnienia naukowcom bezpośredniego dostępu
do danych klinicznych.
GDCM zawiera definicje formatów plików i sieciowe protokoły
komunikacyjne.
GDCM jest projektem open source, zapewnia on w pewnym stopniu
kompatybilność z plikami ACR-NEMA 1.0 & 2.0 (raw files).
Biblioteka napisana jest w C++ i oferuje wrapery do następujących
języków:
–
Python (supported),
–
C# (supported),
–
Java (supported),
–
PHP (experimental),
–
Perl (experimental).
24.05.2014
dr inż Robert Kazała
37
GDCM – Formaty plików
●
●
GDCM implementuje część 5 standardu DICOM, opisującą
formaty plików obrazowych.
Celem projektantów biblioteki jest wspieranie możliwie wszystkich
formatów plików wykorzystywanych w standardzie DICOM:
–
RAW,
–
JPEG lossy 8 & 12 bits (ITU-T T.81, ISO/IEC IS 10918-1),
–
JPEG lossless 8-16 bits (ITU-T T.81, ISO/IEC IS 10918-1),
–
JPEG 2000 reversible & irreversible (ITU-T T.800, ISO/IEC IS 154441),
–
RLE,
–
Deflated (compression at DICOM Dataset level),
–
JPEG-LS (ITU-T T.87, ISO/IEC IS 14495-1),
–
–
JPEG 2000 Multi-component reversible & irreversible (ISO/IEC IS
15444-2) (not supported for now),
MPEG-2 (not supported for now).
24.05.2014
dr inż Robert Kazała
38
Literatura
●
http://dicom.nema.org/
●
http://home.agh.edu.pl/~socha/pmwiki/pmwiki.php/DICOM/Caly
●
http://pl.wikipedia.org/wiki/DICOM
●
http://code.google.com/p/pydicom/
●
http://gdcm.sourceforge.net/wiki/index.php/Main_Page
●
http://www.osirix-viewer.com/
●
http://www.k-pacs.net/
●
http://ginkgo-cadx.com/en/
●
http://sourceforge.net/projects/mito/
24.05.2014
dr inż Robert Kazała
39