Programowanie Fizyka Medyczna
Wykład VI
17 kwietnia 2012
Przypomnienie modułu PyDicom:
Podstawowe operacje: wczytywanie i zapisywanie plików,
Elementy Dicom Tag,
Wyszukiwanie elementu po tagu i krótkiej nazwie
Zmiana i usuwanie elementów.
Podstawy obsługi plików
Pylab = Python + MatLab + dużo więcej
Podstawowe informacje o module Matplotlib:
Klasa Figure i moduł matplotlib.figure
Klasa Axes i moduł matplotlib.axes
Klasa Line2D i moduł matplotlib.lines
Klasa Annotate i moduł matplotlib.text
Moduły matplotlib.cm i matplotlib.colors
Przypomnienie podstawowych informacji o PyDicom
dicom.read_file(s) wczytuje plik o ścieżce s i zwraca obiekt klasy dicom.dataset
ds = dicom.read_file("MR_small.dcm")
Wyświetlenie elementów słownika (dicom.dataset) możliwe jest przez wpisanie
jego nazwy w sesji interaktywnej lub polecenie
lista_kluczy = dir(ds)
które zwraca listę kluczy w danym słowniku.
Informacje w pliku dicom zorganizowane są w postaci mapowania pomiędzy
parą (krotką) liczb szestnastkowych tzw DICOM Tag, a pewną wartością.
(0008, 0008) Image Type CS: [b'DERIVED', b'SECONDARY', b'OTHER']
(0008, 0012) Instance Creation Date DA: b'20040826'
DICOM Tag Description nazwa typu pola wynikająca z jego znacznika/tagu
VR Value Record jakiego typu jest wartość pola (CS-string, DA - Date)
Lista znaczników (tagów) rozpoznawanych przez pakiet PyDicom znajduje się w
pliku w katalogu instalacji PyDicom
_dicom_dict.py
0x00080008: ('CS', '2-n', "Image Type", '', 'ImageType'),
2-n oznacza, ze pole ma długość od 2 do n znaków, czyli więcej niż jeden.
Programowanie FizMed, wykład 6 2
PyDicom cd.
Pola, które nie zostaną znalezione w ogólnym słowniku traktowane są jako
prywatne sekcje:
Private creator
(0009, 0000) Private Creator UL: 160
(0009, 0010) Private tag data LO: 'GEMS_IDEN_01'
(0021, 0000) Private Creator UL: 298
(0021, 0010) Private tag data LO: 'GEMS_RELA_01'
Na podstawie pola Private tag data można zidentyfikować wartości
specyficzne dla producenta urządzenia.
Lista znaczników zarezerwowanych dla producentów znajduje się w pliku:
_private_dict.py
Programowanie FizMed, wykład 6 3
Znajdowanie elementów
0x00080008: ('CS', '2-n', "Image Type", '', 'ImageType'),
0x00100010: ('PN', '1', "Patient's Name", '', 'PatientName'),
1. Odwołanie poprzez DicomTag, o ile go znamy jest to najprostszy sposób na
znajdowanie znanych typów elementów ze standardowego słownika.
de = ds[(0x0028,0x0102)] #<- wyciąga Tag ImageType
Pozwala na dostęp do wszystkich jego elementów
de.tag, de.value, de.VR, de.name, de.VM, de.description()
2. Odwołanie poprzez NamedTag, czyli krótką nazwę.
dev = ds.PatientName
Jest to odwołanie tylko do pola value.
3. Metoda get pozwala na dostęp do pola i zwrócenie domyślnej wartości w
przypadku, gdy takie pole nie istnieje.
ds.get("PatientName", "Jan^Kowalski")
Jeżeli istnieje pole "PatientName", jego wartość jest zwrócona tak jak w punkcie 2.
Jeżeli nie istnieje, metoda zwraca "Jan^Kowalski".
4. Jeżeli znamy nazwę elementu a chcemy dostać się do jego całości możemy użyć
metody data_element
de = ds.data_element("PatientName") # zwraca to samo co w 1.
Programowanie FizMed, wykład 6 4
Znajdowanie elementów metoda walk
Metoda walk należąca do klasy dicom.Dataset pozwala znalezć pola o
danej zawartości
ds.walk(callback_func)
callback_func jest nazwą funkcji, którą musimy sami napisać. Będzie
ona wywołana dla każdego znacznika (tagu) obecnego w pliku dicom
def moj_callb(mojds, mojel): #definiujemy własną funkcję
if mojel.VR == "CS": # wewnątrz niej możemy sprawdzić
print(mojel.value) # dowolny warunek
Powyższa funkcja moj_callb przyjmuje dwie zmienne, których możemy
wewnątrz niej używać. Piewsza z nich jest dynamicznie typowana na
dataset, druga na element.
W tym przykładzie wypisane zostaną wszystkie elementy, których typ
(VR) to "CS".
ds.walk(moj_callb) # wywołujemy metodę walk
Można też szukać elementy z konkretną zawartoscią
if mojel.value == "Szukana wartość":
print(mojel.VR)
Programowanie FizMed, wykład 6 5
Zapisywanie
Zmieniony dataset możemy zapisać pod nową nazwą:
ds.save_as(nazwa_pliku_wyjściowego)
nazwa_pliku_wyjściowego nie musi mieć rozszerzenia *.dcm
Proszę się upewnić, że mają Państwo prawo do zapisu w danym katalogu.
Programowanie FizMed, wykład 6 6
Podstawy obsługi plików
Podstawą czytania i zapisywania do dowolnego pliku jest utworzenie obiektu,
który będzie go reprezentował w programie tzw. "uchwytu"(handle).
Służy do tego funkcja open z biblioteki standardowej, która zwraca obiekt
będący reprezentacją pliku w naszym programie
fp = open('nazwapliku', 'rb')
'nazwapliku' jest nazwą pliku
'rb' jest trybem dostępu do pliku. Składa się maksymalnie z 3 znaków:
1) 'r' odczyt, 'w' zapis, 'a' append/dopisanie
2) 'b' dostęp w trybie binarnym (ignoruje znaki specjalne), 't' dostęp w trybie
tekstowym,
3) '+' - czytanie i pisanie.
Po zakończeniu używania pliku musimy go zamknąć (zwolnić uchwyt) funkcją
close.
fp.close()
Wszystkie operacje na pliku dokonywane są poprzez metody związane z
obiektem fp.
Programowanie FizMed, wykład 6 7
Podstawy obsługi plików - odczyt
fp = open('mojplik.txt', 'rt') #plik tekstowy otwarty do odczytu
#Odczyt pojedynczej linii
linia = fp.read()
#Odczyt wszystkich linii aż do końca pliku i umieszczenie ich w liście
lista_linii = fp.readlines()
#Odczyt n znaków
n_znakow = fp.read(n)
Możemy ustawić się na dowolnej pozycji w pliku instrukcją seek
fp.seek(numerznaku)
Aby sprawdzić, w którym miejscu jesteśmy możemy użyć funkcji tell.
fp.tell()
#Proszę pamiętać o zamknięciu pliku
fp.close()
Programowanie FizMed, wykład 6 8
Podstawy obsługi plików - zapis
fp = open('mojplik.txt', 'wt') #plik tekstowy otwarty do zapisu
#Zapis ciągu znaków 'abrakadabra'
fp.write("abrakadabra")
#Proszę pamiętać o znakach CR, CR/LF, aby przejść do nowej linii
# Poprawny znak końca linii jest zapisany w module os
fp.write(os.linesep)
#Jeżeli chcemy upewnić się, że dane trafiły z cache systemu na dysk
możemy użyć funkcji flush.
fp.flush()
#Proszę pamiętać o zamknięciu pliku, co automatycznie wywołuje flush.
fp.close()
Programowanie FizMed, wykład 6 9
Matplotlib - http://matplotlib.sourceforge.net/
Matplotlib jest zbiorem bibliotek i procedur umożliwiającym wykonywanie wykresów i
rysunków w Pythonie. Używany jest także przez Sage.
Składa się z modułów
matplotlib.pylab
(MatLab)
matplotlib.patches
pyplot+numpy
matplotlib.axes
matplotlib.collections
matplotlib.lines
matplotlib.cm
matplotlib
matplotlib.color
matplotlib.figure
matplotlib.ticker
matplotlib.artist
matplotlib.text
matplotlib.image
Programowanie FizMed, wykład 6 10
Matplotlib
Importowanie głównej części modułu:
import matplotlib
Importowanie części składowych na przykład
import numpy as np # numpy nie jest częścią matplotlib, ale bez
#niego nie da się używać większości funkcji
import matplotlib.pyplot as mpl
Jeżeli nie chcemy za każdym razem odwoływać się poprzez pełną
ścieżkę matplotlib.pyplot lub numpy możemy utworzyć swoją
skróconą nazwę - alias. Tworzymy w ten sposób oddzielną przestrzeń
nazw (namespace) o nazwie mpl dla matplotlib.pyplot i np dla numpy.
Jest to przydatne, gdy korzystamy z kilku różnych bibliotek i istnieje
ryzyko, że zaimportowanie wszystkich symboli
from matplotlib.pyplot import *
może spowodować konflikt nazw pomiędzy modułami.
Programowanie FizMed, wykład 6 11
matplotlib.pylab sesja interaktywna
Moduł pylab łączy w sobie przestrzenie nazw pakietów pyplot i numpy.
Pomyślany jest jako darmowy odpowiednik funkcjonalności pakietu MatLab.
Proszę pamiętać, że importowanie modułu pylab jest możliwe poprzez
import pylab
ale jest to równoważne wykonaniu poleceń:
from matplotlib.pylab import *
import matplotlib.pylab
__doc__ = matplotlib.pylab.__doc__
Przykładowe użycie do prostej funkcji:
import matplotlib.pylab as mpy
x = mpy.arange(0,5,0.1)
y = mpy.sin(x)
mpy.plot(x,y)
[
]
mpy.show()
arange i sin pochodzą z numpy. plot i show z pyplot
Programowanie FizMed, wykład 6 12
matplotlib.pylab program
W przypadku pisania osobnego programu, tak jak robiliśmy to na zajęciach,
autorzy matplotlib zalecają rozdzielenie przestrzeni nazw pyplot i numpy.
Przykładowe użycie do prostej funkcji w programie:
#import matplotlib.pylab as mpy
import numpy as np
Import matplotlib.pyplot as plt
x = np.arange(0,5,0.1)
y = np.sin(x)
plt.plot(x,y)
[]
plt.show()
arange i sin są teraz jawnie związane z numpy. plot i show z pyplot
Programowanie FizMed, wykład 6 13
Matplotlib co zrobić jeżeli nic nie widać
Używanie matplotlib zależy od środowiska w jakim pracujemy. Pod Windows
nie musimy się martwić, gdyż środowisko graficzne jest zintegrowane z
systemem operacyjnym. Pod Linuxem musimy wybrać odpowiedni dla
naszego systemu "backend".
Backend, to biblioteka odpowiedzialna za obsługę i rysowanie okien.
Standardowo Python obsługuje okna poprzez bibliotekę Tkinter, czyli
backend Tk. Oczywiście można korzystać też z innych pakietów o
rozszerzonych możliwościach.
Poniższe linie ustawiają w programie backend Tk.
import matplotlib
matplotlib.use('TkAgg') # musi pojawić się zaraz po import matplotlib
import matplotlib.backends.backend_tkagg
# dopiero wtedy możemy załadować pylab.
import matplotlib.pylab as mpy
i dalej rysować.
Uwaga, nie musi to być konieczne, jeżeli backend ma poprawnie ustawioną
domyślną wartość, co możemy sprawdzić poprzez.
matplotlib.get_backend()
Programowanie FizMed, wykład 6 14
Matplotlib jak poskładać rysunek?
Najprościej jest użyć standardowych funkcji, które wbudowane są w pylab.
x = mpy.arange(0,5,0.1)
y = mpy.sin(x)
mpy.plot(x,y) # brak formatu oznacza "b-" niebieska linia
mpy.plot(x,2*y, 'ro') # 'ro' oznacza czerwone kólka red 'o'
mpy.show()
Pełną listę przykładowych symboli i kolorów można uzyskać poprzez
print(mpy.plot.__doc__)
Tak więc metoda plot() rysuje jedną lub
kilka funkcji typu (x,y)
x i y moga być listami, tablicami lub
krotkami, czyli musza być iterowalne
i liczbowe.
Powinno być na zajęciach z SAGE.
Programowanie FizMed, wykład 6 15
Matplotlib jak poskładać rysunek?
Po kawałku 1. figure
Po pierwsze figure. Jest to obiekt klasy matplotlib.figure.Figure, który
"przechowuje" wykresy lub obrazki.
import matplotlib
import matplotlib.pylab as mpy
f1 = mpy.figure()
mpy.show() # wyświetla puste "ramy"
Proszę pamiętać, że pylab jest używany
głównie w sesji interaktywnej.
W przypadku programu i rozdzielenia pyplot
i numpy wyglądać to będzie tak:
import matplotlib
import matplotlib.pyplot as mpl
f1 = mpl.figure()
mpl.show()
Programowanie FizMed, wykład 6 16
Matplotlib jak poskładać rysunek?
Po kawałku 2. axes
Po drugie axes. Jest to obiekt klasy matplotlib.axes.Axes, który "rysuje"
wykresy lub obrazki.
import matplotlib
import matplotlib.pyplot as plt
f1 = plt.figure()
ax1= f1.add_subplot(121)
ax2 = f1.add_subplot(122)
plt.show() # wyświetla "ramy" z "osiami"
Metoda add_subplot(xyn) odnosi się do
"osi", które powstają z podzielenia
figury na
x wierszy
y kolumn
Liczba n numeruje osie zaczynając od 1
i następnie idąc wzdłuż wierszy.
Programowanie FizMed, wykład 6 17
Przykładowe podziały okna.
F = matplotlib.pyplot.figure()
F.add_subplot(2,2,1)
F.add_subplot(2,2,2)
#F.add_subplot(2,2,3) #brak!!
F.add_subplot(2,2,4)
Programowanie FizMed, wykład 6 18
Przykładowe podziały okna.
F = matplotlib.pyplot.figure()
1
2
F.add_subplot(2,2,1)
F.add_subplot(2,2,2)
#F.add_subplot(2,2,3) #brak!!
F.add_subplot(2,2,4)
4
1 2 3
Proszę spróbować samemu
4
8 9
Programowanie FizMed, wykład 6 19
Matplotlib jak poskładać rysunek?
Po kawałku metody klasy axes
Klasa matplotlib.axes. Axes posiada wiele róznych metod, które służą do
rysowania wykresów, histogramów, obrazków itd.
import matplotlib
import numpy as np
import matplotlib.pyplot as plt
f1 = plt.figure()
ax1= f1.add_subplot(121)
x=np.arange(0,5,0.1)
y=np.sin(x)
ax1.plot(x,y,'g>')
#koniec pierwszego wykresu z zielonych trójkątów 'g>'
moj_obr = plt.imread("figure_z_subplots.png") # wczytujemy obraz jako tablicę
ax2 = f1.add_subplot(122)
ax2.imshow(moj_obr) # wykres po prawej pokazuje obrazek
plt.show() # wyświetla "ramy" z "osiami" i obrazkiem
Programowanie FizMed, wykład 6 20
Matplotlib jak poskładać rysunek?
Po kawałku "dekoracje"
Każdy z tworzonych właśnie wykresów/obrazków możemy opisać
f1 = plt.figure()
ax1= f1.add_subplot(121)
ax1.set_xlabel("Opis osi x")
ax1.set_ylabel("Opis osi y")
#Lub dopisać dowolny tekst
plt.text(0.1,0.1,"Tu jest tekst w punkcie (0.1, 0.1)")
ax1.annotate("Tekst", (0.5,0.5), xycoords="axes fraction", va="center",
ha="center", bbox=dict(boxstyle="round, pad=1", fc="w"))
Możemy też zmienić kolor tła
Pat = ax1.patch # dostęp do obiektu tła
Pat.set_facecolor('green')
Programowanie FizMed, wykład 6 21
Matplotlib jak poskładać rysunek?
Po kawałku "dekoracje" cd.
Możemy dodawać linie
f1 = plt.figure()
ax1= f1.add_subplot(121)
x = np.arange(0,5,0.1)
y= np.sin(x)
ax.plot(x,y)
# Ta instrukcja już tworzy listę linii. Tak więc każdą kolejną musimy dołożyć do
naszej listy instrukcją extend.
#Tworzymy najpierw nową linię L1 i podajemy, że ma być na figurze f1
L1 = matplotlib.lines.Line2D([0, 1], [0, 1], transform=f1.transFigure, figure=f1)
#dodajemy ją do listy linii figury f1 jako element listy
f1.lines.extend( [L1] )
Możemy też dodawać całe figury
rect = matplotlib.patches.Rectangle( (1,1), width=5, height=12)
ax.add_patch(rect)
Lista możliwości znajduję się w aktualnej dokumentacji
http://matplotlib.sourceforge.net/users/artists.html
Programowanie FizMed, wykład 6 22
Koniec na dzisiaj!
Programowanie FizMed, wykład 6 23
Wyszukiwarka
Podobne podstrony:
wyklad3 Python
wyklad5 Python
wyklad4 Python
wyklad7 Python
Python wyklad
Sieci komputerowe wyklady dr Furtak
Wykład 05 Opadanie i fluidyzacja
WYKŁAD 1 Wprowadzenie do biotechnologii farmaceutycznej
mo3 wykladyJJ
ZARZĄDZANIE WARTOŚCIĄ PRZEDSIĘBIORSTWA Z DNIA 26 MARZEC 2011 WYKŁAD NR 3
Wyklad 2 PNOP 08 9 zaoczne
Wyklad studport 8
Kryptografia wyklad
więcej podobnych podstron