"Programowanie dla Fizyków Medycznych"/DICOM: Różnice pomiędzy wersjami
Linia 213: | Linia 213: | ||
filename="C:/Users/user/Documents/z_programowanie/DICOM/LADJAN_MRI/localizer - 1/IM-0001-0001.dcm" | filename="C:/Users/user/Documents/z_programowanie/DICOM/LADJAN_MRI/localizer - 1/IM-0001-0001.dcm" | ||
dataset = dcm.dicomio.read_file(filename) | dataset = dcm.dicomio.read_file(filename) | ||
+ | print(dataset) | ||
+ | </source> | ||
+ | |||
+ | Obiekt '''dataset''' ma strukturę trochę podobną do słownika. Składa się z elementów typu '''pydicom.dataelem.DataElement'''. Do elementów można się dostać na różne sposoby: korzystając z nazwy elementu, korzystając z numeru (a ściślej krotki z dwóch numerów wypisywanych zwykle w systemie szesnastkowym). | ||
+ | <source lang = 'python'> | ||
+ | print(dataset.StudyDate) | ||
+ | print(dataset[(0x8, 0x20)]) | ||
+ | element=dataset.data_element('StudyDate') | ||
+ | print(element.value) | ||
+ | </source> | ||
+ | |||
+ | Aby dowiedzieć się, jakie elementy wchodzą w skład danego pliku dicomowskiego, można użyć metody '''dir'''. Jeśli jako argument poda się string, zostanie wypisana lista tylko tych nazw elementów, które zawierają ten string. | ||
+ | <source lang='python'> | ||
+ | lista1= dataset.dir('pat') | ||
+ | print lista1 | ||
+ | for de in lista1: | ||
+ | print(dataset.data_element(de)) | ||
+ | </source> | ||
+ | |||
+ | Dane o pacjencie mogę pozmieniać lub usunąć. | ||
+ | |||
+ | <source lang='python'> | ||
+ | dataset.StudeDate='20180111' #dzisiejsza data | ||
+ | lista2 = ['PatientAge', | ||
+ | 'PatientBirthDate', | ||
+ | 'PatientID', | ||
+ | 'PatientName', | ||
+ | 'PatientPosition', | ||
+ | 'PatientSex', | ||
+ | 'PatientWeight'] | ||
+ | for de in lista2: | ||
+ | if type(dataset.data_element(de).value)==str: | ||
+ | dataset.data_element(de).value='nic' | ||
+ | if 'float' in str(type(dataset.data_element(de).value)): | ||
+ | dataset.data_element(de).value=0 | ||
</source> | </source> |
Wersja z 10:30, 11 sty 2018
powrót: Programowanie dla fizyków medycznych
Spis treści
Struktura plików DICOM
Prace nad ustandaryzowaniem wymiany danych graficznych pomiędzy urządzeniami medycznymi rozpoczęły się już w 1983 w ramach współpracy American College of Radiology (ACR) i National Electrical Manufactures Association (NEMA). Pierwsza wersja standardu pojawiła się dwa lata później i nosiła nazwę ACR/NEMA 300 V1.0. Wersja ta umożliwiała zapis danych w odpowiednim formacie oraz ujednolicony sposób transferu plików za pomocą sieci lub nośników zewnętrznych. W 1988 roku pojawiła się druga wersja standardu ACR/NEMA V2.0, która opierała się na ujednoliconej terminologii, strukturze informacji odpowiednim kodowaniu danych. Wraz z rozwijaniem standardów pojawiały się nowe zapotrzebowania. Ostatni oficjalna wersja to DICOM 3.0 (Digital Imaging and COmmunications in Medicine) z 1992. Standard ten jest w dalszym ciągu uaktualniany.
Dokumentacja
Standard DICOM jest zorganizowany w postaci wieloczęściowego dokumentu (Rys. %i 1) i uaktualniany corocznie w postaci Suplementów.
Obejrzyj stronę domową standardu DICOM: http://dicom.nema.org/, w szczególności: Strategic Document & Principal Contacts
Poszczególne dokumenty są poświęcone strukturze danych, sposobom kodowania, archiwizacji, wymiany informacji oraz aspektom bezpieczeństwa danych. Na zajęciach skupimy się na następujących częściach dokumentacji:
- PS 3.1: Introduction and Overview – wprowadzenie oraz informacje podstawowe na temat standardu
- PS 3.2: Conformance – definicje podstawowych zasad oraz pojęć
- PS 3.3: Information Object Definitions – definicje atrybutów czyli informatyczna reprezentacja fizycznych danych
- PS 3.4: Service Class Specifications – obsługa informatycznych reprezentacji danych
- PS 3.5: Data Structure and Encoding – struktura danych oraz sposób ich kodowania
- PS 3.6: Data Dictionary – spis wszystkich możliwych atrybutów
DICOM-Meta-Information-Header
Dane zawarte w każdym pliku DICOM podzielone są na dwie części:
- część zawierającą informacje o pliku (Dicom-Meta-Information-Header)
- dane jednego obiektu Service-Object Pair Instance (Dicom-Data-Set)
Model informacji określa format danych dla różnych typów informacji, takich jak: obrazy, przebiegi czasowe, obiekty graficzne, raporty, wydruki itp. Dane są grupowane w tematycznych zbiorach (ang. Entities) oraz podzbiorach (ang. Modules). Każdy moduł tworzony jest przez zbiór atrybutów.
- podstawowa jednostka danych: Data Element
- strumień informacji: Data Set
Data Element stanowi podstawową jednostkę danych, opisywany jest przy pomocy:
- identyfikatora elementu danych (Tag) złożonego z dwóch liczb określających: grupę (Group) oraz element grupy (Element), zapisywanych w postaci liczb heksadecymalnych,
- typu danych (Value Representation), określonego w postaci pary liter w kodzie ASCII i umożliwiającego poprawną interpretację danych,
- rozmiaru elementu (Value Length) wyrażonego w bajtach,
- informacji takich jak: nazwisko pacjenta, rozdzielczość obrazu
Strumień informacyjny (Data Set) jest uporządkowanym strumieniem elementów danych.
Zadanie 1. Na stronie http://northstar-www.dartmouth.edu/doc/idl/html_6.2/DICOM_Attributes.html można znaleźć wygodny opis możliwych pól i odpowiadających im reprezentacji danych. Na tej podstawie znajdź wyjaśnienie następujących oznaczeń:
- (0008,0020): 20120510
- (0008,0030): 101714
- (0008,0060): MG
- (0008,0070): SIEMENS
- (0008,0080): Ovarian Screening, St Barts
- (0010,0010): xxx
- (0010,0040): 0
Rozwiązanie:
- (0008,0020): 20120510 - Study Date
- (0008,0030): 101714 - Study Time
- (0008,0060): MG - Modality
- (0008,0070): SIEMENS - Manufacturer
- (0008,0080): Ovarian Screening, St Barts - Institution Name
- (0010,0010): xxx - Patient's Name
- (0010,0040): 0 - Patient's Sex
Zadanie 2. 56-letnia Janina Kowalska zgłosiła się do Centrum Onkologii z podejrzeniem nowotworu mózgu. 15 lutego 2013 roku zostało wykonanie badanie za pomocą pozytonowej tomografii emisyjnej wykonane na tomografie firmy GE. W czasie badania pacjentka leżała na prawym boku. Za pomocą odpowiednich atrybutów zapisz te informacje w formie pliku DICOM.
Rozwiązanie:
- (0010,0010): Kowalska Janina
- (0010,0040): F
- (0010,1010): 56
- (0008,0080): Centrum Onkologii
- (0008,0020): 20130215
- (0008,0060): PT
- (0008,0070): GE
- (0018,5100): HFDR
Biblioteka PyDICOM
Wczytaj plik w formacie DICOM, zawierający skan MRI wraz z informacjami na temat pacjenta i badania. Powstanie w ten sposób obiekt dataset typu pydicom.dataset.FileDataset.
import pydicom as dcm
filename="C:/Users/user/Documents/z_programowanie/DICOM/LADJAN_MRI/localizer - 1/IM-0001-0001.dcm"
dataset = dcm.dicomio.read_file(filename)
print(dataset)
Obiekt dataset ma strukturę trochę podobną do słownika. Składa się z elementów typu pydicom.dataelem.DataElement. Do elementów można się dostać na różne sposoby: korzystając z nazwy elementu, korzystając z numeru (a ściślej krotki z dwóch numerów wypisywanych zwykle w systemie szesnastkowym).
print(dataset.StudyDate)
print(dataset[(0x8, 0x20)])
element=dataset.data_element('StudyDate')
print(element.value)
Aby dowiedzieć się, jakie elementy wchodzą w skład danego pliku dicomowskiego, można użyć metody dir. Jeśli jako argument poda się string, zostanie wypisana lista tylko tych nazw elementów, które zawierają ten string.
lista1= dataset.dir('pat')
print lista1
for de in lista1:
print(dataset.data_element(de))
Dane o pacjencie mogę pozmieniać lub usunąć.
dataset.StudeDate='20180111' #dzisiejsza data
lista2 = ['PatientAge',
'PatientBirthDate',
'PatientID',
'PatientName',
'PatientPosition',
'PatientSex',
'PatientWeight']
for de in lista2:
if type(dataset.data_element(de).value)==str:
dataset.data_element(de).value='nic'
if 'float' in str(type(dataset.data_element(de).value)):
dataset.data_element(de).value=0