(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