Univerza v Ljubljani Fakulteta za elektrotehniko LABORATORIJSKE VAJE PRI PREDMETU BIOMEDICINSKE SLIKOVNE TEHNOLOGIJE MIRAN BÜRMEN Ljubljana, 2021 ____________________________________________________ Kataložni zapis o publikaciji (CIP) pripravili v Narodni in univerzitetni knjižnici v Ljubljani COBISS.SI-ID 77872643 ISBN 978-961-243-421-2 (PDF) ____________________________________________________ URL: https://lipa.fe.uni-lj.si/courses/bst/prirocnik/prirocnik.pdf Copyright © 2021 Založba FE. All rights reserved. Razmnoževanje (tudi fotokopiranje) dela v celoti ali po delih brez predhodnega dovoljenja Založbe FE prepovedano. Založnik: Založba FE, Ljubljana Izdajatelj: Fakuleta za elektrotehniko, Ljubljana Urednik: prof. dr. Sašo Tomažič 1. elektronska izdaja Kazalo 1 Uvod v programski jezik Python 1 1.1 Naloge in vprašanja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.2 Rešitve in odgovori na vprašanja . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2 Interpolacija in decimacija slik 17 2.1 Interpolacija slik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2.2 Decimacija slik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.3 Naloge in vprašanja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.4 Rešitve in odgovori na vprašanja . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3 Parametri in kakovost slik 33 3.1 Naloge in vprašanja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 3.2 Rešitve in odgovori na vprašanja . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 4 Filtriranje slik 49 4.1 Naloge in vprašanja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 4.2 Rešitve in odgovori na vprašanja . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 5 Prikazovanje in preslikovanje slik 69 5.1 Naloge in vprašanja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 5.2 Rešitve in odgovori na vprašanja . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 6 Kalibracija in obnova sivinskih vrednosti 87 6.1 Naloge in vprašanja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 6.2 Rešitve in odgovori na vprašanja . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 7 Geometrijske preslikave slik 105 7.1 Naloge in vprašanja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 7.2 Rešitve in odgovori na vprašanja . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 8 Geometrijska kalibracija slik 113 8.1 Toga poravnava . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 8.2 Afina poravnava . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 8.3 Projektivna poravnava . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 i 8.4 Odprava radialnih distorzij . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 8.5 Naloge in vprašanja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 8.6 Rešitve in odgovori na vprašanja . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 9 Geometrijska poravnava slik s postopkom optimizacije 129 9.1 Naloge in vprašanja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 9.2 Rešitve in odgovori na vprašanja . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 10 Projekcije 2D slik 145 10.1 Naloge in vprašanja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 10.2 Rešitve in odgovori na vprašanja . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 11 Projekcije 3D slik 157 11.1 Naloge in vprašanja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 11.2 Rešitve in odgovori na vprašanja . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 12 Rekonstrukcija slik s povratno projekcijo 169 12.1 Naloge in vprašanja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 12.2 Rešitve in odgovori na vprašanja . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 A Modul interp 187 B Modul hpfilter 195 Poglavje 1 Uvod v programski jezik Python Celoviti uvod v programski jezik Python, ki vključuje tudi navodila za namestitev izbranih grafičnih razvojnih okolij ter številne ilustrativne primere uporabe najpomembnejših knjižnic programkega jezika, najdete v [1], obsežnejšo obravnavo številnih drugih Python knjižnic pa v [2]. V programskem jeziku Python lahko sivinske slike enostavno predstavimo z dvorazsežnimi podatkovnimi polji knjižnice numpy, ki so primerki razreda ndarray. Knjižnico običajno uvozimo pod krajšim imenom np. 1 > > > i m p o r t n u m p y as np 2 > > > Slikovni elementi slik standardnih formatov [3] se najpogosteje hranijo kot nepredznačena 8-, 16- ali 32-bitna cela števila, včasih pa tudi v zapisu s plavajočo vejico. Pripadajoči podatkovni tipi knjižnice numpy so povzeti v tabeli 1.1. Ko izvajamo računske operacije nad posame-Tabela 1.1: Zapis sivinskih vrednosti s podatkovnimi tipi knjižnice numpy. Zapis sivinkih vrednosti Podatkovni tip Zaloga vrednosti binarna slika np.bool {False, True} 8-bitni nepredznačeni np.uint8 [0 , 255] 16-bitni nepredznačeni np.uint16 [0 , 65535] 32-bitni predznačeni np.int32 [−231 , 231 − 1] 32-bitni s plavajočo vejico np.float32 ali np.single [0 . 0 , 1 . 0] 64-bitni s plavajočo vejico np.float64 ali np.float ali np.double [0 . 0 , 1 . 0] znimi slikovnimi elementi, običajno uporabimo zapis sivinskih vrednosti s plavajočo vejico, saj v nasprotnem primeru hitro pride do zaokrožitvenih napak ali pa presežemo zalogo vrednosti celoštevilskega podatkovnega tipa. Po končanem delu zapis sivinskih vrednosti pretvorimo v prvotni podatkovni tip in pri tem uporabimo ustrezno zaokrožitev. 1 > > > n p . a r r a y ([253 , 254 , 255] , d t y p e = n p . u i n t 8 ) + 1 2 a r r a y ([254 , 255 , 0] , d t y p e = u i n t 8 ) 3 1 Uvod v programski jezik Python Numpydnaslovdvddrugidrazsežnostid'xC Načindnaslavljanjad'parameterdorderC 0 1 2 3 4 5 NaslavljanjedjCj NaslavljanjedjFj Cy I [09d0] 0 I [09d0] 0 0 128 64 0 0 0 128 tid' I [19d3] I [09d1] 1 I [19d0] 1 ov ov I [09d2] 2 I [29d0] 2 1 128 192 64 64 32 128 I [09d3] 3 I [39d0] 3 I [09d4] 4 I [49d0] 4 2 128 192 64 255 32 128 I [:49d2:5] linearnidnasl I [09d5] 5 linearnidnasl I [09d1] 5 3 128 192 64 32 32 128 I [49d4] 23 Pomnilniški/ I [39d5] 23 Pomnilniški/ 4 128 64 0 0 0 128 I [-19d:] I [49d5] 24 Numpydnaslovdvdprvidrazsežnos I [49d5] 24 Slika 1.1: Primer 8-bitne nepredznačene sivinske slike velikosti 6 × 4, predstavljene z dvorazsežnim podatkovnim poljem numpy velikosti (4 , 6), ter naslavljanje elementov podatkovnega polja. 4 > > > n p . a r r a y ([253 , 254 , 255] , d t y p e = n p . f l o a t 6 4 ) + 1 5 a r r a y ([ 254 . , 255 . , 256 . ]) 6 > > > Podatki v večrazsežnih poljih so običajno shranjeni v enem izmed dveh najbolj razširjenih za-pisov (glej sliko 1.1), in sicer ’C’ (po programskem jeziku C) ali ’F’ (po programskem jeziku Fortran). Bistvena razlika med obema načinoma naslavljanja izhaja iz vrstnega reda zapisa elementov večrazsežnega polja v linearnem računalniškem pomnilniku. Pri prvem načinu naslavljanja teče linearni naslov po prvi razsežnosti, pri drugem pa po zadnji razsežnosti podatkovnega polja. Knjižnica numpy sicer omogoča oba načina naslavljanja, a bomo v okviru tega priročnika uporabljali izključno privzeti način naslavljanja ’C’. Dvorazsežne slike bomo predstavili z dvorazsežnimi numpy podatkovnimi polji, in sicer bo prva razsežnost podatkovnega polja predstavljala število vrstic ( y koordinata), druga razsežnost podatkovnega polja pa število stolpcev slike ( x koordinata). Na ta način lahko sliko širine W in višine H slikovnih elementov predstavimo z numpy podatkovnim poljem velikosti (H, W). Na podoben način lahko trirazsežne slike predstavimo s trirazsežnimi numpy podatkovnimi polji velikosti ( D, H, W ), kjer D predstavlja število rezin slike v smeri z koordinatne osi. Pri izbiri koordinatnega sistema, s katerim določimo prostorske koordinate slikovnih elementov, sledimo naslavljanju knjižnice numpy. Koordinatno izhodišče slike I se nahaja v levem zgornjem krajišču slike, torej na naslovu I[0 , 0], spodnje desno krajišče slike pa na naslovu I[ H − 1 , W − 1]. Vsebino podatkovnega polja numpy vzdolž izbrane koordinatne osi naslovimo kot [...,start:stop:korak,...], kjer start in stop predstavljata začetni in končni naslov naslovljenih elementov, step pa korak vzorčenja vzdolž izbrane koordinatne osi. Pri tem naslovimo vse slikovne elemente od vključno prvega naslova (start) do vključno predzadnjega naslova (stop-1). Privzeta vrednost parametra start je enaka 0, privzeta vrednost parametra stop je enaka velikosti podatkovnega polja v naslovljeni razsežnosti, privzeta vrednost parametra step pa je enaka 1. 1 > > > p o l j e = n p . a r r a y ([[ 1 , 2 , 3 , 4 , 5] , 2 [11 , 12 , 13 , 14 , 15] , 2 Uvod v programski jezik Python 3 [21 , 22 , 23 , 24 , 25] , 4 [31 , 32 , 33 , 34 , 3 5 ] ] ) 5 > > > # korak 3 vzdolž prve ( y) in korak 2 vzdolž druge ( x) koordinatne osi 6 > > > p o l j e [::3 , : : 2 ] 7 a r r a y ([[ 1 , 3 , 5] , 8 [21 , 23 , 2 5 ] ] ) 9 > > > Barvne RGB slike predstavimo s trirazsežnimi numpy podatkovnimi polji velikosti ( H, W, 3), kjer posamezni prerezi polja predstavljajo barvne komponente slike. Pri tem se držimo pra-vila, da prvi prerez polja I[: , : , 0] predstavlja rdečo komponento, drugi prerez polja I[: , : , 1] zeleno komponento, tretji prerez polja I[: , : , 2] pa modro komponento slike (slika 1.2). Slike (a) RGB barvna slika I (b) Rdeča komponenta (c) Zelena komponenta (d) Modra komponenta Slika 1.2: 8-bitna RGB mikroskopska slika razdeljena na posamezne barvne komponente. zapisane v PNG formatu lahko naložimo in shranimo s funkcijama imread in imsave modula matplotlib.pyplot. Pri praktičnem delu se pogosto srečujemo tudi z drugimi formati slik. Slike velike večine standardnih formatov (BMP, PNG, GIF, EPS, JPEG, itn.) lahko naložimo ali shranimo s pomočjo knjižnice pillow. Sliko naložimo s funkcijo Image.open, ki nam ustvari primerek razreda Image. Slednjega nato s funkcijo np.array pretvorimo v numpy podatkovno polje. Ko zaključimo z obdelavo slike in jo želimo shraniti, uporabimo funkcijo Image.fromarray, ki iz podatkovnega polja numpy ustvari primerek razreda Image. Pri tem mora tip podatkovnega polja numpy ustrezati enemu izmed podatkovnih tipov iz tabele 1.1, in sicer logičnemu podat-kovnemu tipu np.bool, enemu izmed celoštevilskih tipov np.uint8, np.uint16 ter np.int32 ali zapisu s plavajočo vejico np.float32 ter np.float64. Sivinske in RGB barvne slike funkcija Image.fromarray razpozna samodejno, in sicer na podlagi velikosti in tipa podatkovnega polja, zapise, kot so CMYK, RGBA ter YCbCr, pa je potrebno definirati z vrednostjo parametra mode: • ’1’ - binarna slika (numpy tip np.bool, velikost ( H, W )), • ’L’ - sivinska slika (numpy tip np.uint8, velikost ( H, W )), • ’P’ - barvna slika z barvno mapo (numpy tip np.uint8, velikost ( H, W )), • ’RGB’ - barvna slika (numpy tip np.uint8, velikost ( H, W, 3)), • ’RGBA’ - barvna slika (numpy tip np.uint8, velikost ( H, W, 4)), • ’CMYK’ - barvna slika (numpy tip np.uint8, velikost ( H, W, 4)), • ’YCbCr’ - barvna slika (numpy tip np.uint8, velikost ( H, W, 3)), 3 Uvod v programski jezik Python • ’I’ - sivinska slika (numpy tip np.int32, velikost ( H, W )), • ’F’ - sivinska slika (numpy tip np.float32, velikost ( H, W )). Zapis slikovnih elementov primerka razreda Image lahko ugotovimo z metodo getbands, pretvorbo zapisa pa sprožimo z metodo convert. Opisane lastnosti knjižnice pillow so povzete v sledečem primeru. 1 f r o m PIL i m p o r t I m a g e as im 2 i m p o r t n u m p y as np 3 4 # Nalaganje slike s knjižnico pillow. 5 # Naloži sliko ’slika.bmp’ in ustvari primerek razreda Image. 6 p i l S l i k a = i m . o p e n ( ’ s l i k a . b m p ’ ) 7 # Shrani sliko v tif zapisu. 8 p i l S l i k a . s a v e ( ’ s l i k a . t i f ’ ) 9 # Pretvori primerek razreda Image v numpy podatkovno polje. 10 p o l j e = n p . a r r a y ( p i l S l i k a ) 11 12 p i l S l i k a . g e t b a n d s () # Vrne oznako trenutnega zapis slike, recimo ’L’. 13 p i l B i n a r n a S l i k a = p i l S l i k a . c o n v e r t ( ’ 1 ’ ) # Pretvori zapis slike v binarnega. 14 15 # Shranjevanje slike primerka razreda Image. 16 # Pretvori numpy podatkovno polje v primerek razreda Image. 17 p i l S l i k a = i m . f r o m a r r a y ( p o l j e ) 18 # Shrani sliko v gif zapisu. 19 p i l S l i k a . s a v e ( ’ s l i k a . g i f ’ ) Priročen most med knjižnicama pillow in numpy najdemo v modulu scipy.misc, in sicer v funkcijah toimage in imread. S funkcijo toimage lahko po potrebi razpon sivinskih vrednosti omejimo na želeno območje, ki ga definiramo s parametroma low in high. Hkrati lahko z vrednostjo parametra mode eksplicitno določimo podatkovni tip zapisa sivinskih vrednosti. 1 i m p o r t s c i p y . m i s c as spm 2 3 # Naloži sliko tipa tif neposredno v novo numpy podatkovno polje. 4 p o d a t k o v n o P o l j e = s p m . i m R e a d ( ’ n e k a S l i k a . t i f ’ ) 5 6 # Shrani sliko v dveh korakih. 7 # 1. Pretvori sliko iz numpy polja v primerek razreda Image. 8 p i l S l i k a = s p m . t o i m a g e ( p o d a t k o v n o P o l j e ) 9 # 2. Shrani sliko v jpg formatu. 10 p i l S l i k a . s a v e ( ’ n e k a D r u g a S l i k a . j p g ’ ) 11 12 # Vsili 32-bitni nepredznačeni zapis sivin z zalogo vrednosti [0 , 65535]. 13 p i l l S l i k a = s p m . t o i m a g e ( p o d a t k o v n o P o l j e , low =0 , h i g h =65535 , m o d e = ’ I ’ ) 14 p i l l S l i k a . s a v e ( ’ t e s t n a S l i k a . t i f ’ ) Slike, zapisane s podatkovnim poljem numpy, lahko prikažemo s pomočjo modula pyplot knji- žnice matplotlib, ki ga običajno uvozimo pod krajšim imenom pp. 4 Uvod v programski jezik Python 1.1 Naloge in vprašanja 1 f r o m m a t p l o t l i b i m p o r t p y p l o t as pp 2 i m p o r t n u m p y as np 3 4 n p s l i k a = n p . a s a r r a y ( i m . o p e n ( ’ s l i k a . p n g ’ ) ) 5 p p . f i g u r e () # ustvari novo grafično okno 6 p p . i m s h o w ( n p s l i k a ) # izriše sliko 7 p p . s h o w () # prikaže grafično okno 1.1 Naloge in vprašanja 1. S pomočjo funkcije open modula PIL.Image ali funkcije imread modula scipy.misc naložite 8-bitno nepredznačeno sivinsko sliko mrBrainSlice.png širine W = 217 in višine H = 181 slikovnih elementov. S funkcijo figure ustvarite novo grafično okno in v njem s funkcijo imshow prikažite sliko. Kot že rečeno, sta omenjeni funkciji del modula matplotlib.pyplot. 2. S pomočjo metode tofile shranite numpy podatkovno polje slike mrBrainSlice.png v surovo binarno datoteko mrBrainSlice_217x181_uint8.raw. 3. Sliko mrBrainSlice.png pretvorite v 16-bitni nepredznačeni zapis. Pri tem območje sivinskih vrednosti ustrezno prilagodite, tako da uporabite celotno zalogo vrednosti 16-bitnih nepredznačenih števil. Sliko shranite v surovem zapisu (mrBrainSlice_217x181_uint16- .raw), in sicer pri tem spet uporabite metodo tofile. Ne pozabite, da je potrebno tip podatkovnega polja pred klicem metode tofile pretvoriti v np.uint16, kar dosežete z metodo astype. Shranite 16-bitno sivinsko sliko še v mrBrainSlice.tif datoteko. Pri tem uporabite funkciji fromarray in save modula PIL.Image. Pri tem mora podatkovno polje numpy ustrezati zapisu ’I’ ali ’F’, tj. podatkovni tip np.int32 ali np.float32. 4. S pomočjo funkcije fromfile modula numpy naložite shranjeni surovi 8- in 16-bitni nepredznačeni sliki mrBrainSlice_217x181_uint8.raw ter mrBrainSlice_217x181_uint16.raw in ju prikažite. 5. Ustvarite funkciji, ki bosta primerni za nalaganje in shranjevanje surovih dvorazsežnih binarnih slik iz ali v datoteko ’fid’. Podatkovni tip slike naj bo določen s parametrom dtype, širina slike s parametrom (width) in višina slike s parametrom (height). Pri tem uporabite imena podatkovnih tipov knjižnice numpy (np.uint8, np.uint16, np.float32, np.float64), vrstni red zapisa v pomnilniku (order) pa naj bo ’xy’ ali ’yx’. Funkcija imLoadRaw2d za nalaganje binarne slike naj vedno vrne podatkovno polje velikosti (height, width), ki sledi privzetemu načinu naslavljanja [y, x]. (a) def imLoadRaw2d(fid, width, height, dtype=np.uint8, order=’xy’) (b) def imSaveRaw2d(fid, data) 6. Prikažite del slike mrBrainSlice.png, ki ga omejuje pravokotno področje s krajiščema v slikovnih elementih [60, 80] ter [120, 160]. 5 Uvod v programski jezik Python 1.1 Naloge in vprašanja 7. Zamenjajte vrednosti vseh slikovnih elementov slike mrBrainSlice.png, ki imajo vrednost med 160 in 200, z vrednostjo 255. Sivinske vrednosti ostalih slikovnih elementov postavite na vrednost 0. Dobljeno sliko prikažite. Ustvarite in prikažite še sliko, kjer omenjene slikovne elemente predstavite z rdečo barvo (vrednost rdeče komponente postavite na 255, vrednosti zelene in modre komponente na 0), vse ostale slikovne elemente pa s črno barvo (vrednosti vseh treh barvnih komponent postavite na 0). Posamezna podatkovna polja treh barvnih komponent boste najenostavneje združili v trirazsežno podatkovno polje s funkcijo dstack modula numpy. 8. Dopolnite funkciji imLoadRaw2d in imSaveRaw2d tako, da bo mogoče z njima naložiti ali shraniti tudi trirazsežne slike, zapisane v surovih raw datotekah. Pri tem naj bo velikost slike v smeri z koordinatne osi določena s parametrom depth. Vrstni red zapisa v pomnilniku naj bo eden izmed (’xyz’, ’xzy’, ’yxz’, ’yzx’, ’zxy’, ’zyx’). Funkcija imLoadRaw3d naj vedno vrne podatkovno polje velikosti (depth, height, width), ki sledi privzetemu načinu naslavljanja [z, y, x]. (a) def imLoadRaw3d(fid, width, height, depth, dtype=np.uint8, order=’xyz’) (b) def imSaveRaw3d(fid, data) 9. Ustvarite funkcijo imGrid2d, ki vrne koordinatno mrežo točk slikovnih elementov poljubne 2D slike. Pri tem naj bodo x koordinate slikovnih elementov shranjene v podatkovnem polju oX, pripadajoče y koordinate slikovnih elementov pa v podatkovnem polju oY. Velikost slike, izraženo s številom slikovnih elementov, v smeri x koordinatne osi naj določa parameter width, v smeri y koordinatne osi pa parameter height. Pripadajoči velikosti slikovnega elementa naj določata parametra dx in dy. Parametra xoffset in yoffset pa naj določata koordinati ( x, y) slikovnega elementa v levem zgornjem krajišču slike, ki se nahaja na naslovu [0, 0]. Če je vrednost parametra xoffset ali yoffset enaka ’center’, naj geometrično središče slike sovpada s koordinatnim izhodiščem pripadajoče koordinatne osi. Koordinatno mrežo točk boste najenostavneje ustvarili s funkcijama meshgrid ter linspace ali arange modula numpy. 1 def i m G r i d 2 d ( width , height , dx =1 .0 , dy =1 .0 , 2 x o f f s e t = ’ c e n t e r ’ , y o f f s e t = ’ c e n t e r ’ ) : 3 ... 4 r e t u r n oY , oX 10. Po vzoru funkcije imGrid2d ustvarite še funkcijo imGrid3d, ki vrne koordinatno mrežo točk slikovnih elementov poljubne 3D slike. Pri tem naj bodo x koordinate shranjene v podatkovnem polju oX, y koordinate v podatkovnem polju oY ter z koordinate v podatkovnem polju oZ. Velikost slike, izraženo s številom slikovnih elementov, v smeri x koordinatne osi določa parameter width, v smeri y koordinatne osi parameter height ter v smeri z koordinatne osi parameter depth. Pripadajočo velikost slikovnega elementa določajo parametri dx, dy in dz. Parameteri xoffset, yoffset in zoffset naj določajo koordinate ( x, y, z) slikovnega elementa v levem zgornjem krajišču slike, ki se nahaja na naslovu [0, 0, 0]. Če je vrednost katerega izmed parametrov xoffset, yoffset ali zoffset enaka ’center’, naj 6 Uvod v programski jezik Python 1.1 Naloge in vprašanja geometrično središče slike sovpada s koordinatnim izhodiščem pripadajoče koordinatne osi. 1 def i m G r i d 3 d ( width , height , depth , 2 dx =1 .0 , dy =1 .0 , dz =1 .0 , 3 x o f f s e t = ’ c e n t e r ’ , y o f f s e t = ’ c e n t e r ’ , z o f f s e t = ’ c e n t e r ’ ) : 4 ... 5 r e t u r n oZ , oY , oX 7 Uvod v programski jezik Python 1.1 Naloge in vprašanja 8 Uvod v programski jezik Python 1.2 Rešitve in odgovori na vprašanja 1.2 Rešitve in odgovori na vprašanja Pri odgovorih privzamemo, da so funkcije zbrane v modulu funkcije, slikovno gradivo pa se nahaja v podmapi poglavje_1. Slika 1.3: Rezina magnetnoresonančne slike možganov mrBrainSlice.png. Najprej uvozimo potrebne module in funkcije. 1 i m p o r t n u m p y as np 2 f r o m m a t p l o t l i b i m p o r t p y p l o t as pp 3 f r o m PIL i m p o r t I m a g e as im 4 i m p o r t f u n k c i j e 1. Naložimo in prikažemo PNG sliko (slika 1.3). 1 p i l S l i k a = i m . o p e n ( ’ . / p o g l a v j e _ 1 / m r B r a i n S l i c e . p n g ’ ) 2 n p S l i k a = n p . a r r a y ( p i l S l i k a ) 3 4 p p . f i g u r e () 5 p p . i m s h o w ( npSlika , c m a p = ’ g r a y ’ ) 6 p p . s h o w () 2. Shranimo naloženo sliko v surovo binarno datoteko. 1 n p S l i k a . t o f i l e ( 2 ’ . / p o g l a v j e _ 1 / r e z u l t a t i / m r B r a i n S l i c e _ 2 1 7 x 1 8 1 _ u i n t 8 . r a w ’ ) 3. Pretvorimo in shranimo naloženo sliko v zahtevane formate. 1 # prtetvorimo v 16-bitni nepredznačeni zapis 2 n p S l i k a 1 6 = n p . r o u n d ( 3 n p S l i k a . a s t y p e ( n p . f l o a t ) * ( 6 5 5 3 5 .0 / 2 5 5 .0 ) ) . a s t y p e ( n p . u i n t 1 6 ) 4 # shranimo v surovo binarno datoteko 5 n p S l i k a 1 6 . t o f i l e ( 6 ’ . / p o g l a v j e _ 1 / r e z u l t a t i / m r B r a i n S l i c e _ 2 1 7 x 1 8 1 _ u i n t 1 6 . r a w ’ ) 7 # shranimo v 16-bitno tif datoteko 8 p i l S l i k a 3 2 = i m . f r o m a r r a y ( n p S l i k a 1 6 . a s t y p e ( n p . i n t 3 2 ) ) 9 p i l S l i k a 3 2 . s a v e ( ’ . / p o g l a v j e _ 1 / r e z u l t a t i / m r B r a i n S l i c e . t i f ’ ) 9 Uvod v programski jezik Python 1.2 Rešitve in odgovori na vprašanja 4. Naložimo in prikažemo zahtevani sliki. 1 n p R a w 8 = n p . f r o m f i l e ( 2 ’ . / p o g l a v j e _ 1 / r e z u l t a t i / m r B r a i n S l i c e _ 2 1 7 x 1 8 1 _ u i n t 8 . r a w ’ , 3 d t y p e = n p . u i n t 8 , c o u n t = 2 1 7 * 1 8 1 ) 4 n p R a w 8 . s h a p e = (181 , 2 1 7 ) 5 6 n p R a w 1 6 = n p . f r o m f i l e ( 7 ’ . / p o g l a v j e _ 1 / r e z u l t a t i / m r B r a i n S l i c e _ 2 1 7 x 1 8 1 _ u i n t 1 6 . r a w ’ , 8 d t y p e = n p . u i n t 1 6 , c o u n t = 2 1 7 * 1 8 1 ) 9 n p R a w 1 6 . s h a p e = (181 , 2 1 7 ) 10 11 p p . f i g u r e () 12 13 p p . s u b p l o t (1 , 2 , 1) 14 p p . i m s h o w ( npRaw8 , c m a p = ’ g r a y ’ ) 15 p p . t i t l e ( ’ S l i k a m r B r a i n S l i c e _ 2 1 7 x 1 8 1 _ u i n t 8 . r a w ’ ) 16 17 p p . s u b p l o t (1 , 2 , 2) 18 p p . i m s h o w ( npRaw16 , c m a p = ’ g r a y ’ ) 19 p p . t i t l e ( ’ S l i k a m r B r a i n S l i c e _ 2 1 7 x 1 8 1 _ u i n t 1 6 . r a w ’ ) 20 21 p p . s h o w () 5. (a) V modulu funkcije ustvarimo funkcijo imLoadRaw2d 1 def i m L o a d R a w 2 d ( fid , width , height , 2 d t y p e = n p . u i n t 8 , o r d e r = ’ xy ’ ) : 3 o r d e r = str ( o r d e r ) . l o w e r () 4 d a t a = n p . f r o m f i l e ( f i l e n a m e , d t y p e = d t y p e ) 5 if o r d e r == ’ xy ’ : 6 d a t a . s h a p e = ( height , w i d t h ) 7 e l i f o r d e r == ’ yx ’ : 8 d a t a . s h a p e = ( width , h e i g h t ) 9 d a t a = d a t a . t r a n s p o s e () 10 e l s e : 11 r a i s e V a l u e E r r o r ( 12 ’ V r e d n o s t v h o d n e g a p a r a m e t r a " o r d e r " je l a h k o ’ 13 ’ " xy " ali " yx "! ’ ) 14 15 r e t u r n d a t a (b) V modulu funkcije ustvarimo funkcijo imSaveRaw2d 1 def i m S a v e R a w 2 d ( fid , d a t a ) : 2 d a t a . t o f i l e ( fid ) Kratek test funkcij imLoadRaw2d ter imSaveRaw2d. 1 mr8 = f u n k c i j e . i m L o a d R a w 2 d ( 2 ’ . / p o g l a v j e _ 1 / r e z u l t a t i / m r B r a i n S l i c e _ 2 1 7 x 1 8 1 _ u i n t 8 . r a w ’ , 10 Uvod v programski jezik Python 1.2 Rešitve in odgovori na vprašanja 3 217 , 1 8 1 ) 4 m r 1 6 = f u n k c i j e . i m L o a d R a w 2 d ( 5 ’ . / p o g l a v j e _ 1 / r e z u l t a t i / m r B r a i n S l i c e _ 2 1 7 x 1 8 1 _ u i n t 1 6 . r a w ’ , 6 217 , 181 , n p . u i n t 1 6 ) 7 8 p p . f i g u r e () 9 10 p p . s u b p l o t (1 , 2 , 1) 11 p p . i m s h o w ( mr8 , c m a p = ’ g r a y ’ ) 12 p p . t i t l e ( ’ S l i k a m r B r a i n S l i c e _ 2 1 7 x 1 8 1 _ u i n t 8 . r a w ’ ) 13 14 p p . s u b p l o t (1 , 2 , 2) 15 p p . i m s h o w ( mr16 , c m a p = ’ g r a y ’ ) 16 p p . t i t l e ( ’ S l i k a m r B r a i n S l i c e _ 2 1 7 x 1 8 1 _ u i n t 1 6 . r a w ’ ) 17 18 p p . s h o w () 6. Prikažemo zahtevani del slike (slika 1.4b). 1 p p . f i g u r e () 2 p p . i m s h o w ( mr8 [ 6 0 : 1 2 0 + 1 , 8 0 : 1 6 0 + 1 ] , c m a p = ’ g r a y ’ ) 3 p p . t i t l e ( ’ P o d o k n o [ 6 0 : 1 2 1 , 8 0 : 1 6 1 ] ’ ) 4 p p . s h o w () (a) Izvirna slika (b) Osrednji del slike Slika 1.4: Rezina magnetnoresonančne slike možganov s povečanim osrednjim delom. 7. Ustvarimo zahtevano binarno sivinsko in RGB barvno sliko ter ju prikažemo (slika 1.5). 1 m a s k a = n p . l o g i c a l _ a n d ( mr8 >= 160 , mr8 <= 2 0 0 ) 2 m r R g b = n p . z e r o s ([181 , 217 , 3] , d t y p e = n p . u i n t 8 ) 3 m r R g b [ maska , 0] = 255 4 5 p p . f i g u r e () 6 7 p p . s u b p l o t (1 , 3 , 1) 8 p p . i m s h o w ( mr8 , c m a p = ’ g r a y ’ ) 9 p p . t i t l e ( ’ I z v i r n a ’ ) 11 Uvod v programski jezik Python 1.2 Rešitve in odgovori na vprašanja 10 11 p p . s u b p l o t (1 ,3 ,2) 12 p p . i m s h o w ( maska , c m a p = ’ g r a y ’ ) 13 p p . t i t l e ( ’ B i n a r n a s i v i n s k a ’ ) 14 15 p p . s u b p l o t (1 , 3 , 3) 16 p p . i m s h o w ( m r R g b ) 17 p p . t i t l e ( ’ B i n a r n a b a r v n a ’ ) (a) Izvirna slika (b) Binarna sivinska slika (c) Binarna barvna slika Slika 1.5: Rezina magnetnoresonančne slike možganov, pripadajoča binarna sivinska slika slikovnih elementov s sivinsko vrednostjo na intervalu [160, 200] ter z rdečo barvo na črni podlagi prikazani slikovni elementi binarne slike. 8. (a) V modulu funkcije ustvarimo funkcijo imLoadRaw3d. 1 def i m L o a d R a w 3 d ( 2 fid , width , height , depth , d t y p e = n p . u i n t 8 , o r d e r = ’ xyz ’ ) : 3 o r d e r = str ( o r d e r ) . l o w e r () 4 d a t a = n p . f r o m f i l e ( f i l e n a m e , d t y p e = d t y p e ) 5 if o r d e r == ’ xyz ’ : 6 d a t a . s h a p e = ( depth , height , w i d t h ) 7 e l i f o r d e r == ’ xzy ’ : 8 d a t a . s h a p e = ( height , depth , w i d t h ) 9 d a t a = d a t a . t r a n s p o s e ((1 ,0 ,2) ) 10 e l i f o r d e r == ’ yxz ’ : 11 d a t a . s h a p e = ( depth , width , h e i g h t ) 12 d a t a = d a t a . t r a n s p o s e ((0 ,2 ,1) ) 13 e l i f o r d e r == ’ yzx ’ : 14 d a t a . s h a p e = ( width , depth , h e i g h t ) 15 d a t a = d a t a . t r a n s p o s e ((1 ,2 ,0) ) 16 e l i f o r d e r == ’ zxy ’ : 17 d a t a . s h a p e = ( height , width , d e p t h ) 18 d a t a = d a t a . t r a n s p o s e ((2 ,0 ,1) ) 19 e l i f o r d e r == ’ zyx ’ : 20 d a t a . s h a p e = ( width , height , d e p t h ) 21 d a t a = d a t a . t r a n s p o s e ((2 ,1 ,0) ) 22 e l s e : 12 Uvod v programski jezik Python 1.2 Rešitve in odgovori na vprašanja 23 r a i s e V a l u e E r r o r ( 24 ’ V r e d n o s t v h o d n e g a p a r a m e t r a " o r d e r " je l a h k o ’ 25 ’ " xyz " , " xzy " , " yxz " , " yzx " , " zxy " ali " zyx "! ’ ) 26 r e t u r n d a t a (b) V modulu funkcije ustvarimo funkcijo imSaveRaw3d. 1 def i m S a v e R a w 3 d ( fid , d a t a ) : 2 d a t a . t o f i l e ( fid ) Kratek test funkcije imLoadRaw3d in izris nekaj primerov osnovnih prerezov magnetnoresonančne slike možganov (slika 1.6). 1 m r 3 d = f u n k c i j e . i m L o a d R a w 3 d ( 2 ’ . / p o g l a v j e _ 1 / m r _ 2 1 7 x 1 8 1 x 1 8 1 _ u i n t 8 . r a w ’ , 217 , 181 , 1 8 1 ) 3 4 p p . f i g u r e () 5 6 p p . s u b p l o t (1 , 3 , 1) 7 p p . i m s h o w ( m r 3 d [: , : , 100] , c m a p = ’ g r a y ’ ) 8 p p . t i t l e ( ’ P r e r e z s l i k e pri [: , : , 1 0 0 ] ’ ) 9 10 p p . s u b p l o t (1 , 3 , 2) 11 p p . i m s h o w ( m r 3 d [: , 100 , :] , c m a p = ’ g r a y ’ ) 12 p p . t i t l e ( ’ P r e r e z s l i k e pri [: , 100 , :] ’ ) 13 14 p p . s u b p l o t (1 , 3 , 3) 15 p p . i m s h o w ( m r 3 d [100 , : , :] , c m a p = ’ g r a y ’ ) 16 p p . t i t l e ( ’ P r e r e z [100 , : , :] ’ ) 17 18 p p . s h o w () (a) Prerez [:, :, 100] (b) Prerez [:, 100, :] (c) Prerez [100, :, :] Slika 1.6: Primeri osnovnih prerezov 3D magnetnoresonančne slike možganov mr_217x181x181_uint8.raw. 9. V modulu funkcije ustvarimo funkcijo imGrid2d. 13 Uvod v programski jezik Python 1.2 Rešitve in odgovori na vprašanja 1 def i m G r i d 2 d ( width , height , dx =1 , dy =1 , 2 x o f f s e t =0 , y o f f s e t =0) : 3 if y o f f s e t == ’ c e n t e r ’ : 4 y o f f s e t = -0 .5 *( h e i g h t - 1) * dy 5 if x o f f s e t == ’ c e n t e r ’ : 6 x o f f s e t = -0 .5 *( w i d t h - 1) * dx 7 8 x = n p . a r a n g e ( xoffset , x o f f s e t + w i d t h * dx , dx , d t y p e = n p . f l o a t ) 9 y = n p . a r a n g e ( yoffset , y o f f s e t + h e i g h t * dy , dy , d t y p e = n p . f l o a t ) 10 11 r e t u r n n p . m e s h g r i d ( y , x , i n d e x i n g = ’ ij ’ ) Preverimo delovanje funkcije imGrid2d na sliki velikosti 16 × 9 slikovnih elementov z velikostjo slikovnega elementa 2 × 2 mm (slika 1.7). 1 # koordinatno izhodišče v geometričnem središču slike 2 Y2d_c , X 2 d _ c = f u n k c i j e . i m G r i d 2 d ( 3 16 , 9 , 2 .0 , 2 .0 , ’ c e n t e r ’ , ’ c e n t e r ’ ) 4 # koordinatno izhodišče v krajišču slike 5 Y2d , X2d = f u n k c i j e . i m G r i d 2 d (16 , 9 , 2 .0 , 2 .0 ) 6 7 p p . f i g u r e () 8 p p . p l o t ( X2d_c , Y2d_c , ’ .k ’ ) 9 p p . p l o t ( X2d , Y2d , ’ .r ’ ) 10 p p . t i t l e ( ’ 16 x 9 sl. el. v e l . 2 x 2 mm ’ ) 11 p p . x l a b e l ( ’ x ( mm ) ’ ) 12 p p . y l a b e l ( ’ y ( mm ) ’ ) 13 p p . s h o w () 10 (mm)y 0 −10 0 10 20 30 x (mm) Slika 1.7: Koordinatni sistem slike velikosti 16 × 9 slikovnih elementov z velikostjo slikovnega elementa 2 × 2 mm. (črno) Koordinatno izhodišče v geometričnem središču slike. (rdeče) Koordinatno izhodišče v središču slikovnega elementa na naslovu [0 , 0] (krajišče slike). 10. V modulu funkcije ustvarimo funkcijo imGrid3d. 1 def i m G r i d 3 d ( width , height , depth , dx =1 , dy =1 , dz =1 , 14 Uvod v programski jezik Python 1.2 Rešitve in odgovori na vprašanja 2 x o f f s e t =0 , y o f f s e t =0 , z o f f s e t =0) : 3 if z o f f s e t == ’ c e n t e r ’ : 4 z o f f s e t = -0 .5 *( d e p t h - 1) * dz 5 if y o f f s e t == ’ c e n t e r ’ : 6 y o f f s e t = -0 .5 *( h e i g h t - 1) * dy 7 if x o f f s e t == ’ c e n t e r ’ : 8 x o f f s e t = -0 .5 *( w i d t h - 1) * dx 9 10 x = n p . a r a n g e ( xoffset , x o f f s e t + w i d t h * dx , dx , d t y p e = n p . f l o a t ) 11 y = n p . a r a n g e ( yoffset , y o f f s e t + h e i g h t * dy , dy , d t y p e = n p . f l o a t ) 12 z = n p . a r a n g e ( zoffset , z o f f s e t + d e p t h * dz , dz , d t y p e = n p . f l o a t ) 13 14 r e t u r n n p . m e s h g r i d ( z , y , x , i n d e x i n g = ’ ij ’ ) 15 Uvod v programski jezik Python 1.2 Rešitve in odgovori na vprašanja 16 Poglavje 2 Interpolacija in decimacija slik Poglavje je namenjena spoznavanju in razumevanju osnovnih postopkov interpolacije in decimacije slik, s katerimi lahko povečamo ali zmanjšamo vzorčno vrekvenco in s tem velikost slik. 2.1 Interpolacija slik S postopkom interpolacije slik lahko priredimo sivinsko vrednost poljubni točki v slikovni ravnini. Na ta način lahko povečamo vzorčno frekvenco ter s tem velikost slik in tako zmanjšamo velikost slikovnih elementov. Glede na to, koliko sosednjih slikovnih elementov upoštevamo pri izračunu sivinske vrednosti v dani točki, delimo postopke interpolacije na: • ničti red ali interpolacija najbližjega soseda - upoštevamo le najbližji slikovni element, • prvi red ali (bi)linearna interpolacija - upoštevamo le štiri sosednje slikovne elemente, • višji red, npr. (bi)kubična interpolacija (drugi red), ki upošteva 16 sosednjih slikovnih elementov. Primerjavo postopkov interpolacije z najbližjim sosedom in linearne interpolacije za sinusni polval prikazuje slika 2.1. Matematični zapis postopka linearne interpolacije enorazsežnega signala prikazuje slika 2.2. S posplošitvijo interpolacije na dve razsežnosti je postopek mogoče uporabiti za sivinske slike ter posamezne komponente barvnih slik. Bilinearno interpolacijo v točki ( x, y) izračunamo kot uteženo vsoto funkcijskih vrednosti, ki obdajajo interpolacijsko točko (slika 2.3). Računska zahtevnost interpolacijskih postopkov 2D slik v grobem narašča s kvadratom reda interpolacije, kar pomeni, da je bikubična interpolacija (drugi red) približno štiri krat bolj zahtevna (počasnejša) od bilinearne (prvi red) interpolacije. Interpolacijske postopke je mogoče posplošiti, tako da omogočajo interpolacijo večrazsežnih slik. Kot primer si oglejmo trilinearno interpolacijo, ki jo je mogoče razčleniti na dve bilinearni in eno linearno interpolacijo, kot to prikazuje slika 2.4. Računska zahtevnost interpolacije 3D slik raste s tretjo potenco reda interpolacijskega postopka. 17 Interpolacija in decimacija slik 2.1 Interpolacija slik 1.00 1.00 0.75 0.75 0.50 0.50 0.25 podatki 0.25 podatki interpolacija interpolacija 0.00 0.00 0 1 2 3 0 1 2 3 (a) (b) Slika 2.1: Primerjava interpolacije (a) z najbližjim sosedom in (b) linearne interpolacije. f (x) dx = xi+1 − xi a = xi+1 − x b a b = x − xi x xi-1 xi xi+1 f ( x) = f ( xi) a + f ( xi+1) b (2.1) dx dx Slika 2.2: Linearna interpolacija x (x , ) ( ) dx = x i yj xi+1, yj i+1 − xi dy = yj+1 − yj s = dx · dy d c a = ( xi+1 − x)( yj+1 − y) (x, y) b = ( x − xi)( yj+1 − y) c = ( x b a i+1 − x)( y − yj ) d = ( x − x y (x , i)( y − yj ) i yj+1) (xi+1, yj+1) f ( x, y) = f ( xi, yi) a + f ( xi+1 , yi) b + f ( xi, yi+ i) c + f ( xi+1 , yi+1) d (2.2) s s s s Slika 2.3: Bilinearna interpolacija. 18 Interpolacija in decimacija slik 2.2 Decimacija slik Bilinearna interpolacija v Linearna interpolacija v smeri xy ravnini pri z = z ter z = k zk+1 z osi pri (x, y) (x , , ) ( , ) i yj zk xi+1, yj zk d c (x, y, z ) k (x , ) b a ( ) i yj+1, zk x, y, zk bz (x, y, z) ( (x, y, z) x , dz i+1, yj zk+1) az d c (x, y, zk+1) b (x, y, z a k+1) (x , y (x i j+1, zk+1) i+1, yj+1, zk+1) Bilinearna interpolacija v xy ravnini pri z = zk ter z = zk+1: f ( x, y, zk) = f ( xi, yi, zk) a + f ( xi+1 , yi, zk) b + f ( xi, yi+ i, zk) c + f ( xi+1 , yi+1 , zk) d s s s s f ( x, y, zk+1) = f ( xi, yi, zk+1) a + f ( xi+1 , yi, zk+1) b + f ( xi, yi+ i, zk+1) c + f ( xi+1 , yi+1 , zk+1) d s s s s Linearna interpolacija v smeri z osi pri ( x, y): f ( x, y, z) = f ( x, y, zk) az + f ( x, y, zk+1) bz . (2.3) dz dz Slika 2.4: Trilinearna interpolacija kot zaporedje dveh bilinearnih in ene linearne interpolacije. 2.2 Decimacija slik S postopkom decimacije slik zmanjšamo vzorčno frekvenco ter s tem velikost slik. Skladno z Nyquistovim vzorčnim teoremom je pred postopkom decimacije sliko potrebno filtrirati z nizko prepustnim sitom in na ta način odstraniti visoko frekvenčno informacijo. Pri decimaciji se pogosto uporablja piramidna shema, kjer se vzorčna frekvenca izvirne slike zaporedoma zmanj- šuje s celoštevilskim faktorjem, običajno dva. Filtriranje slike lahko izvedemo s postopkom 2D diskretne konvolucije med podano sliko S velikosti ( H, W ) in konvolucijskim jedrom K velikosti ( A, B). Skladno z naslavljanjem elementov podatkovnega polja numpy lahko 2D diskretno konvolucijo zapišemo kot: A−1 B−1 X X Sc[ i, j] = S[ i − ( k − c 1) , j − ( l − c 2)] · K[ k, l] . (2.4) k=0 l=0 Na področju, kjer slika ni definirana, bomo predpostavili sivinsko vrednost 0. Konstanti c 1 in c 2, ki določata središče konvolucijskega jedra, naj bosta definirani kot c 1 = b A c ter c c. 2 2 = b B 2 V programskem jeziku Python je konvolucijo mogoče neposredno izvesti s štirimi for zankami. Dve zunanji zanki uporabimo za sprehajanje po slikovnih elementih, dve notranji zanki pa za 19 Interpolacija in decimacija slik 2.3 Naloge in vprašanja 3f (x, y), 21 x 21 2f (x, y), 22 x 22 1/400 1/80 1/50 1/80 1/400 1/16 1/8 1/16 1/80 1/16 1/10 1/16 1/80 1f (x, y), 23 x 23 1/8 1/4 1/8 1/50 1/10 4/25 1/10 1/50 1/16 1/8 1/16 1/80 1/16 1/10 1/16 1/80 1/400 1/80 1/50 1/80 1/400 (a) (b) Slika 2.5: (a) Piramidna decimacijska shema. (b) Primer dveh jeder nizkoprepustnega decima-cijskega sita. sprehajanje po konvolucijskem jedru: 1 c = n p . f l o o r ( n p . a r r a y ( K . s h a p e ) /2 .0 ) # Naslov središča konvolucijskega jedra. 2 H , W = S . s h a p e # Velikost vhodne slike. 3 A , B = K . s h a p e # Velikost konvolucijskega jedra. 4 Sc = n p . z e r o s ([ H , W ]) # Podatkovno polje izhodne (zglajene) slike. 5 for i in r a n g e ( H ) : # Vrstica slikovnega elementa. 6 for j in r a n g e ( W ) : # Stolpec slikovnega elementa. 7 for k in r a n g e ( A ) : # Vrstica konvolucijskega jedra. 8 for l in r a n g e ( B ) : # Stolpec konvolucijskega jedra. 9 # Premik naslovov. 10 ic = i - ( k - c [ 0 ] ) 11 jc = j - ( l - c [ 1 ] ) 12 # Pred izračunom preverimo veljavnost naslova slikovnega elementa. 13 if ic > 0 and ic < H and jc > 0 and jc < W : 14 Sc [ i , j ] += K [ k , l ]* S [ ic , jc ] 2.3 Naloge in vprašanja 1. Ustvarite funkcijo interp1d, ki bo interpolirala vrednosti v točkah x. Predpostavite, da so podatki fp podani za monotono naraščajoče zaporedje ekvidistantnih točk xp. Parameter method določa tip interpolacije, in sicer naj ’nearest’ označuje ničti red interpolacije z najbližjim sosedom, ’linear’ pa linearno interpolacijo. Parameter x lahko v splošnem vsebuje poljubno število elementov. Izhodno podatkovno polje f naj bo tipa np.float in enake velikosti kot podatkovno polje x. 1 def i n t e r p 1 d ( x , xp , fp , m e t h o d = ’ l i n e a r ’ ) : 2 ... 20 Interpolacija in decimacija slik 2.3 Naloge in vprašanja Slika 2.6: Od leve proti desni: slika mr_256x256_uint8.raw, slika mr_128x256_uint8.raw, slika mr_217x181x181_uint8.raw v yz ravnini pri x = 110 ter slika decimacija_256x256_uint8.raw. 3 r e t u r n f Kaj so prednosti in slabosti interpolacije z najbližjim sosedom? 2. Ustvarite funkcijo interp2d, ki bo interpolirala sivinske vrednosti v točkah ( x, y). Predpostavite, da definicijsko območje vhodne slike fp napenjata vektorja monotono naraščajočih ekvidistantno razporejenih točk xp in yp. Parameter method naj ima enak pomen kot pri funkciji interp1d. Vhodna parametra x in y lahko v splošnem vsebujeta poljubno, a enako število elementov, podatkovno polje izhodne slike f naj bo tipa np.float in enake velikosti kot podatkovni polji x ter y. 1 def i n t e r p 2 d ( x , y , xp , yp , fp , m e t h o d = ’ l i n e a r ’ ) : 2 ... 3 r e t u r n f (a) Interpolirajte sliko mr_256x256_uint8.raw tako, da podvojite število slikovnih elementov v obeh razsežnostih (velikost interpolirane slike bo tako 512 × 512 slikovnih elementov). Mrežo interpolacijskih točk boste najenostavneje ustvarili s funkcijama meshgrid ter linspace modula numpy. (b) Slika mr_128x256_uint8.raw je nastala z neenako frekvenco vzorčenjem v smeri x in y osi. Slikovni element v smeri x osi je dvakrat večji kot v smeri y osi. Sliko interpolirajte tako, da bo velikost slikovnega elementa v smeri obeh koordinatnih osi enaka. Pri tem prilagodite vzorčno frekvenco zgolj v smeri ene koordinatne osi slike! Uporabite funkcijo interp2d z bilinearno interpolacijo. (c) Interpolirajte osrednji del slike mr_128x256_uint8.raw velikosti x × y = 32 × 64 slikovnih elementov. Pri tem naj bo velikost slikovnega elementa interpolirane slike x × y = 0 , 25 × 0 , 25 mm. Predpostavite, da je velikost slikovnega elementa izhodiščne slike x × y = 2 × 1 mm. 3. Ustvarite funkcijo interp3d, ki bo interpolirala sivinske vrednosti v točkah ( x, y, z). Predpostavite, da definicijsko območje vhodne slike fp napenjajo vektorji monotono narašča-jočih ekvidistantno razporejenih točk xp, yp in zp. Parameter method naj ima enak pomen kot pri funkciji interp1d. Vhodni parametri x, y in z lahko v splošnem vsebujejo poljubno, a enako število elementov, podatkovno polje izhodne slike f naj bo tipa np.float in enake velikosti kot podatkovna polja x, y ter z. 21 Interpolacija in decimacija slik 2.3 Naloge in vprašanja 1 def i n t e r p 3 d ( x , y , z , xp , yp , zp , fp , m e t h o d = ’ l i n e a r ’ ) : 2 ... 3 r e t u r n f Interpolirajte sliko mr_217x181x181_uint8.raw v yz ravnini pri x = 110 , 3. Število slikovnih elementov v smeri y in z osi naj se podvoji. 4. Ustvarite funkcijo conv2d, ki izračuna konvolucijo vhodne slike data s konvolucijskim jedrom kernel ter vrne podatkovno polje izhodne slike odata tipa np.float. 1 def c o n v 2 d ( data , k e r n e l ) : 2 ... 3 r e t u r n o d a t a 5. Ustvarite še funkcijo imDecimate2d, ki bo zaporedoma (level krat) decimirala vhodno sliko s faktorjem dva (glej piramidno shemo na sliki 2.5a). Ko je vrednost parametra kernel enaka None, uporabite konvolucijsko jedro velikosti 3 × 3 iz navodil. 1 def i m D e c i m a t e 2 d ( img , k e r n e l = None , l e v e l =1) : 2 ... 3 r e t u r n o i m g Decimirajte sliki mr_256x256_uint8.raw ter decimacija_256x256_uint8.raw tako, da bo velikost decimirane slike 64 × 64 slikovnih elementov. Uporabite funkcijo imDecimate2d s konvolucijskim jedrom nizkoprepustnega sita velikosti 3 × 3 (slika 2.5b). Izvedite decimacijo tudi brez filtriranja ter primerjajte dobljeni sliki. Kaj opazite? 22 Interpolacija in decimacija slik 2.4 Rešitve in odgovori na vprašanja 2.4 Rešitve in odgovori na vprašanja Pri odgovorih privzamemo, da se funkcije iz rešitev nahajajo v modulu funkcije, slikovno gradivo pa se nahaja v podmapi poglavje_2. Naprej uvozimo potrebne module in naložimo slike. 1 i m p o r t n u m p y as np 2 f r o m m a t p l o t l i b i m p o r t p y p l o t as pp 3 i m p o r t f u n k c i j e 4 5 im1 = f u n k c i j e . i m L o a d R a w 2 d ( 6 ’ . / p o g l a v j e _ 2 / m r _ 2 5 6 x 2 5 6 _ u i n t 8 . r a w ’ , 256 , 2 5 6 ) 7 im2 = f u n k c i j e . i m L o a d R a w 2 d ( 8 ’ . / p o g l a v j e _ 2 / m r _ 1 2 8 x 2 5 6 _ u i n t 8 . r a w ’ , 128 , 2 5 6 ) 9 im3 = f u n k c i j e . i m L o a d R a w 3 d ( 10 ’ . / p o g l a v j e _ 2 / m r _ 2 1 7 x 1 8 1 x 1 8 1 _ u i n t 8 . r a w ’ , 217 , 181 , 1 8 1 ) 11 im4 = f u n k c i j e . i m L o a d R a w 2 d ( 12 ’ . / p o g l a v j e _ 2 / d e c i m a c i j a _ 2 5 6 x 2 5 6 _ u i n t 8 . r a w ’ , 256 , 2 5 6 ) 1. V modulu funkcije ustvarimo funkcijo interp1d. 1 def i n t e r p 1 d ( x , xp , fp , m e t h o d = ’ l i n e a r ’ ) : 2 3 x = n p . a s a r r a y ( x , n p . f l o a t ) 4 xp = n p . a s a r r a y ( xp , n p . f l o a t ) 5 fp = n p . a s a r r a y ( fp , n p . f l o a t ) 6 7 x s h a p e = x . s h a p e 8 x = x . f l a t t e n () 9 f = n p . z e r o s _ l i k e ( x ) 10 dx = f l o a t ( xp [1] - xp [ 0 ] ) 11 Nxp = x p . s i z e 12 Nx = x . s i z e 13 14 if m e t h o d == ’ l i n e a r ’ : 15 for i in r a n g e ( Nx ) : 16 i n d f = ( x [ i ] - x [ 0 ] ) / dx 17 d = i n d f - int ( i n d f ) 18 i n d 1 = max ( int ( i n d f ) , 0) 19 i n d 2 = min ( i n d 1 + 1 , Nxp - 1) 20 f [ i ] = (1 .0 - d ) * fp [ i n d 1 ] + d * fp [ i n d 2 ] 21 ’ ’ ’ h i t r a i z v e d b a b r e z for z a n k e 22 i n d f = ( x - xp [ 0 ] ) / dx 23 i n d 1 = i n d f . a s t y p e ( ’ int ’) 24 f = n p . z e r o s ([ Nx , 1 ] ) 25 i n d 1 = n p . m a x i m u m ( ind1 , 0) 26 i n d 2 = n p . m i n i m u m ( i n d 1 + 1 , Nxp - 1) 27 f [ i n d o k ] = (1 .0 - d ) * fp [ i n d 1 ] + d * fp [ i n d 2 + 1] 28 ’ ’ ’ 23 Interpolacija in decimacija slik 2.4 Rešitve in odgovori na vprašanja 29 30 e l i f m e t h o d == ’ n e a r e s t ’ : 31 for i in r a n g e ( Nx ) : 32 i n d f = n p . r o u n d (( x [ i ] - xp [ 0 ] ) / dx ) 33 ind = min ( max ( indf , 0) , Nxp - 1) 34 f [ i ] = fp [ ind ] 35 ’ ’ ’ h i t r a i z v e d b a b r e z for z a n k e 36 ind = n p . r o u n d (( x - xp [ 0 ] ) / dx ) 37 ind = n p . m i n i m u m ( n p . m a x i m u m ( ind , 0) , Nxp - 1) 38 f = fp [ ind ] 39 ’ ’ ’ 40 41 e l s e : 42 r a i s e V a l u e E r r o r ( 43 ’ V r e d n o s t p a r a m e t r a " m e t h o d " je l a h k o ’ 44 ’ " l i n e a r " ali " n e a r e s t "! ’ ) 45 46 f . s h a p e = x s h a p e 47 48 r e t u r n f Glavna prednost interpolacije z metodo najbližjega soseda leži v računski nezahtevno-sti postopka, slabost pa v nizki kakovosti interpolirane slike. Linearna interpolacija je približno 4-krat zahtevnejša od interpolacije z metodo najbližjega soseda. Kakovost interpoliranih slik je bistveno boljša, saj postopek upošteva uteženo vsoto sivinskih vrednost 4-ih sosednjih slikovnih elementov. 2. V modulu funkcije ustvarimo funkcijo interp2d. 1 def i n t e r p 2 d ( x , y , xp , yp , fp , m e t h o d = ’ l i n e a r ’ ) : 2 3 x = n p . a s a r r a y ( x , n p . f l o a t ) 4 y = n p . a s a r r a y ( y , n p . f l o a t ) 5 xp = n p . a s a r r a y ( xp , n p . f l o a t ) 6 yp = n p . a s a r r a y ( yp , n p . f l o a t ) 7 fp = n p . a s a r r a y ( fp , n p . f l o a t ) 8 9 x s h a p e = x . s h a p e 10 x , y = x . f l a t t e n () , y . f l a t t e n () 11 dx , dy = f l o a t ( xp [1] - xp [ 0 ] ) , f l o a t ( yp [1] - yp [ 0 ] ) 12 Nx , Ny = x.size , y . s i z e 13 Nxp , Nyp = xp.size , y p . s i z e 14 if Nx != Ny : 15 r a i s e V a l u e E r r o r ( 16 ’ Š t e v i l o e l e m e n t o v v x in y m o r a b i t i e n a k o ! ’ ) 17 f = n p . z e r o s ([ Nx ]) 18 if m e t h o d == ’ l i n e a r ’ : 19 for i in r a n g e ( Nx ) : 20 i n d x f = ( x [ i ] - xp [ 0 ] ) / dx 24 Interpolacija in decimacija slik 2.4 Rešitve in odgovori na vprašanja 21 i n d y f = ( y [ i ] - yp [ 0 ] ) / dy 22 xf = i n d x f - int ( i n d x f ) 23 yf = i n d y f - int ( i n d y f ) 24 i n d x = max ( min ( int ( i n d x f ) , Nxp - 1) , 0) 25 i n d y = max ( min ( int ( i n d y f ) , Nyp - 1) , 0) 26 a = (1 .0 - xf ) *(1 .0 - yf ) 27 b = xf *(1 .0 - yf ) 28 c = (1 .0 - xf ) * yf 29 d = xf * yf 30 s = 1 .0 31 f [ i ] = a / s * fp [ indy , i n d x ] + \ 32 b / s * fp [ indy , min ( i n d x + 1 , Nxp - 1) ] + \ 33 c / s * fp [ min ( i n d y + 1 , Nyp - 1) , i n d x ] + \ 34 d / s * fp [ 35 min ( i n d y + 1 , Nyp - 1) , min ( i n d x + 1 , Nxp - 1) 36 ] 37 38 e l i f m e t h o d == ’ n e a r e s t ’ : 39 for i in r a n g e ( Nx ) : 40 i n d x f = n p . r o u n d (( x [ i ] - xp [ 0 ] ) / dx ) 41 i n d y f = n p . r o u n d (( y [ i ] - yp [ 0 ] ) / dy ) 42 i n d x = min ( max ( indxf , 0) , Nxp - 1) 43 i n d y = min ( max ( indyf , 0) , Nyp - 1) 44 f [ i ] = fp [ indy , i n d x ] 45 46 e l s e : 47 r a i s e V a l u e E r r o r ( 48 ’ V r e d n o s t p a r a m e t r a " m e t h o d " je l a h k o ’ 49 ’ " l i n e a r " ali " n e a r e s t "! ’ ) 50 51 f . s h a p e = x s h a p e 52 53 r e t u r n f (a) Interpolacija s podvojenim vzorčenjem v smeri obeh koordinatnih osi (slika 2.7). 1 x = y = n p . l i n s p a c e (0 , 255 , 5 1 2 ) 2 xp = yp = n p . a r a n g e ( 2 5 6 ) 3 Yi , Xi = n p . m e s h g r i d ( y , x , i n d e x i n g = ’ ij ’ ) 4 i m 1 i _ l i n e a r = f u n k c i j e . i n t e r p 2 d ( 5 Xi , Yi , xp , yp , im1 , ’ l i n e a r ’ ) 6 i m 1 i _ n e a r e s t = f u n k c i j e . i n t e r p 2 d ( 7 Xi , Yi , xp , yp , im1 , ’ n e a r e s t ’ ) 8 9 p p . f i g u r e ( ’ O d g o v o r 2 a ) ’ ) 10 11 p p . s u b p l o t (1 , 2 , 1) 12 p p . i m s h o w ( i m 1 i _ l i n e a r , c m a p = ’ g r a y ’ ) 13 p p . t i t l e ( ’ L i n e a r n a ’ ) 25 Interpolacija in decimacija slik 2.4 Rešitve in odgovori na vprašanja (a) Izvirna slika (b) Interp. z najbližjim sosedom (c) Bilinearna interpolacija Slika 2.7: Interpolacija s podvojenim vzorčenjem v smeri obeh koordinatnih osi. 14 15 p p . s u b p l o t (1 , 2 , 2) 16 p p . i m s h o w ( i m 1 i _ n e a r e s t , c m a p = ’ g r a y ’ ) 17 p p . t i t l e ( ’ N a j b l i ž ji s o s e d ’ ) 18 19 p p . s h o w () (b) Interpolacija s podvojenim vzorčenjem v smeri x osi (slika 2.8). (a) Izvirna slika (b) Interp. z najbližjim sosedom (c) Bilinearna interpolacija Slika 2.8: Interpolacija s podvojenim vzorčenjem v smeri x osi. 1 xp = n p . a r a n g e (0 , 256 , 2) 2 yp = n p . a r a n g e ( 2 5 6 ) 3 x = n p . a r a n g e (0 , 2 5 6 ) 4 y = yp 5 Yi , Xi = n p . m e s h g r i d ( y , x , i n d e x i n g = ’ ij ’ ) 6 i m 2 i _ l i n e a r = f u n k c i j e . i n t e r p 2 d ( 7 Xi , Yi , xp , yp , im2 , ’ l i n e a r ’ ) 8 i m 2 i _ n e a r e s t = f u n k c i j e . i n t e r p 2 d ( 9 Xi , Yi , xp , yp , im2 , ’ n e a r e s t ’ ) 10 11 p p . f i g u r e ( ’ O d g o v o r 2 b ) ’ ) 26 Interpolacija in decimacija slik 2.4 Rešitve in odgovori na vprašanja 12 13 p p . s u b p l o t (1 , 2 , 1) 14 p p . i m s h o w ( i m 2 i _ l i n e a r , c m a p = ’ g r a y ’ ) 15 p p . t i t l e ( ’ L i n e a r n a ’ ) 16 17 p p . s u b p l o t (1 , 2 , 2) 18 p p . i m s h o w ( i m 2 i _ n e a r e s t , c m a p = ’ g r a y ’ ) 19 p p . t i t l e ( ’ N a j b l i ž ji s o s e d ’ ) 20 21 p p . s h o w () (c) Interpolacija osrednjega dela slike. 1 xi = n p . a r a n g e ( 1 2 8 - 16*2 , 128 + 16*2 , 0 .25 ) 2 yi = n p . a r a n g e ( 1 2 8 - 32 , 128 + 32 , 0 .25 ) 3 Yi , Xi = n p . m e s h g r i d ( yi , xi , i n d e x i n g = ’ ij ’ ) 4 5 i m 2 i _ b o x _ n e a r e s t = f u n k c i j e . i n t e r p 2 d ( 6 Xi , Yi , xp , yp , im2 , ’ n e a r e s t ’ ) 7 i m 2 i _ b o x _ l i n e a r = f u n k c i j e . i n t e r p 2 d ( 8 Xi , Yi , xp , yp , im2 , ’ l i n e a r ’ ) 9 10 f r o m m a t p l o t l i b . p a t c h e s i m p o r t R e c t a n g l e 11 r e g i o n = R e c t a n g l e ( ( 6 4 - 16 , 128 - 32) , 32 , 64 , 12 e d g e c o l o r = ’ b ’ , f a c e c o l o r = ’ n o n e ’ ) 13 14 p p . f i g u r e ( ’ O d g o v o r 2 c ) ’ ) 15 p p . s u p t i t l e ( ’ I n t e r p o l a c i j a o s r e d n j e g a d e l a s l i k e ’ ) 16 17 p p . s u b p l o t (1 , 3 , 1) 18 p p . i m s h o w ( im2 , c m a p = ’ g r a y ’ , v m i n =0 , v m a x = 2 5 5 ) 19 p p . g c a () . a d d _ p a t c h ( r e g i o n ) 20 p p . t i t l e ( ’ I z h o d i š č na s l i k a ’ ) 21 22 p p . s u b p l o t (1 , 3 , 2) 23 p p . t i t l e ( ’ N a j b l i ž ji s o s e d ’ ) 24 p p . i m s h o w ( i m 2 i _ b o x _ n e a r e s t , c m a p = ’ g r a y ’ , v m i n =0 , v m a x = 2 5 5 ) 25 26 p p . s u b p l o t (1 , 3 , 3) 27 p p . t i t l e ( ’ L i n e a r n a ’ ) 28 p p . i m s h o w ( i m 2 i _ b o x _ l i n e a r , c m a p = ’ g r a y ’ , v m i n =0 , v m a x = 2 5 5 ) 29 30 p p . s h o w () 3. V modulu funkcije ustvarimo funkcijo interp3d. 1 def i n t e r p 3 d ( x , y , z , xp , yp , zp , fp , m e t h o d = ’ l i n e a r ’ ) : 2 x = n p . a s a r r a y ( x , n p . f l o a t ) 3 y = n p . a s a r r a y ( y , n p . f l o a t ) 4 z = n p . a s a r r a y ( z , n p . f l o a t ) 27 Interpolacija in decimacija slik 2.4 Rešitve in odgovori na vprašanja (a) Izhodiščna slika (b) Interp. z najbližjim sosedom (c) Bilinearna interpolacija Slika 2.9: Interpolacija osrednjega dela slike. Velikost slikovnega elementa interpolirane slike znaša x × y = 0 , 25 × 0 , 25 mm. 5 xp = n p . a s a r r a y ( xp , n p . f l o a t ) 6 yp = n p . a s a r r a y ( yp , n p . f l o a t ) 7 zp = n p . a s a r r a y ( zp , n p . f l o a t ) 8 fp = n p . a s a r r a y ( fp , n p . f l o a t ) 9 10 x s h a p e = x . s h a p e 11 x = x . f l a t t e n () 12 y = y . f l a t t e n () 13 z = z . f l a t t e n () 14 dx = f l o a t ( xp [1] - xp [ 0 ] ) 15 dy = f l o a t ( yp [1] - yp [ 0 ] ) 16 dz = f l o a t ( zp [1] - zp [ 0 ] ) 17 Nxp , Nyp , Nzp = xp.size , yp.size , z p . s i z e 18 Nx , Ny , Nz = x.size , y.size , z . s i z e 19 if Nx != Ny or Nx != Nz : 20 r a i s e V a l u e E r r o r ( 21 ’ Š t e v i l o e l e m e n t o v v x , y in z m o r a b i t i e n a k o ! ’ ) 22 23 f = n p . z e r o s ([ Nx ]) 24 if m e t h o d == ’ l i n e a r ’ : 25 for i in r a n g e ( Nx ) : 26 i n d x f = ( x [ i ] - xp [ 0 ] ) / dx 27 i n d y f = ( y [ i ] - yp [ 0 ] ) / dy 28 i n d z f = ( z [ i ] - zp [ 0 ] ) / dz 29 xf = i n d x f - int ( i n d x f ) 30 yf = i n d y f - int ( i n d y f ) 31 zf = i n d z f - int ( i n d z f ) 32 i n d x = max ( min ( int ( i n d x f ) , Nxp - 1) , 0) 33 i n d y = max ( min ( int ( i n d y f ) , Nyp - 1) , 0) 34 i n d z = max ( min ( int ( i n d z f ) , Nzp - 1) , 0) 35 a = (1 .0 - xf ) *(1 .0 - yf ) 36 b = xf *(1 .0 - yf ) 37 c = (1 .0 - xf ) * yf 28 Interpolacija in decimacija slik 2.4 Rešitve in odgovori na vprašanja 38 d = xf * yf 39 s = 1 .0 40 bz = zf 41 az = 1 .0 - zf 42 fzk = a / s * fp [ indz , indy , i n d x ] + \ 43 b / s * fp [ indz , indy , min ( i n d x + 1 , Nxp - 1) ] + \ 44 c / s * fp [ indz , min ( i n d y + 1 , Nyp - 1) , i n d x ] + \ 45 d / s * fp [ indz , 46 min ( i n d y + 1 , Nyp - 1) , min ( i n d x + 1 , Nxp - 1) ] 47 i n d z 1 = min ( i n d z + 1 , Nzp - 1) 48 f z k 1 = a / s * fp [ indz1 , indy , i n d x ] + \ 49 b / s * fp [ indz1 , indy , min ( i n d x + 1 , Nxp - 1) ] + \ 50 c / s * fp [ indz1 , min ( i n d y + 1 , Nyp - 1) , i n d x ] + \ 51 d / s * fp [ indz1 , min ( i n d y + 1 , Nyp - 1) , 52 min ( i n d x + 1 , Nxp - 1) ] 53 f [ i ] = fzk * az + f z k 1 * bz 54 55 e l i f m e t h o d == ’ n e a r e s t ’ : 56 for i in r a n g e ( Nx ) : 57 i n d x f = n p . r o u n d (( x [ i ] - xp [ 0 ] ) / dx ) 58 i n d y f = n p . r o u n d (( y [ i ] - yp [ 0 ] ) / dy ) 59 i n d z f = n p . r o u n d (( z [ i ] - zp [ 0 ] ) / dz ) 60 i n d x = min ( max ( indxf , 0) , Nxp - 1) 61 i n d y = min ( max ( indyf , 0) , Nyp - 1) 62 i n d z = min ( max ( indzf , 0) , Nzp - 1) 63 f [ i ] = fp [ indz , indy , i n d x ] 64 65 e l s e : 66 r a i s e V a l u e E r r o r ( 67 ’ V r e d n o s t p a r a m e t r a " m e t h o d " je l a h k o ’ 68 ’ " l i n e a r " ali " n e a r e s t "! ’ ) 69 70 f . s h a p e = x s h a p e 71 72 r e t u r n f Interpolacija v yz ravnini pri x = 110 , 3 (slika 2.10). 1 xp = n p . a r a n g e ( 2 1 7 ) 2 yp = n p . a r a n g e ( 1 8 1 ) 3 zp = n p . a r a n g e ( 1 8 1 ) 4 y = z = n p . l i n s p a c e (0 , 180 , 1 8 1 * 2 ) 5 Zi , Yi , Xi = n p . m e s h g r i d ( z , y , 110 .3 , i n d e x i n g = ’ ij ’ ) 6 i m 3 i _ n e a r e s t = f u n k c i j e . i n t e r p 3 d ( 7 Xi , Yi , Zi , xp , yp , zp , im3 , ’ n e a r e s t ’ ) 8 i m 3 i _ l i n e a r = f u n k c i j e . i n t e r p 3 d ( 9 Xi , Yi , Zi , xp , yp , zp , im3 , ’ l i n e a r ’ ) 10 11 p p . f i g u r e ( ’ O d g o v o r 3 ’ ) 29 Interpolacija in decimacija slik 2.4 Rešitve in odgovori na vprašanja (a) Interp. z najbližjim sosedom (b) Trilinearna interpolacija Slika 2.10: Interpolacija v yz ravnini pri x = 110 . 3 s podvojenim vzorčenjem v smeri y in z osi. 12 13 p p . s u b p l o t (1 , 2 , 1) 14 p p . i m s h o w ( i m 3 i _ l i n e a r . s q u e e z e () , c m a p = ’ g r a y ’ ) 15 p p . t i t l e ( ’ L i n e a r n a ’ ) 16 17 p p . s u b p l o t (1 , 2 , 2) 18 p p . i m s h o w ( i m 3 i _ n e a r e s t . s q u e e z e () , c m a p = ’ g r a y ’ ) 19 p p . t i t l e ( ’ N a j b l i ž ji s o s e d ’ ) 20 21 p p . s h o w () 4. V modulu funkcije ustvarimo funkcijo conv2d. 1 def c o n v 2 d ( data , k e r n e l ) : 2 K = n p . a s a r r a y ( kernel , n p . f l o a t ) 3 S = n p . a s a r r a y ( data , n p . f l o a t ) 4 c = n p . f l o o r ( n p . a r r a y ( K . s h a p e ) /2 .0 ) # Središče konvolucijskega jedra. 5 H , W = S . s h a p e # Velikost vhodne slike. 6 A , B = K . s h a p e # Velikost konvolucijskega jedra. 7 o d a t a = n p . z e r o s ([ H , W ]) # Podatkovno polje izhodne (zglajene) slike. 8 for i in r a n g e ( H ) : # Vrstica slikovnega elementa. 9 for j in r a n g e ( W ) : # Stolpec slikovnega elementa. 10 for k in r a n g e ( A ) : # Vrstica konvolucijskega jedra. 11 for l in r a n g e ( B ) : # Stolpec konvolucijskega jedra. 12 # Premik naslovov. 13 ic = i - ( k - c [ 0 ] ) 14 jc = j - ( l - c [ 1 ] ) 15 # Pred izračunom preverimo veljavnost naslova slikovnega elementa. 16 if ic > 0 and ic < H and jc > 0 and jc < W : 17 o d a t a [ i , j ] += K [ k , l ]* S [ ic , jc ] 18 19 r e t u r n o d a t a 5. V modulu funkcije ustvarimo funkcijo imDecimate2d. 30 Interpolacija in decimacija slik 2.4 Rešitve in odgovori na vprašanja 1 def i m D e c i m a t e 2 d ( img , k e r n e l = None , l e v e l =1) : 2 if k e r n e l is N o n e : 3 k e r n e l = n p . a r r a y ( [ [ 1 .0 /16 , 1/8 , 1/16] , 4 [1/8 , 1/4 , 1/8] , 5 [1 .0 /16 , 1/8 , 1 / 1 6 ] ] ) 6 o i m g = n p . a r r a y ( img , ’ f l o a t ’ ) 7 for i in r a n g e ( l e v e l ) : 8 o i m g = c o n v 2 d ( oimg , k e r n e l ) 9 o i m g = o i m g [::2 , : : 2 ] 10 11 r e t u r n o i m g Rezultat decimacija slike z in brez uporabe nizkoprepustnega sita velikosti 3 × 3 je prikazan na sliki 2.11. Pri decimaciji brez predhodnega filtriranja slike z nizkoprepustnim sitom, lahko pride do popačenja ali izgube informacije, saj predhodno ne omejimo frekvenčne informacije slike na polovico vzorčne frekvence. Omenjeni pojav je še posebej poudarjen pri decimaciji sintetične slike decimacija_256x256_uint8.raw. 1 K3 = n p . a r r a y ( [ [ 1 .0 /16 , 1/8 , 1/16] , 2 [1/8 , 1/4 , 1/8 ] , 3 [1 .0 /16 , 1/8 , 1 / 1 6 ] ] ) 4 K5 = n p . a r r a y ( [ [ 1 .0 /400 , 1/80 , 1/50 , 1/80 , 1/400] , 5 [1/80 , 1/16 , 1/10 , 1/16 , 1 / 8 0 ] , 6 [1/50 , 1/10 , 4/25 , 1/10 , 1 / 5 0 ] , 7 [1/80 , 1/16 , 1/10 , 1/16 , 1 / 8 0 ] , 8 [1 .0 /400 , 1/80 , 1/50 , 1/80 , 1 / 4 0 0 ] ] ) 9 10 i m 4 d _ k 3 = f u n k c i j e . i m D e c i m a t e 2 d ( im4 , K3 ,2) 11 i m 4 d = im4 [ : : 4 , : : 4 ] 12 i m 1 d _ k 3 = f u n k c i j e . i m D e c i m a t e 2 d ( im1 , K3 ,2) 13 i m 1 d = im1 [ : : 4 , : : 4 ] 14 15 p p . f i g u r e ( ’ O d g o v o r 5 ’ ) 16 17 p p . s u b p l o t (2 , 3 , 1) 18 p p . i m s h o w ( im1 , c m a p = ’ g r a y ’ ) 19 p p . t i t l e ( ’ I z v i r n a s l i k a ’ ) 20 21 p p . s u b p l o t (2 , 3 , 2) 22 p p . i m s h o w ( im1d_k3 , c m a p = ’ g r a y ’ ) 23 p p . t i t l e ( ’ D e c i m i m a c i j a s f i l t r a n j e m ’ ) 24 25 p p . s u b p l o t (2 , 3 , 3) 26 p p . i m s h o w ( im1d , c m a p = ’ g r a y ’ ) 27 p p . t i t l e ( ’ D e c i m i r a n a b r e z f i l t r i r a n j a ’ ) 28 29 p p . s u b p l o t (2 , 3 , 4) 30 p p . i m s h o w ( im4 , c m a p = ’ g r a y ’ ) 31 p p . t i t l e ( ’ I z v i r n a s l i k a ’ ) 31 Interpolacija in decimacija slik 2.4 Rešitve in odgovori na vprašanja 32 33 p p . s u b p l o t (2 , 3 , 5) 34 p p . i m s h o w ( im4d_k3 , c m a p = ’ g r a y ’ ) 35 p p . t i t l e ( ’ D e c i m i m a c i j a s f i l t r a n j e m ’ ) 36 37 pp. (2 , 3 , 6) 38 p p . i m s h o w ( im4d , c m a p = ’ g r a y ’ ) 39 p p . t i t l e ( ’ D e c i m i r a n a b r e z f i l t r a n j a ’ ) 40 41 p p . s h o w () (a) Izvirna slika (b) Decimacija s sitom (c) Decimacija brez sita (d) Izvirna slika (e) Decimacija s sitom (f) Decimacija brez sita Slika 2.11: Dve zaporedni decimaciji s faktorjem 2 z in brez uporabe nizkoprepustnega sita velikosti 3 × 3. 32 Poglavje 3 Parametri in kakovost slik Poglavje je namenjena spoznavanju in razumevanju osnovnih lastnosti realnih slik kot so svetlost, dinamično območje, histogram, kvantizacija, šum in barva ter spoznavanju načinov za določanje značilnih parametrov kakovosti realnih slik kot je razmerje signal-šum (slika 3.1). Kontrast2:kM Prostorska2ločljivost Dinamično2območje2:nM Razmerje2signal-šum2:SNRM zajem naraščajoča2gostota2prog zvezne kvantizacija diskretne idealno realno sivine sivine σa idealno L μa lmax realno lmax σb modulacijska2prenosna2funkcija k MTF μb lmin Kontrast2 lmin Diferencialni2SNR: k2=2:l 2-2 M/: 2F2 M 0 max lmin lmax lmin Gostota2parov2prog2:lp/mmM 2 2 n =2log SNR 2-2 M/: 2F2 M1/22 2:l 2-2 2F21M2 μ σ σ max lmin D=2: μa b a b Slika 3.1: Parametri kakovosti slik. 3.1 Naloge in vprašanja 1. S pomočjo fotoaparata zajemite sliko kalibra ColorChecker in sliko kalibra ISO-12233, ki ju prikazuje slika 3.2. Bliskavica naj bo pri tem izklopljena. Sliki poizkušajte zajeti tako, da bosta zunanja robova kalibra čim bolje poravnana s tipalom. Sliki prenesite na računalnik in ju uvozite s pomočjo funkcije open modula PIL.Image in funkcije array modula numpy ter ju prikažite s funkcijo imshow modula matplotlib.pyplot. Iz zajetih slik izluščite pravokotna področja oziroma podslike tako, da bo vsako področje vsebovalo le eno barvo oziroma sivino. Področja lahko shranite v seznam ali večrazsežno polje v enakem vrstnem redu kot so označena na sliki 3.2a. Točke na sliki boste najenostavneje izbrali s funkcijo ginput modula matplotlib.pyplot. Za hitro in enostavno določanje pravokotnih področij na sliki lahko približno določite zgolj središči področij 1 in 24, lege preostalih pravokotnih podpodročij pa izračunate. Na podoben način lahko določite sivinski prerez kalibra ISO-12233, ki ga prikazuje rdeča črta na sliki 3.2b. Števila na kalibru ISO-12233 33 Parametri in kakovost slik 3.1 Naloge in vprašanja označujejo število prog v enotah 100, ki ustrezajo višini uporabnega dela kalibra (200 mm). Na primer, število 3 označuje proge širine 200 mm. 100·3 (a) Kaliber ColorChecker (b) Kaliber ISO-12233 Slika 3.2: Slike kalibrov z oznakami. 2. Posamezna področja pretvorite v sivinske slike po enačbi S = 0 . 299· R+0 . 587· G, 0 . 144· B, kjer R, G in B predstavljajo sivinske vrednosti rdeče, zelene in modre barvne komponente. Za vsako področje izračunajte povprečje in standardno deviacijo sivinskih vrednosti. Raz-mislite, katero področje bi moralo imeti najmanjšo in katero največjo povprečno 8-bitno sivinsko vrednost. Navedite zaporedni številki pripadajočih področij. 3. Prostorska ločljivost optičnega sistema nam pove najmanjšo razdaljo med točkastima objektoma, pri kateri lahko objekta še dobro razločimo. Slednjo lahko ocenimo z mo-dulacijsko prenosno funkcijo sistema (MTF) [4], ki meri sivinski kontrast v odvisnosti od prostorske gostote svetlo-temnih prog. Gostoto prog kalibracijske tarče MTF najpogosteje podamo kot število parov prog na milimeter (lp/mm), ločljivost sistema pa pogosto podamo kot število parov prog, pri katerem sivinski kontrast pade na 10 % začetne vrednosti (ilustracija na sliki 3.3). Prostorsko ločljivost slikovnega sistema lahko določimo tudi tako, da zajamemo sliko odziva na enotino stopnico. V ta namen uporabimo kalibracijsko tarčo z ostrim prehod sivinskih vrednosti (slika 3.4). Zajeti odziv nato odvajamo v smeri, ki je pravokotna na prehod. Na ta način dobimo linijski odziv slikovnega sistema (ang. Line Spread Function ali LSF), tj. odziv slikovnega sistema na neskončno tanko in svetlo črto. Za prostorsko ločljivost običajno proglasimo širino linijskega odziva pri polovični amplitudi (ang. Full Width at Half Maximum ali FWHM). Ta postopek je zelo enostaven, saj je treba zajeti zgolj sliko kalibracijske tarče z ostrim prehodom sivinskih vrednosti. Zaradi numeričnega odvajanja pa je postopek zelo občutljiv na prisotnost šuma v zajeti sliki. Izrišite z rdečo črto označeni sivinski prerez kalibra ISO-12233 ter približno določite indeks območja (na kalibru ISO-12233 je označen z 1 do 10), kjer sivinski kontrast k s slike 3.1 pade na 10 % začetne vrednosti. Ob smiselni uporabi lastnosti kalibra ISO-12233 (višina 200 mm) približno ocenite širino črte v milimetrih, ki ustreza dobljeni vrednosti. Kakovost prereza lahko izboljšate tako, da povprečite nekaj zaporednih vrstic slike. 34 Parametri in kakovost slik 3.1 Naloge in vprašanja (a) MTF tarča (b) Odziv na MTF tarčo 1.00 1.00 0.75 0.75 0.50 0.50 0.25 0.25 0.00 0.00 0 500 1000 0 500 1000 (c) Prerez MTF tarče (d) Prerez odziva na MTF tarčo Slika 3.3: Primer MTF kalibracijske tarče in pripadajoči odziv slikovnega sistema. (a) LSF tarča (b) Odziv na LSF tarčo 1.00 1.00 Prerez 0.75 0.75 Odvod FWHM 0.50 0.50 0.25 0.25 0.00 0.00 0 200 400 0 200 400 (c) Prerez LSF tarče (d) Prerez in pripadajoči odvod odziva na LSF tarčo Slika 3.4: Primer LSF kalibracijske tarče in pripadajoči odziv slikovnega sistema ter FWHM ločljivost. 4. Narišite graf, ki prikazuje povprečne sivinske vrednosti področij od 19 do 24 slike kalibra ColorChecker v odvisnosti od pripadajoče zaporedne številke področja. Na podlagi prikazanih vrednosti ocenite uporabno dinamično območje sivinskih vrednosti (izrazite s številom bitov). 5. Histogram slike je grafično orodje za prikazovanje frekvenčne porazdelitve sivinskih vre-35 Parametri in kakovost slik 3.1 Naloge in vprašanja dnosti slikovnih elementov. Abscisna os histograma predstavlja sivinske vrednosti, ordi-natna os histograma pa podaja število slikovnih elementov na izbranem intervalu sivinskih vrednosti. Ustvarite funkcijo za izračun in prikaz histograma slike. 1 def i m H i s t o g r a m ( img , b i n s =256 , s p a n = None , 2 d e n s i t y = False , t i t l e = N o n e ) : 3 ... 4 r e t u r n hist , e d g e s Pri tem parameter img predstavlja vhodno sliko, parameter bins pa število razredov histograma na razponu sivinskih vrednosti span. Če je vrednost parametra span enaka None, potem naj razpon sivinskih vrednosti določata najmanjša in največja sivinska vrednost v sliki. Parameter title predstavlja naslovno vrstico grafičnega prikaza histograma, ki ga ustvarimo le, ko je vrednost različna od None. Razredi naj vključujejo spodnjo, ne pa tudi zgornjo mejo razpona sivinskih vrednosti. Če je vrednost parametra density enaka True, potem histogram normalizirajte tako, da predstavlja oceno gostote verjetnosti sivinskih vrednosti. Funkcija naj vrne vrednosti v obliki vektorjev frekvenc hist in robnih točk razredov edges, katerih število elementov znaša bins ter bins + 1. Histogram izračunajte brez uporabe naprednih Python funkcij, za prikazovanje pa uporabite funkcijo bar modula matplotlib.pyplot. Pravilnost delovanja programske kode preverite s funkcijo histogram modula numpy. Na področjih 19 in 24 kalibra ColorChecker kvalitativno preverite ali šum ustreza normalni porazdelitvi. To storite tako, da v skupno grafično okno izrišete normalizirani histogram sivin in pripadajočo Gaussovo porazdelitev: 1 N ( µ, σ 2) = √ exp−( x− µ)2 2 σ 2 . (3.1) σ 2 π 6. Razmerje signal-šum (SNR) je pomemben kriterij za vrednotenje relativne jakosti oziroma moči signala glede na prisoten šum. SNR je namreč merilo zanesljivosti oziroma sposob-nosti zaznavanja prisotnosti sprememb v opazovanem signalu. Pogosto se uporabljajo trije osnovni načini podajanja SNR, in sicer amplitudni (SNRA), diferencialni (SNRD) ter močnostni (SNRM) način. Podajanje SNR ni standardizirano in je predvsem odvisno od vrste signala in šuma ter od namena podajanja in uporabe. V primeru dveh nivojev signala zapišemo SNRD tako kot prikazuje slika 3.1. Izračunajte diferencialno razmerje signal-šum (SNRD) med področjema 19 in 24. Na podoben način izračunajte še diferencialno razmerje signal-šum med področjema 23 in 24. Katero izmed obeh razmerij je večje? 7. Barvo slikovnega elementa običajno definiramo s tremi, lahko pa tudi le z dvema kom-ponentama oziroma vrednostima. Zaradi načina pretvorbe svetlobe v digitalni zapis se najpogosteje uporablja zapis barve slikovnega elementa s komponentami RGB, ki ustrezajo odzivom treh različnih tipal svetlobe. Slednja so selektivno občutljiva na valovnih območjih okoli 700 nm ( R), 550 nm ( G) in 450 nm ( B). Obstajajo tudi drugi barvni 36 Parametri in kakovost slik 3.1 Naloge in vprašanja prostori, ki so bolj primerni za analizo digitalnih slik, na primer XYZ in Lab, kjer ena izmed treh komponenta predstavlja svetlost, preostali dve komponenti pa barvni odtenek (poglobljeno obravnavo različnih barvnih prostorov najdemo v [5, 6]). Sliko, zapisano v RGB barvnem prostoru, lahko pretvorimo v drug barvni prostor z (ne)linearno preslikavo RGB komponent. Preslikava iz RGB v XYZ barvni prostor pri referenčni beli osvetlitvi D65 je definirana kot:       X 0 , 4124564 0 , 3575761 0 , 1804375 R  Y  = 0 , 2126729 0 , 7151522 0 , 0721750 ·  G       Z 0 , 0193339 0 , 1191920 0 , 9503041 B (3.2) x = X , y = Y , z = Z , X + Y + Z X + Y + Z X + Y + Z pri čemer morajo vrednosti komponent R, G in B ležati na intervalu [0, 1]. Matrično množenje, s katerim lahko zapišemo preslikavo iz RGB v XZY barvni prostor, najlažje udejanimo s funkcijo dot modula numpy. Preslikava iz XYZ v Lab barvni prostor je za belo referenco ( Xw, Yw, Zw) definirana kot: Y L = 116 · f − 16 Yw X Y a = 500 · f − f Xw Yw Y Z (3.3) b = 200 · f − f Yw Zw  6 3   t 1 / 3 , ko t > f ( t) = 29 1 29 2  t + 4 , drugod .  3 6 29 Lab barvni prostor je zaradi linearne metrike med različnimi barvami še posebej primeren za kvantitativno primerjavo barv in barvnih odtenkov. (a) Pretvorite sliko kalibra ColorChecker iz RGB v XYZ barvni prostor in prikažite komponento Y ter normalizirani komponenti x, y kot sivinske slike. Katera izmed komponent barvnega prostora xyY predstavlja svetlost? (b) Pretvorite dobljeno sliko iz XYZ še v Lab barvni prostor in prikažite L, a in b komponente kot sivinske slike. Pri pretvorbi naj bela referenca ( Xw, Yw, Zw) ustreza preslikanim normaliziranim RGB koordinatam (1 . 0 , 1 . 0 , 1 . 0). Katera komponenta Lab barvnega prostora predstavlja svetlost? 8. Pri izgubnem zgoščevanju slik (ang. compression) nas pogosto zanima, kakšna je stopnja degradacije kakovosti zgoščene slike. Slednjo lahko številsko ovrednotimo z metriko strukturne podobnosti (ang. Structural Similarity Index - SSIM), ki oceni kakovost testne (zgoščene) slike Y glede na referenčno sliko X. (2 SSIM = µxµy + c 1)(2 σxy + c 2) (3.4) ( µ 2 + + + + x µ 2 y c 1)( σ 2 x σ 2 y c 2) 37 Parametri in kakovost slik 3.1 Naloge in vprašanja Pomen posameznih členov v enačbi je sledeč: • µx predstavlja povprečno vrednost sivin referenčne slike, • µy predstavlja povprečno vrednost sivin testne slike, • σ 2 predstavlja varianco sivin referenčne slike, x • σ 2 predstavlja varianco sivin testne slike, y • σxy predstavlja kovarianco sivin referenčne in testne slike, • c 1 = ( k 1 L)2 in c 2 = ( k 2 L)2 sta regularizacijska člena, • L dinamično območje sivinskih vrednosti (običajno [0 , 2št. bitov − 1]), • k 1 = 0 , 01 in k 2 = 0 . 03. Vrednost SSIM lahko izračunamo za vsak slikovni element testne slike in s tem pridobimo informacijo o kakovosti posameznih področij slike. Pri tem običajno uporabimo okolico velikosti 11×11 slikovnih elementov, sivinske vrednosti v izbrani okolici pa pred izračunom SSIM utežimo z Gaussovo funkcijo (enačba 3.1). (a) Ustvarite funkcijo ssim, ki izračuna vrednosti SSIM za okolice vseh slikovnih elementov vhodnih slik imgx in imgy. Parameter l predstavlja dinamično območje sivinskih vrednosti vhodnih slik, n velikost okolice, sigma parameter σ Gaussove funkcije, parametra k1 ter k2 pa konstanti k 1 ter k 2 metrike SSIM. 1 def s s i m ( imgx , imgy , l =255 , n =11 , s i g m a =1 .5 , 2 k1 =0 .01 , k2 =0 .03 ) : 3 ... 4 r e t u r n o s s i m (b) Raziščite, kako se vrednost metrike SSIM spreminja v odvisnosti od kakovosti iz-gubnega zgoščevanja JPEG za sliko mrBrainSlice.png iz poglavja 1. Zgoščevanje slik lahko enostavno izvedete z metodo save modula PIL.Image. Kakovost zgoščevanja določite s parametrom quality, in sicer tako, da spreminjajte njegovo vrednost od 1 (najnižja kakovost) do 100 (najvišja kakovost). 38 Parametri in kakovost slik 3.2 Rešitve in odgovori na vprašanja 3.2 Rešitve in odgovori na vprašanja Pri odgovorih privzamemo, da se funkcije iz rešitev nahajajo v modulu funkcije, slikovno gradivo pa se nahaja v podmapi poglavje_3. Funkcija za pretvorbo sRGB barvne slike v sivinsko Slika 3.5: Sliki kalibra ColorChecker in ISO-12233. sliko, ki je del modula funkcije. 1 def s r g b 2 g s ( img ) : 2 r e t u r n 0 . 2 9 9 * img [: ,: ,0] + 0 . 5 8 7 * img [: ,: ,1] + 0 . 1 4 4 * img [: ,: ,2] Najprej ustvarimo nekaj spremenljivk in pomožnih funkcij za določanje področij in pretvorbo med barvnimi prostori. 1 # Uvozimo potrebne module. 2 i m p o r t n u m p y as np 3 f r o m m a t p l o t l i b i m p o r t p y p l o t as pp 4 f r o m PIL i m p o r t I m a g e as im 5 i m p o r t f u n k c i j e 6 7 # Naložimo sliki kalibrov ColoCheker in ISO-12233. 8 CC = n p . a s a r r a y ( i m . o p e n ( ’ . / p o g l a v j e _ 3 / C o l o r C h e c k e r . j p g ’ ) ) 9 ISO = n p . a s a r r a y ( i m . o p e n ( ’ . / p o g l a v j e _ 3 / ISO - 1 2 2 3 3 . j p g ’ ) ) 10 11 # Pretvorimo sliki v sivinski. 12 CCg , I S O g = f u n k c i j e . s r g b 2 g s ( CC ) , f u n k c i j e . s r g b 2 g s ( ISO ) 13 14 # Število področij v sliki kalibra ColorChecker. 15 Nx , Ny = 6 , 4 16 N = Nx * Ny 17 dd = 0 .5 # delež izrezanega področja 18 19 # Velikost slike kalibra ColorChecker. 20 H , W = C C . s h a p e [0] , C C . s h a p e [1] 21 22 # Preslikava iz sRGB v XYZ pri beli referenci D65. 23 R G B 2 X Y Z = n p . a r r a y ( [ [ 0 . 4 1 2 4 5 6 4 , 0 . 3 5 7 5 7 6 1 , 0 . 1 8 0 4 3 7 5 ] , 24 [0 . 2 1 2 6 7 2 9 , 0 . 7 1 5 1 5 2 2 , 0 . 0 7 2 1 7 5 0 ] , 25 [0 . 0 1 9 3 3 3 9 , 0 . 1 1 9 1 9 2 0 , 0 . 9 5 0 3 0 4 1 ]]) 26 27 # Funkcija za določanje področij na sliki. 39 Parametri in kakovost slik 3.2 Rešitve in odgovori na vprašanja 28 def e x t r a c t S u b I m a g e s ( img , r e c t = N o n e ) : 29 if r e c t is N o n e : 30 p p . i m s h o w ( img ) 31 p p . t i t l e ( ’ O z n a č i s r e d i š č e l e v e g a z g o r n j e g a , ’ \ 32 ’ n a t o d e s n e g a s p o d n j e g a p o d r o č ja. ’ ) 33 t1 , t2 = p p . g i n p u t (2) 34 e l s e : 35 t1 , t2 = r e c t 36 37 h = ( t2 [1] - t1 [ 1 ] ) / f l o a t ( Ny - 1) # višina področja 38 w = ( t2 [0] - t1 [ 0 ] ) / f l o a t ( Nx - 1) # širina področja 39 40 x0 = t1 [0] # x koordinata središča področja 1 41 y0 = t1 [1] # y koordinata središča področja 1 42 43 h2 = r o u n d ( dd * h /2) 44 w2 = r o u n d ( dd * w /2) 45 p o d s l i k e = [] 46 for j in r a n g e ( Ny ) : # naslov področja v navpični (y) smeri 47 for i in r a n g e ( Nx ) : # naslov področja v vodoravni (x) smeri 48 x c e n t e r = r o u n d ( x0 + w * i ) # odmik središča v vodoravne smeri 49 y c e n t e r = r o u n d ( y0 + h * j ) # odmik središča v navpični smeri 50 p o d s l i k e . a p p e n d ( # sliko področja pripnemo na koncu seznama 51 img [ y c e n t e r - h2 : y c e n t e r + h2 , 52 x c e n t e r - w2 : x c e n t e r + w2 ]) 53 54 if r e c t is N o n e : 55 p p . s u b p l o t ( Ny , Nx , i + j * Nx + 1) 56 p p . i m s h o w ( p o d s l i k e [ -1]) 57 p p . a x i s ( ’ off ’ ) 58 59 if r e c t is N o n e : 60 p p . s u p t i t l e ( ’ I z b r a n a p o d r o č ja. ’ ) 61 62 r e t u r n p o d s l i k e , r e c t 63 64 # Pomožna funkcija za pretvorbo iz XYZ v Lab barvni prostor. 65 def f u n X Y Z 2 L a b ( t ) : 66 out = n p . z e r o s _ l i k e ( t ) 67 ind = t > (6 .0 /29 .0 ) **3 68 out [ ind ] = t [ ind ] * * ( 1 .0 /3 .0 ) 69 n i n d = n p . l o g i c a l _ n o t ( ind ) 70 out [ n i n d ] = (1 .0 /3 .0 * ( 2 9 .0 /6 .0 ) * * 2 ) * t [ n i n d ] + 4 .0 /29 .0 71 72 r e t u r n out 73 74 # Funkcija za pretvorbo iz XYZ v Lab barvni prostor. 75 def X y z 2 L a b ( X , Y , Z , Xw , Yw , Zw ) : 76 tx = X / Xw 40 Parametri in kakovost slik 3.2 Rešitve in odgovori na vprašanja 77 ty = Y / Yw 78 tz = Z / Zw 79 80 L = 116 .0 * f u n X Y Z 2 L a b ( tx ) - 16 .0 81 a = 5 0 0 * ( f u n X Y Z 2 L a b ( tx ) - f u n X Y Z 2 L a b ( ty ) ) 82 b = 2 0 0 * ( f u n X Y Z 2 L a b ( ty ) - f u n X Y Z 2 L a b ( tz ) ) 83 84 r e t u r n L , a , b Sedaj lahko začnemo z obravnavo zastavljenih vprašanj. 1. Določimo področja na sliki kalibra ColorChecker. 1 p p . f i g u r e () 2 sCC , r e c t C C = e x t r a c t S u b I m a g e s ( CC ) 2. Največjo povprečno sivinsko vrednost ima področje 19, najmanjšo pa področje 24. Sledi izračun statistike sivinskih vrednosti področij. 1 s C C g = [] 2 s C C m e a n = n p . z e r o s ( N ) 3 s C C s t d = n p . z e r o s ( N ) 4 for i in r a n g e ( len ( sCC ) ) : 5 cc = sCC [ i ] 6 s C C g . a p p e n d ( f u n k c i j e . s r g b 2 g s ( cc ) ) 7 s C C m e a n [ i ] = s C C g [ -1] . m e a n () 8 s C C s t d [ i ] = s C C g [ -1] . s t d () 3. Za lažje vrednotenje izrišemo izvirni in normalizirani sivinski prerez slike kalibra ISO-12233 (normaliziramo na interval od −0 , 5 do 0 , 5). Slednjega opremimo še z mejami kontrasta. Šum lahko izdatno zmanjšamo tako, da povprečimo več vrstic slike. 1 p p . f i g u r e () 2 3 p p . s u b p l o t (3 , 1 , 1) 4 p p . i m s h o w ( ISO , c m a p = ’ g r a y ’ ) 5 p p . t i t l e ( ’ O z n a č i k r a j i š č a p r e r e z a - ’ 6 ’ l e v o z g o r a j n a t o d e s n o s p o d a j ’ ) 7 if t 1 i s o is N o n e or t 2 i s o is N o n e : 8 t1iso , t 2 i s o = p p . g i n p u t ( n =2 , t i m e o u t = 1 2 0 ) 9 t 1 i s o = [ int ( t 1 i s o [ 0 ] ) , int ( t 1 i s o [ 1 ] ) ] 10 t 2 i s o = [ int ( t 2 i s o [ 0 ] ) , int ( t 2 i s o [ 1 ] ) ] 11 p p . p l o t ([ t 1 i s o [0] , t 2 i s o [0]] , [ t 1 i s o [1] , t 2 i s o [1]] , ’ - r ’ ) 12 13 p p . s u b p l o t (3 , 1 , 2) 14 m t f p r e r e z = I S O g [ t 1 i s o [ 1 ] : max ( t 1 i s o [1] + 1 , t 2 i s o [ 1 ] ) , 15 t 1 i s o [ 0 ] : t 2 i s o [ 0 ] ] . m e a n (0) 16 i s o l p = n p . l i n s p a c e (1 , 10 , m t f p r e r e z . s i z e ) 17 p p . p l o t ( isolp , m t f p r e r e z ) 18 p p . t i t l e ( ’ I z v i r n i p r e r e z ’ ) 41 Parametri in kakovost slik 3.2 Rešitve in odgovori na vprašanja 200 100 2 4 6 8 10 Oznake na ISO 12233 kalibru (a) Izvirni prerez 0.5 0.0 −0.5 2 4 6 8 10 Oznake na ISO 12233 kalibru (b) Normalizirani prerez Slika 3.6: Izvirni in normalizirani sivinski prerez slike kalibra ISO-12233. Vodoravni črti zelene barve označujeta mejo kontrasta, ki znaša 10 % začetne vrednosti. 19 20 p p . s u b p l o t (3 , 1 , 3) 21 p p . t i t l e ( ’ N o r m a l i z i r a n i p r e r e z ’ ) 22 l , h = m t f p r e r e z . m i n () , m t f p r e r e z . m a x () 23 p p . p l o t ( isolp , ( m t f p r e r e z - l ) /( h - l ) - 0 .5 , ’ - r ’ ) 24 p p . p l o t ([1 , 10] , [0 .05 , 0 .05 ] , ’ - g ’ ) 25 p p . p l o t ([1 , 10] , [ -0 .05 , -0 .05 ] , ’ - g ’ ) 26 27 p p . s h o w () Z metodo ostrega očesa ocenimo, da kontrast pade na 10 % začetne vrednosti pri približno 750 progah na višino (200 mm) kalibra ISO-12233. Iz tega izračunamo širino proge, ki znaša približno 0 , 266 mm. Ločljivost slikovnega sistema torej znaša približno 0 , 266 mm. 4. Izrišemo potek povprečne sivinske vrednosti za izbrana področja (slika 3.7) in določimo dinamično območje sivinskih vrednosti. 1 p p . f i g u r e () 42 Parametri in kakovost slik 3.2 Rešitve in odgovori na vprašanja 200 150 100 50 20 22 24 Slika 3.7: Povprečna sivinska vrednost področij od 19 do 24. 2 p p . p l o t ( n p . a r a n g e (19 , 25) , s C C m e a n [ 1 8 : 2 4 ] , ’ - or ’ ) 3 p p . x l a b e l ( ’ P o d r o č je s l i k e C o l o r C h e c k e r ’ ) 4 p p . y l a b e l ( ’ P o v p r e č na s i v i n a ’ ) 5 p p . s h o w () 6 p r i n t ( ’ D i n a m i č no o b m o č je zna š a {: .1f } b i t o v . ’ . f o r m a t ( 7 n p . l o g 2 ( s C C m e a n [ 1 8 ] - s C C m e a n [ 2 3 ] ) ) ) 8 p p . s h o w () Dinamično območje znaša 7 , 4 bitov. 5. V modulu funkcije ustvarimo funkcijo imHistogram. 1 def i m H i s t o g r a m ( img , b i n s =256 , s p a n = None , 2 d e n s i t y = False , t i t l e = N o n e ) : 3 img = n p . a s a r r a y ( img ) 4 if s p a n is N o n e : 5 s p a n = ( i m g . m i n () , i m g . m a x () ) 6 s p a n = n p . a s a r r a y ( span , n p . f l o a t ) 7 e d g e s = n p . l i n s p a c e ( s p a n [0] , s p a n [1] , b i n s ) 8 h i s t = n p . z e r o s ([ b i n s ]) 9 for i in r a n g e ( b i n s - 1) : 10 h i s t [ i ] = n p . c o u n t _ n o n z e r o ( n p . l o g i c a l _ a n d ( 11 img >= e d g e s [ i ] , img < e d g e s [ i + 1]) ) 12 h i s t [ -1] = n p . c o u n t _ n o n z e r o ( img >= e d g e s [ -1]) 13 14 if d e n s i t y : 15 h i s t /= h i s t . s u m () 16 17 if t i t l e is not N o n e : 18 p p . b a r ( e d g e s [: -1] , h i s t ) 19 p p . t i t l e ( t i t l e ) 20 21 r e t u r n hist , e d g e s Preverimo, ali porazdelitev šuma ustreza normalni (slika 3.8). 43 Parametri in kakovost slik 3.2 Rešitve in odgovori na vprašanja 0.15 0.10 0.10 0.05 0.05 0.00 0.00 200 210 220 30 40 50 60 (a) Področje 19 (b) Področje 24 Slika 3.8: Primerjava porazdelitve sivinskih vrednosti z normalno porazdelitvijo. 1 p p . f i g u r e () 2 3 hA , eA = f u n k c i j e . i m H i s t o g r a m ( 4 s C C g [18] , s p a n =[0 ,255] , d e n s i t y = T r u e ) 5 hB , eB = f u n k c i j e . i m H i s t o g r a m ( 6 s C C g [23] , s p a n =[0 ,255] , d e n s i t y = T r u e ) 7 8 p p . s u b p l o t (1 , 2 , 1) 9 p p . b a r ( eA , hA , w i d t h = eA [1] - eA [ 0 ] ) 10 p p . p l o t ( eA , 1 .0 /( s C C s t d [ 1 8 ] * n p . s q r t (2 .0 * n p . p i ) ) * \ 11 n p . e x p ( -( eA - s C C m e a n [ 1 8 ] ) * * 2 / 2 .0 / s C C s t d [ 1 8 ] * * 2 ) , ’ - r ’ ) 12 p p . t i t l e ( ’ P o d r o č je 19 ’ ) 13 14 p p . s u b p l o t (1 , 2 , 2) 15 p p . b a r ( eB , hB , w i d t h = eB [1] - eB [ 0 ] ) 16 p p . p l o t ( eB , 1 .0 /( s C C s t d [ 2 3 ] * n p . s q r t (2 .0 * n p . p i ) ) * \ 17 n p . e x p ( -( eB - s C C m e a n [ 2 3 ] ) * * 2 / 2 .0 / s C C s t d [ 2 3 ] * * 2 ) , ’ - r ’ ) 18 p p . t i t l e ( ’ P o d r o č je 24 ’ ) 19 20 p p . s h o w () 6. Določimo diferencialni razmerji signal-šum za izbrana področja. 1 S N R d a = ( s C C m e a n [ 1 8 ] - s C C m e a n [ 2 3 ] ) / \ 2 ( s C C s t d [ 1 8 ] * * 2 + s C C s t d [ 2 3 ] * * 2 ) **0 .5 3 4 S N R d b = ( s C C m e a n [ 2 2 ] - s C C m e a n [ 2 3 ] ) / \ 5 ( s C C s t d [ 2 2 ] * * 2 + s C C s t d [ 2 3 ] * * 2 ) **0 .5 6 7 p r i n t ( ’ S N R d za p o d r o č ji 19 -24: {: .1f } ’ . f o r m a t ( S N R d a ) ) 8 p r i n t ( ’ S N R d za p o d r o č ji 23 -24: {: .1f } ’ . f o r m a t ( S N R d b ) ) 44 Parametri in kakovost slik 3.2 Rešitve in odgovori na vprašanja Diferencialno razmerje signal-šum za področji 19 in 24 znaša 42 , 5, za področji 23 in 24 pa 5 , 3. 7. (a) Izvedemo preslikavo iz RGB v XYZ barvnimi prostor (slika 3.10). 1 R , G , B = CC [: ,: ,0] , CC [: ,: ,1] , CC [: ,: ,2] 2 rgb = n p . v s t a c k (( R . f l a t t e n () , 3 G . f l a t t e n () , 4 B . f l a t t e n () ) ) 5 6 xyz = n p . d o t ( RGB2XYZ , rgb / 2 5 5 .0 ) 7 Xw , Yw , Zw = n p . d o t ( RGB2XYZ , n p . o n e s ([3 , 1]) ) 8 X = xyz [0] . r e s h a p e ( H , W ) 9 Y = xyz [1] . r e s h a p e ( H , W ) 10 Z = xyz [2] . r e s h a p e ( H , W ) 11 x , y , z = X /( X + Y + Z ) , Y /( X + Y + Z ) , Z /( X + Y + Z ) 12 XYZ = n p . d s t a c k (( X , Y , Z ) ) 13 14 # (a) Pretvorba iz RGB v XYZ. 15 p p . f i g u r e () 16 17 p p . s u b p l o t (1 , 3 , 1) 18 p p . i m s h o w ( Y , c m a p = ’ g r a y ’ ) 19 p p . t i t l e ( ’ Y ’ ) 20 p p . a x i s ( ’ off ’ ) 21 22 p p . s u b p l o t (1 , 3 , 2) 23 p p . i m s h o w ( x , c m a p = ’ g r a y ’ ) 24 p p . t i t l e ( ’ x ’ ) 25 p p . a x i s ( ’ off ’ ) 26 27 p p . s u b p l o t (1 , 3 , 3) 28 p p . i m s h o w ( y , c m a p = ’ g r a y ’ ) 29 p p . t i t l e ( ’ y ’ ) 30 p p . a x i s ( ’ off ’ ) 31 32 p p . s h o w () (b) Izvedemo preslikavo iz XYZ v Lab barvnimi prostor (slika 3.10). 1 L , a , b = X y z 2 L a b ( X , Y , Z , Xw , Yw , Zw ) 2 Lab = n p . d s t a c k (( L , a , b ) ) 3 4 p p . f i g u r e () 5 6 p p . s u b p l o t (1 , 3 , 1) 7 p p . i m s h o w ( L , c m a p = ’ g r a y ’ ) 8 p p . t i t l e ( ’ L ’ ) 9 p p . a x i s ( ’ off ’ ) 10 45 Parametri in kakovost slik 3.2 Rešitve in odgovori na vprašanja 11 p p . s u b p l o t (1 , 3 , 2) 12 p p . i m s h o w ( a , c m a p = ’ g r a y ’ ) 13 p p . t i t l e ( ’ a ’ ) 14 p p . a x i s ( ’ off ’ ) 15 16 p p . s u b p l o t (1 , 3 , 3) 17 p p . i m s h o w ( b , c m a p = ’ g r a y ’ ) 18 p p . t i t l e ( ’ b ’ ) 19 p p . a x i s ( ’ off ’ ) 20 21 p p . s h o w () (a) Komponenta R (b) Komponenta G (c) Komponenta B (d) Komponenta Y (e) Komponenta x (f) Komponenta y (g) Komponenta L (h) Komponenta a (i) Komponenta b Slika 3.9: Komponente barvnih prostorov RGB, xyY in Lab. 8. (a) V modulu funkcije ustvarimo funkcijo ssim. 1 def s s i m ( imgx , imgy , l =255 , n =11 , s i g m a =1 .5 , 2 k1 =0 .01 , k2 =0 .03 ) : 3 i m g x = n p . a s a r r a y ( imgx , d t y p e = n p . f l o a t ) 4 i m g y = n p . a s a r r a y ( imgy , d t y p e = n p . f l o a t ) 46 Parametri in kakovost slik 3.2 Rešitve in odgovori na vprašanja 5 6 n _ h a l f = int ( n / / 2 ) 7 n = n _ h a l f *2 + 1 8 if i m g x . s h a p e != i m g y . s h a p e : 9 r a i s e V a l u e E r r o r ( ’ V e l i k o s t v h o d n i h s l i k " i m g x " in " i m g y " ’ 10 ’ m o r a t a b i t i e n a k i ! ’ ) 11 12 x = y = n p . a r a n g e ( - n_half , n _ h a l f + 1 , d t y p e = n p . f l o a t ) 13 Y , X = n p . m e s h g r i d ( y , x , i n d e x i n g = ’ ij ’ ) 14 W = 1 .0 /(2 .0 * n p . p i * s i g m a * * 2 ) * \ 15 n p . e x p ( -( X **2 + Y * * 2 ) /(2 .0 * s i g m a * * 2 ) ) 16 W *= 1 .0 / W . s u m () 17 18 i m g x p = i m P a d 2 d ( imgx , n_half , b o u n d a r y = ’ r e f l e c t ’ ) 19 i m g y p = i m P a d 2 d ( imgy , n_half , b o u n d a r y = ’ r e f l e c t ’ ) 20 21 c1 = ( k1 * l ) **2 22 c2 = ( k2 * l ) **2 23 24 H , W = i m g x . s h a p e 25 o s s i m = n p . z e r o s ( i m g x . s h a p e ) 26 for i in r a n g e ( W ) : 27 for j in r a n g e ( H ) : 28 xr = W * i m g x p [ j : j + n , i : i + n ] 29 yr = W * i m g y p [ j : j + n , i : i + n ] 30 31 mxr = x r . m e a n () 32 myr = y r . m e a n () 33 sxr = x r . s t d () 34 syr = y r . s t d () 35 s x y r = ( xr * yr ) . m e a n () - mxr * myr 36 37 o s s i m [ j , i ] = (2 .0 * mxr * myr + c1 ) *(2 .0 * s x y r + c2 ) / \ 38 (( mxr **2 + myr **2 + c1 ) *( sxr **2 + syr **2 + c2 ) ) 39 40 r e t u r n o s s i m (b) Izračunamo SSIM slike pri izgubnem JPEG zgoščevanju za vrednosti parametra kakovosti 25, 50, 75 in 100 (izvirna slika). Vrednost SSIM se nahaja na intervalu [0 , 1]. Vrednost 1 dobimo zgolj, ko se sliki ali izbrani okolici slikovnega elementa slik pov-sem ujemata (brezizgubno zgoščevanje, ko je vrednost parametra kakovosti 100). V splošnem vrednost SSIM sledi kakovosti zgoščevanja. 1 i m g a = i m . o p e n ( ’ . / p o g l a v j e _ 1 / m r B r a i n S l i c e . p n g ’ ) 2 3 q u a l i t y = [25 , 50 , 75 , 1 0 0 ] 4 5 p p . f i g u r e () 47 Parametri in kakovost slik 3.2 Rešitve in odgovori na vprašanja 6 7 j p e g s = [] 8 s s i m s = [] 9 t m p f i l e = ’ . / p o g l a v j e _ 3 / r e z u l t a t i / t m p . j p e g ’ 10 for index , q in e n u m e r a t e ( q u a l i t y ) : 11 i m g a . s a v e ( tmpfile , q u a l i t y = q ) 12 j p e g s . a p p e n d ( n p . a r r a y ( i m . o p e n ( t m p f i l e ) ) ) 13 14 p p . s u b p l o t (1 , len ( q u a l i t y ) + 1 , 1 + i n d e x ) 15 s s i m s . a p p e n d ( f u n k c i j e . s s i m ( imga , j p e g s [ -1]) ) 16 p p . i m s h o w ( s s i m s [ -1] , c m a p = ’ g r a y ’ , v m i n =0 , v m a x =1) 17 p p . t i t l e ( ’ S S I M pri k a k o v o s t i {: d } % ’ . f o r m a t ( q ) ) 18 19 p p . s u b p l o t (1 , len ( q u a l i t y ) + 1 , len ( q u a l i t y ) + 1) 20 p p . c o l o r b a r () 21 p p . a x i s ( ’ off ’ ) 22 p p . s h o w () 0,0 0,2 0,4 0,6 0,8 1,0 (a) Kakovost 100 (b) Kakovost 75 (c) Kakovost 50 (d) Kakovost 25 Slika 3.10: Izgubno JPEG zgoščevanje slike mrBrainSlice.png za vrednosti parametra kakovosti 100 (izvirna slika), 75, 50 in 25 (prva vrstica) ter pripadajoče vrednosti metrike SSIM med izvirno in zgoščeno sliko (druga vrstica). 48 Poglavje 4 Filtriranje slik Poglavje je namenjena spoznavanju in razumevanju osnovnih postopkov filtriranja slik. Postopke linearnega filtriranja 2D slik je mogoče predstaviti s konvolucijo slike I velikosti ( H, W ) z izbranim konvolucijskim jedrom K velikosti ( A, B): A−1 B−1 X X S[ i, j] = I ∗ K = I[ i − ( k − c 1 , j − ( l − c 2)] · K[ k, l] . (4.1) k=0 l=0 Slika 4.1: Slike, ki jih boste uporabljali tekom te vaje. Od leve proti desni: slika ct_175x175_uint8.raw, slika ct_sp_175x175_uint8.raw ter slika mr_217x181x181_uint8 v xy ravnini pri z = 90. 4.1 Naloge in vprašanja 1. Konstanti c 1 in c 2, ki določata središče konvolucijskega jedra, naj bosta definirani kot b A c ter b B c. Z opisano konvolucijo smo se že srečali v poglavju 2, kjer smo postopek 2D 2 2 konvolucije udejanili v obliki funkcije conv2d. S pomočjo funkcije conv2d izvedite glajenje slik z navadnim povprečenjem, z uteženim povprečenjem ter z Gaussovim jedrom. Primerjajte in komentirajte rezultate glajenja slike ct_175x175_uint8.raw s podanimi jedri. 49 Filtriranje slik 4.1 Naloge in vprašanja       1 1 1 1 1 1 2 1 0 , 01 0 , 08 0 , 01 · 1 1 1 · 2 4 2 0  9 , 08 0 , 64 0 , 08       1 1 1 16 1 2 1 0 , 01 0 , 08 0 , 01 (a) Navadno povprečje (b) Uteženo povprečenje (c) Gaussovo sito Slika 4.2: Primeri konvolucijskih jeder velikosti 3 × 3 slikovne elemente. 2. Ustvarite funkcijo gaussianKernel2d za izračun konvolucijskega jedra v obliki 2D simetrične Gaussove funkcije, kjer je sigma standardna deviacija σ 2D simetrične Gaussove funkcije, ki je definirana kot: 1 K( u, v) = exp−( u 2+ v 2) 2 2 σ 2 . (4.2) πσ 2 1 def g a u s s i a n K e r n e l 2 d ( sigma , t r u n c a t e =4) : 2 ... 3 r e t u r n k e r n e l Velikost konvolucijskega jedra K( u, v) naj bo določena z vrednostmi parametrov sigma in truncate kot 2·d truncate· σ e+1, vrednost K(0 , 0) pa naj se nahaja v središčnem elementu izhodnega 2D polja kernel. Zagotovite, da bo vsota vseh elementov konvolucijskega jedra kernel enaka 1. (a) Preizkusite delovanje funkcije za poljubne nenegativne vrednosti sigma in prikažite konvolucijsko jedro kot sliko. Obrazložite vpliv vrednosti sigma na obliko konvolucijskega jedra kernel. (b) Kaj se tekom glajenja zgodi z zunanjim robom slike in kako širok je ta rob? Kako bi se lahko izognili ali ublažili opažene spremembe? (c) Dopolnite funkcijo conv2d tako, da bo tretji parameter boundary, določal način obrav-nave sivinskih vrednosti izven definicijskega območja slike, četrti parameter fillvalue pa določal sivinsko vrednost izven definicijskega območja slike, ko je vrednost parametra boundary enaka ’constant’. Sledeči primer ilustrira učinke različnih vrednosti parametra boundary: boundary Razširitev Definicijsko območje Razširitev ’mirror’ 4 3 2 1 2 3 4 5 6 7 8 7 6 5 ’reflect’ 3 2 1 1 2 3 4 5 6 7 8 8 7 6 ’nearest’ 1 1 1 1 2 3 4 5 6 7 8 8 8 8 ’constant’ 0 0 0 1 2 3 4 5 6 7 8 0 0 0 ’wrap’ 6 7 8 1 2 3 4 5 6 7 8 1 2 3 V ta namen ustvarite funkcijo imPad2d, ki na zahtevani način razširi definicijsko ob-močje slike v navpični smeri za n[0] in v vodoravni smeri za n[1] slikovnih elementov. V pomoč vam bo funkcija pad modula numpy. 50 Filtriranje slik 4.1 Naloge in vprašanja 1 def i m P a d 2 d ( img , n , b o u n d a r y = ’ c o n s t a n t ’ , f i l l v a l u e =0) : 2 ... 3 r e t u r n o i m g 1 def c o n v 2 d ( img , kernel , b o u n d a r y = ’ r e f l e c t ’ , f i l l v a l u e =0) : 2 ... 3 r e t u r n o i m g (d) Kako širok mora biti razširjeni rob slike, da pri filtriranju ublažimo neželene učinke, ki ste jih opazili pod točko (b)? 3. 2D konvolucijo slike z Gassovim jedrom je mogoče razbiti na dve zaporedni 1D konvoluciji, ki potekata vzdolž vrstic in stolpcev slike. Ustvarite funkcijo conv1d, ki bo izračunala 1D konvolucijo signala I s konvolucijskim jedrom K dolžine a. Parametra boundary in fillvalue naj imata enak pomen kot pri funkciji conv2d: a−1 X S( i) = I( i − ( k − c)) · K( k) . (4.3) k=0 1 def c o n v 1 d ( data , kernel , b o u n d a r y = ’ c o n s t a n t ’ , f i l l v a l u e =0) : 2 ... 3 r e t u r n o d a t a Predpostavite, da je središče c konvolucijskega jedra K pri b a c. 2 4. Ustvarite še funkcijo gaussianKernel1d za izračun konvolucijskega jedra v obliki 1D Gaussove funkcije, kjer je sigma standardna deviacija σ Gaussove funkcije, ki je definirana kot: 1 K( u) = √ exp− u 2 2 σ 2 . (4.4) σ 2 π Velikost konvolucijskega jedra K( u) naj bo določena z vrednostmi parametrov sigma in truncate kot 2 · d truncateσ e + 1, vrednost K(0) pa naj se nahaja v središčnem elementu izhodnega 2D polja kernel. Zagotovite, da bo vsota vseh elementov konvolucijskega jedra kernel enaka 1. 1 def g a u s s i a n K e r n e l 1 d ( sigma , t r u n c a t e =4) : 2 ... 3 r e t u r n k e r n e l Kaj je glavna prednost filtriranja slik s postopkom 1D konvolucije? 5. Ustvarite funkcijo imGaussFilt2d, ki bo filtrirala vhodno sliko img z Gaussovim jedrom standardne deviacije sigma. Jedro filtra izračunajte s funkcijo gaussianKernel1d, konvolucijo pa izvedite z uporabo funkcije conv1D. Primerjajte rezultate filtriranja slike s funkcijama conv1d ter conv2d. Parametra boundary in fillvalue naj imata enak pomen kot pri funkciji conv2d. 51 Filtriranje slik 4.1 Naloge in vprašanja 1 def i m G a u s s F i l t 2 d ( img , sigma , b o u n d a r y = ’ c o n s t a n t ’ , f i l l v a l u e =0) : 2 ... 3 r e t u r n o i m g 6. Ostrenje slike je analogno prostorskemu odvajanju sivinskih vrednosti. Odvajanje lahko izvedemo s pomočjo Laplaceovega operatorja (drugi odvod): 0 1 0 1 −4 1 .   0 1 0 Ostrenje slik pa izvedemo tako, da od vhodne slike I( x, y) odštejemo uteženo sliko drugega odvoda ∇2 I( x, y), ki ga izračunamo z Laplaceovim operatorjem: S( x, y) = I( x, y) − c · ∇2 I( x, y) , (4.5) kjer konstanta c določa stopnjo ostrenja. Pogosto se uporablja tudi maskiranje neostrih področij, pri čemer od vhodne slike I( x, y) najprej odštejemo njeno zglajeno različico I( x, y) ∗ K ter tako dobimo sliko maske M ( x, y), ki jo prištejemo vhodni sliki skladno s stopnjo ostrenja c: M ( x, y) = I( x, y) − I( x, y) ∗ K, (4.6) S( x, y) = I( x, y) + c · M ( x, y) . Ustvarite funkcijo imSharpen2D, ki bo glede na vrednost parametra kind sliko izostrila z Laplaceovim operatorjem (’laplace’) ali z maskiranjem (’mask’). Pri ostrenju z maskiranjem uporabite glajenje z Gaussovim jedrom standardne deviacije sigma. Za glajenje uporabite funkcijo imGaussFilt2d, za izračun Laplaceovega operatorja pa uporabite funkcijo conv2d. Definicijsko območje slike pred izvajanjem filtriranja ustrezno razširite s funkcijo imPad2d. 1 def i m S h a r p e n 2 D ( img , k i n d = ’ m a s k ’ , c =1 .0 , s i g m a =1 .0 ) : 2 ... 3 r e t u r n o i m g (a) Izostrite sivinsko sliko ct_175x175_uint8.raw s postopkom na podlagi Laplaceovega operatorja in z maskiranjem neostrih področij. Za stopnjo ostrenja izberite vrednost c = 1 ter uporabite glajenje z Gaussovim filtrom σ = 1. (b) Preizkusite različne vrednosti c in obrazložite njihov vpliv na izostreno sivinsko sliko. 7. Statistično filtriranje na podlagi mediane se uporablja pri nesimetričnih porazdelitvah sivinskih vrednosti, še posebej kadar imamo opravka z bipolarnim šumom tipa sol in poper. Mediana urejenega niza n vrednosti je definirana kot: ( median( z z ( n+1) / 2 , n je liho število, 1 , z 2 , z 3 , ..., zn) = (4.7) 1 ( z + z ) , n je sodo število. 2 n/ 2 n/ 2+1 52 Filtriranje slik 4.1 Naloge in vprašanja Na podoben način je mogoče definirati še filter maksimalne in minimalne vrednosti. Ustvarite funkcijo imStatFilt2d, ki bo filtrirala vhodno sivinsko sliko img z nelinearnim filtrom tipa kind (’median’, ’min’ ali ’max’). Predpostavite kvadratno jedro lihe velikosti. Za iskanje največje in najmanjše vrednosti niza števil uporabite funkciji min in max, za iskanje mediane pa funkcijo median modula numpy. Predpostavite, da je vrednost sivin na področjih, kjer slika ni definirana, enaka sivini najbližjega slikovnega elementa. Namig: sliko img pred filtriranjem ustrezno razširite s funkcijo imPad2d tako, da postavite vrednost parametra pad na ’nearest’. 1 def i m S t a t F i l t 2 d ( img , n =3 , k i n d = ’ m e d i a n ’ ) : 2 ... 3 r e t u r n o i m g Primerjajte statistično filtriranje z mediano n=3 ter Gassovim jedrom sigma=0.5 na sliki ct_sp_175x175_uint8.raw ter komentirajte rezultate. 8. Ustvarite konvolucijsko jedro velikosti 3 × 3, ki vrednost slikovnega elementa nadomesti s povprečno vrednostjo 8-ih sosednjih slikovnih elementom. Uporabite konvolucijsko jedro na sliki ct_sp_175x175_uint8.raw. Kakšna je razlika med filtriranjem z opisanim konvolucijskim jedrom in statističnim filtriranjem na podlagi mediane? 9. Filtriranje 3D slik z Gaussovim jedrom je mogoče izvesti s postopkom 3D konvolucije ali z zaporednim filtriranjem po prvi, drugi in tretji razsežnosti slike z 1D Gaussovim jedrom. Ustvarite funkcijo imGaussFilt3d, ki bo filtrirala vhodno 3D sliko img z Gaussovim filtrom standardne deviacije sigma. Jedro filtra ustvarite s funkcijo gaussianKernel1d, filtriranje pa izvedite s funkcijo conv1d. Parametra boundary in fillvalue naj imata enak pomen kot pri funkciji conv2d. 1 def i m G a u s s F i l t 3 d ( img , sigma , b o u n d a r y = ’ c o n s t a n t ’ , f i l l v a l u e =0) : 2 ... 3 r e t u r n o i m g Filtrirajte 3D sliko mr_217x181x181_uint8.raw iz poglavja 2 s konvolucijskim jedrom sigma=0.5 ter prikažite prereza z = 90 ter x = 90 pred in po filtriranju. 10. Računsko učinkovite funkcije za filtriranje večrazsežnih slik najdemo v knjižnici scipy.ndimage. Raziščite in uporabite funkcije convolve, gaussian_filter, median_filter ter laplace. 53 Filtriranje slik 4.1 Naloge in vprašanja 54 Filtriranje slik 4.2 Rešitve in odgovori na vprašanja 4.2 Rešitve in odgovori na vprašanja Pri odgovorih privzamemo, da se funkcije iz rešitev nahajajo v modulu funkcije, slikovno gradivo pa se nahaja v podmapi poglavje_4. Naprej uvozimo potrebne module, naložimo slike in definiramo pomožne spremenljivke. 1 i m p o r t n u m p y as np 2 f r o m m a t p l o t l i b i m p o r t p y p l o t as pp 3 f r o m PIL i m p o r t I m a g e as im 4 i m p o r t f u n k c i j e 5 6 Knp = 1 .0 /9 .0 * n p . a r r a y ([[1 , 1 , 1] , 7 [1 , 1 , 1] , 8 [1 , 1 , 1 ] ] ) 9 Kup = 1 .0 /16 .0 * n p . a r r a y ([[1 , 2 , 1] , 10 [2 , 4 , 2] , 11 [1 , 2 , 1 ] ] ) 12 Kg = n p . a r r a y ( [ [ 0 .01 , 0 .08 , 0 .01 ] , 13 [0 .08 , 0 .64 , 0 .08 ] , 14 [0 .01 , 0 .08 , 0 .01 ]]) 15 I1 = f u n k c i j e . i m L o a d R a w 2 d ( 16 ’ . / p o g l a v j e _ 4 / c t _ 1 7 5 x 1 7 5 _ u i n t 8 . r a w ’ , 175 , 1 7 5 ) 17 I2 = f u n k c i j e . i m L o a d R a w 2 d ( 18 ’ . / p o g l a v j e _ 4 / c t _ s p _ 1 7 5 x 1 7 5 _ u i n t 8 . r a w ’ , 175 , 1 7 5 ) 19 I3 = f u n k c i j e . i m L o a d R a w 3 d ( 20 ’ . / p o g l a v j e _ 4 / m r _ 2 1 7 x 1 8 1 x 1 8 1 _ u i n t 8 . r a w ’ , 217 , 181 , 1 8 1 ) 21 p p . i o f f () 1. Primerjava glajenja s tremi konvolucijskimi jedri (slika 4.3). 1 # Izvedemo glajenje s predlaganimi jedri. 2 I 1 n p = n p . r o u n d ( f u n k c i j e . c o n v 2 d ( I1 , Knp ) ) . a s t y p e ( n p . u i n t 8 ) 3 I 1 u p = n p . r o u n d ( f u n k c i j e . c o n v 2 d ( I1 , Kup ) ) . a s t y p e ( n p . u i n t 8 ) 4 I1g = n p . r o u n d ( f u n k c i j e . c o n v 2 d ( I1 , Kg ) ) . a s t y p e ( n p . u i n t 8 ) 5 6 # Prikažemo izvirno in vse tri zglajene slike. 7 p p . f i g u r e () 8 p p . s u p t i t l e ( ’ P r i m e r j a v a t r e h k o n v o l u c i j s k i h j e d e r s i t . ’ ) 9 10 p p . s u b p l o t (1 , 4 , 1) 11 p p . t i t l e ( ’ I z v i r n a s l i k a ’ ) 12 p p . i m s h o w ( I1 , c m a p = ’ g r a y ’ ) 13 p p . a x i s ( ’ off ’ ) 14 15 p p . s u b p l o t (1 , 4 , 2) 16 p p . i m s h o w ( I1np , c m a p = ’ g r a y ’ ) 17 p p . t i t l e ( ’ N a v a d n o p o v p r e c j e ’ ) 18 p p . a x i s ( ’ off ’ ) 19 55 Filtriranje slik 4.2 Rešitve in odgovori na vprašanja 20 p p . s u b p l o t (1 , 4 , 3) 21 p p . i m s h o w ( I1up , c m a p = ’ g r a y ’ ) 22 p p . t i t l e ( ’ Ute ž eno p o v p r e č je ’ ) 23 p p . a x i s ( ’ off ’ ) 24 25 p p . s u b p l o t (1 , 4 , 4) 26 p p . i m s h o w ( I1g , c m a p = ’ g r a y ’ ) 27 p p . t i t l e ( ’ G a u s s o v o j e d r o ’ ) 28 p p . a x i s ( ’ off ’ ) 29 30 p p . s h o w () (a) Izvirna slika (b) Navadno povprečje (c) Uteženo povprečje (d) Gaussovo jedro Slika 4.3: Glajenje z različnimi konvolucijskimi jedri. 2. V modulu funkcije ustvarimo funkcijo gaussianKernel2d. 1 def g a u s s i a n K e r n e l 2 d ( sigma , t r u n c a t e =4) : 2 n = int (2* n p . c e i l ( t r u n c a t e * s i g m a ) + 1) 3 xy = n p . a r a n g e ( n ) 4 xy -= x y . m e a n () 5 Y , X = n p . m e s h g r i d ( xy , xy , i n d e x i n g = ’ ij ’ ) 6 k e r n e l = 1 .0 /(2 .0 * n p . p i * s i g m a * * 2 ) * \ 7 n p . e x p ( -( X **2 + Y * * 2 ) *(1 .0 /(2 .0 * s i g m a * * 2 ) ) ) 8 k e r n e l /= k e r n e l . s u m () 9 10 r e t u r n k e r n e l (a) Ustvarimo in primerjamo dve Gaussovi konvolucijski jedri (slika 4.4) s sigma=0.5 ter sigma=1. Z večanjem vrednosti parametra sigma se veča velikost jedra in stopnja glajenja. 1 Kg1 = f u n k c i j e . g a u s s i a n K e r n e l 2 d (1) 2 Kg2 = f u n k c i j e . g a u s s i a n K e r n e l 2 d (2) 3 I 1 K g 1 = f u n k c i j e . c o n v 2 d ( I1 , Kg1 ) 4 I 1 K g 2 = f u n k c i j e . c o n v 2 d ( I1 , Kg2 ) 5 6 # izriše 3D površino jedra v izbrano podokno 7 def s u r f ( 8 gk , subplot , 56 Filtriranje slik 4.2 Rešitve in odgovori na vprašanja 9 c o l o r = ’ r ’ , r s t r i d e =1 , c s t r i d e =1 , s h a d e = T r u e ) : 10 f r o m m p l _ t o o l k i t s . m p l o t 3 d i m p o r t A x e s 3 D 11 ax = p p . g c f () . a d d _ s u b p l o t ( subplot , p r o j e c t i o n = ’ 3 d ’ ) 12 x , y = n p . a r a n g e ( g k . s h a p e [ 0 ] ) , n p . a r a n g e ( g k . s h a p e [ 1 ] ) 13 x = x - x . m e a n () 14 y = y - x . m e a n () 15 Yk , Xk = n p . m e s h g r i d ( y , x , i n d e x i n g = ’ ij ’ ) 16 a x . p l o t _ s u r f a c e ( 17 Xk , Yk , gk , 18 c o l o r = color , 19 r s t r i d e = rstride , c s t r i d e = cstride , s h a d e = s h a d e ) 20 21 p p . f i g u r e () 22 p p . s u p t i t l e ( ’ G a u s s o v a j e d r a za v r e d n o s t i s i g m a 1 , 2 in 4 ’ ) 23 24 p p . s u b p l o t (2 , 3 , 1) 25 p p . i m s h o w ( Kg1 , c m a p = ’ g r a y ’ ) 26 p p . t i t l e ( ’ s i g m a = 1 , v e l i k o s t ={} ’ . f o r m a t ( K g 1 . s h a p e ) ) 27 28 p p . s u b p l o t (2 , 3 , 2) 29 p p . i m s h o w ( Kg2 , c m a p = ’ g r a y ’ ) 30 p p . t i t l e ( ’ s i g m a = 2 , v e l i k o s t ={} ’ . f o r m a t ( K g 2 . s h a p e ) ) 31 32 p p . s u b p l o t (2 , 3 , 3) 33 p p . i m s h o w ( Kg4 , c m a p = ’ g r a y ’ ) 34 p p . t i t l e ( ’ s i g m a = 4 , v e l i k o s t ={} ’ . f o r m a t ( K g 4 . s h a p e ) ) 35 36 s u r f ( Kg1 , 2 3 4 ) 37 s u r f ( Kg2 , 2 3 5 ) 38 s u r f ( Kg4 , 2 3 6 ) 39 40 p p . f i g u r e () 41 p p . s u p t i t l e ( 42 ’ N e z v e z n o s t i na r o b u s l i k e ’ 43 ’ po k o n v o l u c i j i z G a u s s o v i m j e d r o m . ’ ) 44 45 p p . s u b p l o t (1 , 3 , 1) 46 p p . i m s h o w ( I1 , c m a p = ’ g r a y ’ ) 47 p p . t i t l e ( ’ I z v i r n a s l i k a ’ ) 48 49 p p . s u b p l o t (1 , 3 , 2) 50 p p . i m s h o w ( I1Kg1 , c m a p = ’ g r a y ’ ) 51 p p . t i t l e ( ’ F i l t r i r a n a z s i g m a =1 ’ ) 52 53 p p . s u b p l o t (1 , 3 , 3) 54 p p . i m s h o w ( I1Kg2 , c m a p = ’ g r a y ’ ) 55 p p . t i t l e ( ’ F i l t r i r a n a z s i g m a =2 ’ ) 56 57 p p . s h o w () 57 Filtriranje slik 4.2 Rešitve in odgovori na vprašanja 0.16 0.040 0.010 0.0 0 0 0.14 0.035 0.12 0.030 0.008 2.5 5 10 0.10 0.025 0.006 0.08 0.020 5.0 0.06 10 0.015 20 0.004 0.04 0.010 0.002 7.5 0.02 15 0.005 30 0.00 0.000 0.000 0 5 0 10 0 20 0.15 0.03 0.008 0.10 0.006 0.02 0.05 0.004 0.01 0.002 8 6 15 30 0 10 20 2 4 0 0 4 2 5 5 10 10 6 10 20 8 0 15 0 30 0 (a) σ = 1 (b) σ = 2 (c) σ = 4 Slika 4.4: Primerjava treh 2D Gaussovih konvolucijskih jeder. (a) Izvirna slika (b) Jedro za σ = 1 (c) Jedro za σ = 4 Slika 4.5: Nezveznosti na robu slike po konvoluciji z Gaussovim jedrom. (b) S tem, ko postavimo vrednosti sivinskih elementov izven definicijskega območja slike na 0, vnašamo nezveznosti v zunanji rob slike, in sicer v širini polovice konvolucijskega jedra (slika 4.5). Izboljšanje bi lahko dosegli z uporabo sivinske vrednosti najbližjega slikovnega elementa iz definicijskega območja slike namesto vrednosti 0. (c) V modulu funkcije ustvarimo funkcijo imPad2d. 1 def i m P a d 2 d ( img , n , b o u n d a r y = ’ c o n s t a n t ’ , f i l l v a l u e =0) : 2 b o u n d a r y = str ( b o u n d a r y ) . l o w e r () 3 # primer kode za razširitev s konstantno ali najbližjo vrednostjo 4 ’ ’ ’ 5 if i s i n s t a n c e ( n , int ) 6 py , px = n , n 7 e l s e : 8 py , px = n [0] , n [1] 9 58 Filtriranje slik 4.2 Rešitve in odgovori na vprašanja 10 H , W = i m g . s h a p e [0] , i m g . s h a p e [1] 11 Hp , Wp = H + 2* py , W + 2* px 12 if b o u n d a r y == ’ n e a r e s t ’: 13 o i m g = n p . z e r o s ([ Hp , Wp ] , d t y p e = i m g . d t y p e ) 14 o i m g [ - py : , px : - px ] = img [ -1 , :] 15 o i m g [ py : - py , : px ] = img [: ,0] . r e s h a p e ( H , 1) 16 o i m g [ py : - py : , - px :] = img [: , -1] . r e s h a p e ( H , 1) 17 18 o i m g [: py , : px ]= img [0 ,0] 19 o i m g [: py , - px :]= img [0 , -1] 20 o i m g [ - py : , : px ]= img [ -1 ,0] 21 o i m g [ - py : , - px :]= img [ -1 , -1] 22 e l i f b o u n d a r y == ’ c o n s t a n t ’: 23 o i m g = n p . t i l e ( i m g . d t y p e . t y p e ( v a l u e ) , [ Hp , Wp ]) 24 25 o i m g [ py : - py , px : - px ] = img 26 r e t u r n o i m g 27 ’ ’ ’ 28 # učinkovitejša rešitev s funkcijo pad modula numpy 29 if b o u n d a r y == ’ c o n s t a n t ’ : 30 r e t u r n n p . p a d ( 31 img , n , m o d e = b o u n d a r y , c o n s t a n t _ v a l u e s = f i l l v a l u e ) 32 33 e l i f b o u n d a r y in [ ’ r e f l e c t ’ , ’ w r a p ’ ]: 34 r e t u r n n p . p a d ( img , n , m o d e = b o u n d a r y ) 35 36 e l i f b o u n d a r y == ’ n e a r e s t ’ : 37 r e t u r n n p . p a d ( img , n , m o d e = ’ e d g e ’ ) 38 39 e l i f b o u n d a r y == ’ m i r r o r ’ : 40 r e t u r n n p . p a d ( img , n , m o d e = ’ s y m m e t r i c ’ ) 41 42 e l s e : 43 r a i s e V a l u e E r r o r ( 44 ’ V r e d n o s t p a r a m e t r a " m o d e " je l a h k o ’ 45 ’ " c o n s t a n t " , " r e f l e c t " , " n e a r e s t " ali " m i r r o r "! ’ ) V modulu funkcije preimenujemo funkcijo conv2d v _conv2d in ustvarimo novo funkcijo conv2d, ki ustrezno uporabi _conv2d in imPad2d. 1 def c o n v 2 d ( data , kernel , b o u n d a r y = ’ c o n s t a n t ’ , f i l l v a l u e =0) : 2 n = n p . f l o o r ( n p . a r r a y ( k e r n e l . s h a p e ) /2 .0 ) . a s t y p e ( n p . i n t ) 3 4 p d a t a = i m P a d 2 d ( data , n , b o u n d a r y , f i l l v a l u e ) 5 o d a t a = _ c o n v 2 d ( pdata , k e r n e l ) 6 7 r e t u r n o d a t a [ n [0]: - n [0] , n [1]: - n [ 1 ] ] (d) Razširjeni del slike mora znašati polovico velikosti konvolucijskega jedra n, in sicer j n−1 k. 2 59 Filtriranje slik 4.2 Rešitve in odgovori na vprašanja 3. V modulu funkcije ustvarimo funkcijo conv1d. 1 def c o n v 1 d ( data , kernel , b o u n d a r y = ’ c o n s t a n t ’ , f i l l v a l u e =0) : 2 a = len ( k e r n e l ) 3 c = p = int ( n p . f l o o r ( a /2) ) 4 N = d a t a . s i z e 5 Np = N + 2* p 6 p d a t a = n p . z e r o s ([ Np ]) 7 p d a t a [ p : - p ] = d a t a 8 9 if b o u n d a r y == ’ n e a r e s t ’ : 10 p d a t a [: p ] = d a t a [0] 11 p d a t a [ - p :] = d a t a [ -1] 12 13 e l s e : 14 p d a t a [: p ] = f i l l v a l u e 15 p d a t a [ - p :] = f i l l v a l u e 16 17 o d a t a = n p . z e r o s ([ N ]) 18 for i in r a n g e ( N ) : 19 for j in r a n g e ( a ) : 20 o d a t a [ i ] += k e r n e l [ j ]* p d a t a [ p + i - ( j - c ) ] 21 22 r e t u r n o d a t a . r e s h a p e ( d a t a . s h a p e ) 4. V modulu funkcije ustvarimo funkcijo gaussianKernel1d. 1 def g a u s s i a n K e r n e l 1 d ( sigma , t r u n c a t e =4) : 2 n = int (2* n p . c e i l ( t r u n c a t e * s i g m a ) + 1) 3 x = n p . a r a n g e ( n ) 4 x -= x . m e a n () 5 k e r n e l = 1 .0 /( s i g m a * n p . s q r t (2 .0 * n p . p i ) ) * \ 6 n p . e x p ( - x * * 2 * ( 1 .0 /(2 .0 * s i g m a * * 2 ) ) ) 7 k e r n e l /= k e r n e l . s u m () 8 9 r e t u r n k e r n e l Glavna prednost filtriranja slik z dvema zaporednima 1D konvolucijama pred enim filtriranjem z 2D konvolucijo je v numerični zahtevnosti. V prvem primeru zahtevnost raste linearno z velikostjo konvolucijskega jedra, v drugem primeru pa s kvadratom velikosti konvolucijskega jedra. 5. V modulu funkcije ustvarimo funkcijo imGaussFilt2D. 1 def i m G a u s s F i l t 2 d ( img , sigma , b o u n d a r y = ’ c o n s t a n t ’ , f i l l v a l u e =0) : 2 H , W = i m g . s h a p e [0] , i m g . s h a p e [1] 3 K = g a u s s i a n K e r n e l 1 d ( s i g m a ) 4 o i m g = n p . z e r o s ( i m g . s h a p e ) 5 60 Filtriranje slik 4.2 Rešitve in odgovori na vprašanja 0.4 0.2 0.2 0.1 0.0 0.0 0 2 4 6 8 0 5 10 15 (a) Jedro dolžine 7, σ = 1 (b) Jedro dolžine 13, σ = 2 Slika 4.6: Primerjava dveh 1D Gaussovih konvolucijskih jeder. 6 # Filtriramo po vrsticah slike. 7 for i in r a n g e ( H ) : 8 o i m g [ i , :] = c o n v 1 d ( img [ i , :] , K , b o u n d a r y , f i l l v a l u e ) 9 10 # Filtriramo po stolpcih slike. 11 for i in r a n g e ( W ) : 12 o i m g [: , i ] = c o n v 1 d ( o i m g [: , i ] , K , b o u n d a r y , f i l l v a l u e ) 13 14 r e t u r n o i m g Primerjavo rezultatov filtriranja s funkcijama conv1d in conv2d prikazuje slika 4.7. 1 I1f = I 1 . a s t y p e ( n p . f l o a t ) 2 I 1 C 2 d = f u n k c i j e . c o n v 2 d ( I1f , Kg1 , b o u n d a r y = ’ c o n s t a n t ’ ) 3 I 1 C 1 d = n p . z e r o s ( I 1 . s h a p e ) 4 k = f u n k c i j e . g a u s s i a n K e r n e l 1 d (1 .0 ) 5 for i in r a n g e ( I 1 . s h a p e [ 0 ] ) : 6 I 1 C 1 d [ i , :] = f u n k c i j e . c o n v 1 d ( 7 I1f [ i , :] , k , b o u n d a r y = ’ c o n s t a n t ’ ) 8 for i in r a n g e ( I 1 . s h a p e [ 1 ] ) : 9 I 1 C 1 d [: , i ] = f u n k c i j e . c o n v 1 d ( 10 I 1 C 1 d [: , i ] , k , b o u n d a r y = ’ c o n s t a n t ’ ) 11 12 p p . f i g u r e () 13 p p . s u p t i t l e ( ’ P r i m e r j a v a 2 D in 2 x 1 D k o n v o l u c i j e ’ ) 14 15 p p . s u b p l o t (1 , 3 , 1) 16 p p . i m s h o w ( I1C1d , c m a p = ’ g r a y ’ ) 17 p p . t i t l e ( ’ 2 x 1 D k o n v o l u c i j a ’ ) 18 p p . a x i s ( ’ off ’ ) 19 20 p p . s u b p l o t (1 , 3 , 2) 21 p p . i m s h o w ( I1C2d , c m a p = ’ g r a y ’ ) 22 p p . t i t l e ( ’ 2 D k o n v o l u c i j a ’ ) 23 p p . a x i s ( ’ off ’ ) 61 Filtriranje slik 4.2 Rešitve in odgovori na vprašanja 24 25 p p . s u b p l o t (1 , 3 , 3) 26 p p . i m s h o w ( I 1 C 2 d - I1C1d , c m a p = ’ g r a y ’ ) 27 p p . t i t l e ( ’ R a z l i k a s l i k ’ ) 28 p p . a x i s ( ’ off ’ ) 29 30 p p . s h o w () (a) Izvirna slika (b) 2D konvolucija, σ = 1 (c) 2 x 1D konvolucija, σ = 1 Slika 4.7: Primerjava filtriranja med 2D konvolucijo in dvakratno zaporedno 1D konvolucijo. 6. V modulu funkcije ustvarimo funkcijo imSharpen2d. 1 def i m S h a r p e n 2 d ( img , k i n d = ’ m a s k ’ , c =1 .0 , s i g m a =1 .0 ) : 2 img = i m g . a s t y p e ( n p . f l o a t 6 4 ) 3 4 if k i n d == ’ m a s k ’ : 5 M = img - i m G a u s s F i l t 2 d ( img , sigma , ’ n e a r e s t ’ ) 6 o i m g = img + c * M 7 8 e l i f k i n d == ’ l a p l a c e ’ : 9 Lk = n p . a r r a y ([[0 , 1 , 0] ,[1 , -4 , 1] ,[0 , 1 , 0]] , n p . f l o a t 6 4 ) 10 o i m g = img - c * c o n v 2 d ( img , Lk , ’ n e a r e s t ’ ) 11 12 e l s e : 13 r a i s e V a l u e E r r o r ( 14 ’ V r e d n o s t p a r a m e t r a k i n d je l a h k o ’ 15 ’ " m a s k " ali " l a p l a c e "! ’ ) 16 r e t u r n o i m g (a) Primerjavo med ostrenjem slike z maskiranjem neostrih področij in Laplaceovim operatorjem prikazuje slika 4.8. 1 I 1 s m = f u n k c i j e . i m S h a r p e n 2 d ( I1 , ’ m a s k ’ , c =1 .0 , s i g m a =1 .0 ) 2 I 1 s m = n p . c l i p ( I1sm , 0 , 2 5 5 ) 3 I 1 s l = f u n k c i j e . i m S h a r p e n 2 d ( I1 , ’ l a p l a c e ’ , c =1 .0 ) 4 I 1 s l = n p . c l i p ( I1sl , 0 , 2 5 5 ) 5 62 Filtriranje slik 4.2 Rešitve in odgovori na vprašanja (a) Izvirna slika (b) Ostrenje z maskiranjem (c) Ostrenje z Laplaceom Slika 4.8: Primerjava med ostrenjem slike z maskiranjem neostrih področij in Laplaceovim operatorjem pri σ = 1 ter c = 1. 6 p p . f i g u r e () 7 p p . s u p t i t l e ( 8 ’ P r i m e r j a v a o s t r e n j a z m a s k o in ’ 9 ’ L a p l a c e o v i m o p e r a t o r j e m ’ ) 10 11 p p . s u b p l o t (1 , 3 , 1) 12 p p . i m s h o w ( I1 , c m a p = ’ g r a y ’ ) 13 p p . t i t l e ( ’ I z v i r n a s l i k a ’ ) 14 p p . a x i s ( ’ off ’ ) 15 16 p p . s u b p l o t (1 , 3 , 2) 17 p p . i m s h o w ( I1sm , c m a p = ’ g r a y ’ ) 18 p p . t i t l e ( ’ O s t r e n j e z m a s k o ’ ) 19 p p . a x i s ( ’ off ’ ) 20 21 p p . s u b p l o t (1 , 3 , 3) 22 p p . i m s h o w ( I1sl , c m a p = ’ g r a y ’ ) 23 p p . t i t l e ( ’ O s t r e n j e z L a p l a c e o m ’ ) 24 p p . a x i s ( ’ off ’ ) 25 26 p p . s h o w () (b) Izvedemo ostrenje slike za različne vrednosti parametra c. 1 p p . f i g u r e () 2 p p . s u p t i t l e ( ’ O s t r e n j e z m a s k o ’ ) 3 p p . s u b p l o t (1 , 4 , 1) 4 p p . i m s h o w ( I1 , c m a p = ’ g r a y ’ ) 5 for index , c in e n u m e r a t e ((0 .5 , 1 , 2 .0 ) ) : 6 img = f u n k c i j e . i m S h a r p e n 2 d ( I1 , ’ m a s k ’ , c = c , s i g m a =1 .0 ) 7 img = n p . c l i p ( img , 0 , 2 5 5 ) 8 p p . s u b p l o t (1 , 4 , i n d e x + 2) 9 p p . i m s h o w ( img , c m a p = ’ g r a y ’ ) 10 p p . t i t l e ( ’ c = {: .1f } ’ . f o r m a t ( c ) ) 63 Filtriranje slik 4.2 Rešitve in odgovori na vprašanja 11 12 p p . f i g u r e () 13 p p . s u p t i t l e ( ’ O s t r e n j e z L a p l a c e o m ’ ) 14 p p . s u b p l o t (1 , 4 , 1) 15 p p . i m s h o w ( I1 , c m a p = ’ g r a y ’ ) 16 for index , c in e n u m e r a t e ((0 .5 , 1 , 2 .0 ) ) : 17 img = f u n k c i j e . i m S h a r p e n 2 d ( I1 , ’ l a p l a c e ’ , c = c ) 18 img = c l i p ( img , 0 , 2 5 5 ) 19 p p . s u b p l o t (1 , 4 , i n d e x + 2) 20 p p . i m s h o w ( img , c m a p = ’ g r a y ’ ) 21 p p . t i t l e ( ’ c = {: .1f } ’ . f o r m a t ( c ) ) (a) c = 0 . 5 (b) c = 1 (c) c = 2 Slika 4.9: Ostrenje z Laplaceovim operatorjem za nekaj različnih vrednosti parametra c. (a) c = 0 . 5 (b) c = 1 (c) c = 2 Slika 4.10: Ostrenje z masko za nekaj različnih vrednosti parametra c pri σ = 1. 7. V modulu funkcije ustvarimo funkcijo imStatFilt2d. 1 def i m S t a t F i l t 2 d ( img , n =3 , k i n d = ’ m e d i a n ’ ) : 2 H , W = i m g . s h a p e 3 4 if k i n d == ’ min ’ : 5 f = n p . m i n 6 64 Filtriranje slik 4.2 Rešitve in odgovori na vprašanja 7 e l i f k i n d == ’ max ’ : 8 f = n p . m i n 9 10 e l i f k i n d == ’ m e d i a n ’ : 11 f = n p . m e d i a n 12 13 e l s e : 14 r a i s e V a l u e E r r o r ( 15 ’ V r e d n o s t p a r a m e t r a k i n d je l a h k o ’ 16 ’ " min " , " max " ali " m e d i a n "! ’ ) 17 18 p = int ( n p . f l o o r ( n /2 .0 ) ) 19 p i m g = i m P a d 2 d ( img , [ p , p ] , ’ n e a r e s t ’ ) 20 o i m g = n p . z e r o s ( i m g . s h a p e ) 21 for i in r a n g e ( H ) : 22 for j in r a n g e ( W ) : 23 o i m g [ i , j ] = f ( p i m g [ p + i : p + i + n + 1 , 24 p + j : p + j + n + 1]) 25 r e t u r n o i m g Izvedemo primerjavo med Gaussovim in medianinim filtrom (slika 4.11). 1 I2m = f u n k c i j e . i m S t a t F i l t 2 d ( I2 , 3 , ’ m e d i a n ’ ) 2 I2g = f u n k c i j e . i m G a u s s F i l t 2 d ( I2 , 0 .5 ) 3 4 p p . f i g u r e () 5 p p . s u p t i t l e ( ’ P r i m e r j a v a m e d i a n i n e g a in G a u s s o v e g a f i l t r a . ’ ) 6 7 p p . s u b p l o t (1 , 3 , 1) 8 p p . i m s h o w ( I2 , c m a p = ’ g r a y ’ ) 9 p p . t i t l e ( ’ I z v i r n a s l i k a ’ ) 10 p p . a x i s ( ’ off ’ ) 11 12 p p . s u b p l o t (1 , 3 , 2) 13 p p . i m s h o w ( I2m , c m a p = ’ g r a y ’ ) 14 p p . t i t l e ( ’ M e d i a n i n f i l t e r ’ ) 15 p p . a x i s ( ’ off ’ ) 16 17 p p . s u b p l o t (1 , 3 , 3) 18 p p . i m s h o w ( I2g , c m a p = ’ g r a y ’ ) 19 p p . t i t l e ( ’ G a u s s o v f i l t e r ’ ) 20 p p . a x i s ( ’ off ’ ) p p . s h o w () 8. Ustvarimo in preizkusimo konvolucijsko jedro velikosti 3 × 3, ki vrednost slikovnega elementa nadomesti s povprečno vrednostjo 8-ih sosednjih slikovnih elementom (slika 4.12). 1 Ka = n p . a r r a y ([[1 , 1 , 1] , 2 [1 , 0 , 1] , 3 [1 , 1 , 1]] , d t y p e = n p . f l o a t ) /8 .0 65 Filtriranje slik 4.2 Rešitve in odgovori na vprašanja (a) Izvirna slika (b) Gaussov filter (c) Medianin filter Slika 4.11: Primerjava med Gaussovi σ = 0 , 5 in medianinim n = 3 filtrom. 4 5 I2a = f u n k c i j e . c o n v 2 d ( I2 , Ka , b o u n d a r y = ’ r e f l e c t ’ ) 6 7 p p . f i g u r e () 8 9 p p . s u b p l o t (1 , 3 , 1) 10 p p . t i t l e ( ’ I z v i r n a s l i k a ’ ) 11 p p . i m s h o w ( I2 , c m a p = ’ g r a y ’ ) 12 13 p p . s u b p l o t (1 , 3 , 2) 14 p p . t i t l e ( ’ M e d i a n a 3 x 3 ’ ) 15 p p . i m s h o w ( I2m , c m a p = ’ g r a y ’ ) 16 17 p p . s u b p l o t (1 , 3 , 3) 18 p p . t i t l e ( ’ P o v p r e č je s o s e d o v ’ ) 19 p p . i m s h o w ( I2a , c m a p = ’ g r a y ’ ) 20 21 p p . s h o w () Filtriranje z mediano bo uspešno odstranilo šum tipa sol in poper tudi v primeru, ko je več sosednjih slikovnih elementov podvrženo šumu (največ polovica sosednjih slikovnih elementov). Filtriranje s povprečjem sosednjih slikovnih elementov bo uspešno le, če sosednji slikovni elementi niso podvrženi šumu tipa sol in poper. 9. V modulu funkcije ustvarimo funkcijo imGaussFilt3d. 1 def i m G a u s s F i l t 3 d ( img , sigma , b o u n d a r y = ’ c o n s t a n t ’ , f i l l v a l u e =0) : 2 H , W , D = i m g . s h a p e 3 K = g a u s s i a n K e r n e l 1 d ( s i g m a ) 4 o i m g = n p . z e r o s ( i m g . s h a p e ) 5 6 for i in r a n g e ( D ) : 7 for j in r a n g e ( H ) : 8 o i m g [ j , : , i ] = c o n v 1 d ( 9 img [ j , : , i ] , K , b o u n d a r y , f i l l v a l u e ) 66 Filtriranje slik 4.2 Rešitve in odgovori na vprašanja (a) Izvirna slika (b) Povprečje sosedov (c) Medianin filter Slika 4.12: Primerjava med filtriranjem s konvolucijskim jedrom velikosti 3 × 3, ki vrednost slikovnega elementa nadomesti s povprečno vrednostjo 8-ih sosednjih slikovnih elementom, in medianinim filtrom enake velikosti. 10 11 for i in r a n g e ( D ) : 12 for j in r a n g e ( W ) : 13 o i m g [: , j , i ] = c o n v 1 d ( 14 o i m g [: , j , i ] , K , b o u n d a r y , f i l l v a l u e ) 15 16 for i in r a n g e ( H ) : 17 for j in r a n g e ( W ) : 18 o i m g [ i , j , :] = c o n v 1 d ( 19 o i m g [ i , j , :] , K , b o u n d a r y , f i l l v a l u e ) 20 21 r e t u r n o i m g Glajenje 3D slike z Gaussovim konvolucijskim jedrom (slika 4.13). 1 I3f = f u n k c i j e . i m G a u s s F i l t 3 d ( I3 , 0 .5 ) 2 3 p p . f i g u r e () 4 p p . s u p t i t l e ( ’ F i l t r i r a n j e 3 D slike , z =90 in x =90 ’ ) 5 6 p p . s u b p l o t (2 , 2 , 1) 7 p p . i m s h o w ( I3 [: ,: ,90] , c m a p = ’ g r a y ’ ) 8 p p . t i t l e ( ’ I z v i r n a s l i k a x =90 ’ ) 9 p p . a x i s ( ’ off ’ ) 10 11 p p . s u b p l o t (2 , 2 , 2) 12 p p . i m s h o w ( I3f [: ,: ,90] , c m a p = ’ g r a y ’ ) 13 p p . t i t l e ( ’ F i l t r i r a n a s l i k a x =90 ’ ) 14 p p . a x i s ( ’ off ’ ) 15 16 p p . s u b p l o t (2 , 2 , 3) 17 p p . i m s h o w ( I3 [90 ,: ,:] . s q u e e z e () , c m a p = ’ g r a y ’ ) 67 Filtriranje slik 4.2 Rešitve in odgovori na vprašanja 18 p p . t i t l e ( ’ I z v i r n a s l i k a z =90 ’ ) 19 p p . a x i s ( ’ off ’ ) 20 21 p p . s u b p l o t (2 , 2 , 4) 22 p p . i m s h o w ( I3f [90 ,: ,:] . s q u e e z e () , c m a p = ’ g r a y ’ ) 23 p p . t i t l e ( ’ F i l t r i r a n a s l i k a z =90 ’ ) 24 p p . a x i s ( ’ off ’ ) 25 26 p p . s h o w () (a) Izvirna slika z = 90 (b) Filtrirana slika z = 90 (c) Izvirna slika x = 90 (d) Filtrirana slika x = 90 Slika 4.13: Primer glajenja 3D slike z Gaussovim konvolucijskim jedrom σ = 0 , 5. 10. Preizkusimo funkcije modula scipy.ndimage. 1 f r o m s c i p y . n d i m a g e i m p o r t c o n v o l v e , g a u s s i a n _ f i l t e r , 2 m e d i a n _ f i l t e r , l a p l a c e 3 4 # konvolucija z gaussovim jedrom 5 o i m g = c o n v o l v e ( I1 , Kg1 ) 6 7 # gaussov filter sigma=1.0, 2D slika 8 o i m g = g a u s s i a n _ f i l t e r ( I1 , s i g m a =1 .0 ) 9 10 # gaussov filter sigma=1.0, 3D slika 11 o i m g = g a u s s i a n _ f i l t e r ( I3 , s i g m a =1 .0 ) 12 13 # medianin filter velikosti 3 x 3 14 o i m g = m e d i a n _ f i l t e r ( I1 , [3 , 3]) 15 16 # laplace 17 o i m g = l a p l a c e ( I1 ) 68 Poglavje 5 Prikazovanje in preslikovanje slik Prvi del poglavja je namenjen spoznavanju orodij za prikazovanje standardnih prerezov 3D sivinskih slik (slika 5.1 in slika 5.2) ter izračunu projekcij sivinskih vrednosti vzdolž glavnih koordinatnih osi slike. V drugem delu poglavja obravnavamo sivinske preslikave in izračun sivinskih prerezov slik. Sivinske preslikave so v splošnem poljubne preslikave, ki vsakemu slikovnemu elementu referenčne sivinske slike r z dinamičnim območjem sivinskih vrednosti [0 , Lr] priredijo vrednost iz dinamičnega območja preslikane slike [0 , Ls]. Glavni namen sivinskih preslikav je povečanje kontrasta struktur zanimanja na sliki in prilagoditev sivinskih vrednosti za potrebe prikazovanja. 5.1 Naloge in vprašanja 1. Naložite 3D sliko telesa ct_287x165x194_uint8.raw, ki je bila zajeta s slikovno tehniko računalniške tomografije. Velikost slike je x× y × z = 287×165×194 slikovnih elementov, velikost slikovnega elementa pa dx × dy × dz = 2 × 2 × 4 mm. Slikovni elementi so shranjeni v vrstnem redu ’xyz’. Pri izrisu slike upoštevajte velikost slikovnega elementa. To vam omogoča parameter extent=[xmin, xmax, ymin, ymax] funkcije imshow modula matplotlib.pyplot. Koordinatno izhodišče slike naj bo v središču slikovnega elementa z naslovom [0, 0, 0]. (a) Ustvarite funkcijo imShowEx, ki izriše sivinsko ali barvno sliko img, definirano na poljubnem pravokotnem področju extent. V ta namen uporabite funkcijo imshow modula matplotlib.pyplot. Prikaz koordinatnih osi prilagodite vrednosti parametra axis, prikazovalno okno pa opremite z naslovno vrstico, ki jo določa vrednost parametra title. Če je vrednost parametra subplot različna od None, izrišite sliko v podanem podoknu. Sivine slik prikažite z barvno mapo cmap=’gray’. 1 def i m S h o w E x ( img , e x t e n t = None , 2 t i t l e = ’ ’ , a x i s = ’ off ’ , s u b p l o t = N o n e ) : (b) Določite stranske ( x = konst. ), čelne ( y = konst. ) in prečne ( z = konst. ) prereze slike pri x = 280 mm, y = 220 mm in z = 200 mm ter jih prikažite. Sliko stranskega 69 Prikazovanje in preslikovanje slik 5.1 Naloge in vprašanja x Stranski (sagittal) Čelni (coronal) y z Prečni (transverse) Prerezi Slika 5.1: Standardni prerezi 3D slik. prereza Ix boste uporabili pri reševanju nalog pod točkami 2-5. Za enostavno izločitev razsežnosti podatkovnega polja, ki so enake 1, uporabite člansko funkcijo squeeze. (c) Izračunajte projekcije maksimalne in povprečne sivinske vrednosti 3D slike vzdolž koordinatnih osi x, y in z ter jih prikažite. Povprečno in maksimalno vrednost vzdolž poljubne razsežnosti podatkovnega polja lahko določite s članskima funkcijama mean in max. (a) Stranski (b) Čelni (c) Prečni Slika 5.2: Stranski, čelni in prečni prerez slike ct_287x165x194_uint8.raw. 2. Linearno sivinsko preslikavo (slika 5.3) izvedemo tako, da sivinsko vrednost slikovnega elementa referenčne slike r preslikamo z linearno funkcijo. Rezultat preslikave je slika s, ki ima linearno preslikane sivinske vrednosti. Pri izbiri vrednosti parametrov preslikave a in b je potrebno upoštevati dinamično območje preslikane slike s: s( x, y) = a · r( x, y) + b. (5.1) (a) Ustvarite funkcijo imScale, ki linearno preslika sivinske vrednosti slike img. Parametra linearne preslikave naj bosta določena kot a =slope in b =intersection. 70 Prikazovanje in preslikovanje slik 5.1 Naloge in vprašanja s(x, y) Ls r(x, y) Lr Slika 5.3: Linearna preslikava. 1 def i m S c a l e ( img , slope , i n t e r s e c t i o n ) : 2 ... 3 r e t u r n o I m a g e (b) S pomočjo funkcije imScale invertirajte sliko Ix. Dinamično območje slike [0 , 255] naj ostane nespremenjeno. Izrišite tudi pripadajoča histograma in linijska prereza ( y = 175) obeh slik. 3. Linearno oknjenje (slika 5.4) izvedemo tako, da na dinamičnem območju referenčne slike r definiramo poljubno okno s središčem c in širino w. Sivinskim vrednostim referenčne slike, ki so manjše od c − w, priredimo vrednost 0, sivinskim vrednostim, ki so večje od 2 c + w , priredimo vrednost L , c + w ] pa preslikamo 2 s, sivinske vrednosti na intervalu [ c − w 2 2 z linearno preslikavo: 0 , r( x, y) < c − w ,   2  s( x, y) = Ls r( x, y) − c − w , c − w < = r( x, y) < c + w , (5.2) w 2 2 2    Ls, r( x, y) > = c + w . 2 s(x, y) Ls r(x, y) c Lr w c - w/2 c + w/2 Slika 5.4: Linearno oknjenje. 71 Prikazovanje in preslikovanje slik 5.1 Naloge in vprašanja (a) Ustvarite funkcijo imWindow, ki izvede linearno oknjenje slike img. Središče okna c naj bo določeno s parametrom center, širina okna w s parametrom width, dinamično območje Ls izhodne slike pa naj določa vrednost parametra ls. 1 def i m W i n d o w ( img , center , width , ls = 2 5 5 ) : 2 ... 3 r e t u r n o I m a g e (b) Oknite sliko Ix tako, da iz linearnega območja preslikave izločite 5 % najtemnejših in 5 % najsvetlejših sivinskih vrednosti v sliki. Dinamično območje slike naj ostane nespremenjeno. Izrišite tudi pripadajoča histograma in sivinska prereza ( y = 175) obeh slik. 4. Upragovljanje slike (slika 5.5) izvedemo tako, da vsaki sivinski vrednosti referenčne slike r, ki je manjša od praga t, priredimo vrednost 0, sicer pa največjo možno sivinsko vrednost Ls: (0 , r( x, y) < t, s( x, y) = (5.3) Ls, drugod. s(x, y) Ls r(x, y) t Lr Slika 5.5: Upragovljanje. (a) Ustvarite funkcijo za upragovljanje sivinskih slik imThreshold, kjer je img referenčna slika, threshold izbrani prag, ls pa dinamično območje Ls upragovljene slike. 1 def i m T h r e s h o l d ( img , t h r e s h o l d , ls = 2 5 5 ) : 2 ... 3 r e t u r n o I m a g e (b) Preizkusite delovanje funkcije na sliki Ix. Vrednost praga naj bo t = 127. 5. Gama preslikava (slika 5.6) je nelinearna zvezna preslikava. Pri preslikavi običajno pred-postavimo, da sta dinamični območji referenčne in preslikane slike enaki: s( x, y) = L 1− γ r rγ ( x, y) . (5.4) 72 Prikazovanje in preslikovanje slik 5.1 Naloge in vprašanja s(x, y) Lr γ=1/16 γ=1/4 γ=1/2 γ=1 γ=2 γ=4 γ=16 r(x, y) Lr Slika 5.6: Gama preslikava. (a) Ustvarite funkcijo imGamma, ki preslika sivinske vrednosti referenčne slike img z gama preslikavo γ = gamma. 1 def i m G a m m a ( img , g a m m a ) : 2 ... 3 r e t u r n o I m a g e (b) Preizkusite delovanje funkcije na sliki Ix z vrednostjo γ = 2. Izrišite tudi pripadajoča histograma in linijska prereza ( y = 175) obeh slik. 6. Odsekoma linearna preslikava (slika 5.7) je popolnoma določena z množico urejenih parov kontrolnih točk ( ri, si) , i = 1 ...N. Zaporedni pari točk določajo linearno preslikavo iz dinamičnega območja [ ri, ri+1] referenčne slike v dinamično območje [ si, si+1] preslikane slike. Na odsekih, kjer so multiplikativni koeficienti linearne preslikave večji od 1, kontrast povečujemo, sicer ga zmanjšujemo. V splošnem je z odsekoma linearno preslikavo mogoče izraziti ali aproksimirati vse v predhodnih točkah obravnavane sivinske preslikave: s( x, y) = si+1 − si ( r( x, y) − ri) + si. (5.5) ri+1 − ri s(x, y) (r5, s5) Ls (r4, s4) (r3, s3) (r2, s2) r(x, y) (r1, s1) Lr Slika 5.7: Odsekoma linearna preslikava. 73 Prikazovanje in preslikovanje slik 5.1 Naloge in vprašanja (a) Ustvarite funkcijo imMultiScale, ki odsekoma linearno preslika sivinske vrednosti vhodne slike img. Parameter r naj bo vektor kontrolnih točk [ r 1 , ..., rN] na dinamič- nem območju referenčne slike, s pa vektor kontrolnih točk [ s 1 , ..., sN] na dinamičnem območju preslikane slike. 1 def i m M u l t i S c a l e ( img , r , s ) : 2 ... 3 r e t u r n o I m a g e (b) S funkcijo imMultiscale aproksimirajte nelinearno Gama preslikavo za γ = 2. Dolo- čite število odsekov, ki so potrebni, da napaka aproksimacije ne presega 1 sivine. 7. Ustvarite funkcijo imProfile2d, ki izračuna linijski prerez slike v ekvidistantnih točkah ox, oy vzdolž poljubne daljice s krajiščema v točkah t1 in t2. Koordinatni sistem slike naj bo definiran z vektorjema x in y. Korak vzorčenja vzdolž izbrane daljice naj določa parameter step. Za interpolacijo sivinskih vrednosti vzdolž daljice uporabite funkcijo interp2 priloženega modula interp, red interpolacije pa naj določa parameter order (0 - interpolacija z najbližjim sosedom, 1 - bilinearna interpolacija). 1 def i m P r o f i l e 2 d ( img , x , y , t1 , t2 , s t e p =1 , o r d e r =1) : 2 ... 3 r e t u r n profile , ox , oy (a) Izrišite diagonalna linijska prereza slike Ix. Uporabite korak step=2 ter bilinearno interpolacijo (order=1). (b) Ustvarite še funkcijo imProfile3d, ki izračuna linijski prerez 3D slike vzdolž daljice s krajiščema v točkah t1 in t2. Interpolacijo sivinskih vrednosti vzdolž daljice izvedite s funkcijo interp3 priloženega modula interp. Izrišite diagonalni linijski prerez 3D slike z enim krajiščem v koordinatnem izhodišču. Uporabite korak step=2 ter trilinearno interpolacijo (order=1). 1 def i m P r o f i l e 3 d ( img , x , y , z , t1 , t2 , s t e p =1 , o r d e r =1) : 2 ... 3 r e t u r n profile , ox , oy , oz 74 Prikazovanje in preslikovanje slik 5.2 Rešitve in odgovori na vprašanja 5.2 Rešitve in odgovori na vprašanja Pri odgovorih privzamemo, da se funkcije iz rešitev nahajajo v modulu funkcije, slikovno gradivo pa se nahaja v podmapi poglavje_5. Naprej uvozimo potrebne module, naložimo slike in definiramo pomožne spremenljivke. 1 i m p o r t n u m p y as np 2 f r o m m a t p l o t l i b i m p o r t p y p l o t as pp 3 i m p o r t f u n k c i j e 4 5 I = f u n k c i j e . i m L o a d R a w 3 d ( 6 ’ . / p o l g a v j e _ 5 / c t _ 2 8 7 x 1 6 5 x 1 9 4 _ u i n t 8 . r a w ’ , 7 287 , 165 , 194 , d t y p e = n p . u i n t 8 , o r d e r = ’ xyz ’ ) 8 D , H , W = I . s h a p e 9 10 dx , dy , dz = 2 .0 , 2 .0 , 4 .0 11 Hmm , Wmm , Dmm = H * dy , W * dx , D * dz 12 I x E x t e n t = [0 , Hmm , 0 , Dmm ] 13 x , y , z = n p . a r a n g e ( W ) * dx , n p . a r a n g e ( H ) * dy , n p . a r a n g e ( D ) * dz 14 zi = n p . a r a n g e (0 , Dmm , 2 .0 ) 15 yi = n p . t i l e ( 1 7 5 .0 , z i . s h a p e ) 16 n B i n s = 64 1. (a) V modulu funkcije ustvarimo funkcijo imShowEx. 1 def i m S h o w E x ( img , e x t e n t = None , 2 t i t l e = ’ ’ , a x i s = ’ off ’ , s u b p l o t = None , ** k w a r g s ) : 3 if s u b p l o t is not N o n e : 4 if i s i n s t a n c e ( subplot , ( list , t u p l e ) ) : 5 p p . s u b p l o t (* s u b p l o t ) 6 e l s e : 7 p p . s u b p l o t ( s u b p l o t ) 8 9 if len ( i m g . s h a p e ) <= 2: 10 c m a p = ’ g r a y ’ 11 12 p p . i m s h o w ( i m g . s q u e e z e () , e x t e n t = extent , c m a p = cmap , ** k w a r g s ) 13 p p . t i t l e ( t i t l e ) 14 p p . a x i s ( a x i s ) (b) Izrišemo standardne prereze pri x = 280, y = 220 in z = 200 mm (slika 5.8). 1 p p . f i g u r e () 2 3 I p r e c n i = I [ int ( 2 0 0 / dz ) , : , :] . s q u e e z e () 4 f u n k c i j e . i m S h o w E x ( 5 Iprecni , e x t e n t =[0 , Wmm , 0 , Hmm ] , 6 t i t l e = ’ Pre č ni p r e r e z z = 2 0 0 mm ’ , s u b p l o t = 1 3 1 ) 7 I c e l n i = I [: , int ( 2 2 0 / dy ) , :] . s q u e e z e () 8 75 Prikazovanje in preslikovanje slik 5.2 Rešitve in odgovori na vprašanja (a) Stranski (b) Čelni (c) Prečni Slika 5.8: Stranski, čelni in prečni prerez slike ct_287x165x194_uint8.raw. 9 f u n k c i j e . i m S h o w E x ( 10 Icelni , e x t e n t =[0 , Wmm , 0 , Dmm ] , 11 t i t l e = ’ Č e l n i p r e r e z y = 2 2 0 mm ’ , s u b p l o t = 1 3 2 ) 12 13 Ix = I s t r a n s k i = I [: , : , int ( 2 8 0 / dx ) ] . s q u e e z e () 14 f u n k c i j e . i m S h o w E x ( 15 I s t r a n s k i , e x t e n t =[0 , Hmm , 0 , Dmm ] , 16 t i t l e = ’ S t r a n s k i p r e r e z x = 2 8 0 mm ’ , s u b p l o t = 1 3 3 ) 17 18 p p . s h o w () (c) Izračunamo in izrišemo še projekcije maksimalne sivinske vrednosti vzdolž koordinatnih osi (slika 5.9). (a) Vzdolž x osi (b) Vzdolž y osi (c) Vzdolž z osi Slika 5.9: Projekcije maksimalnih sivinskih vrednosti vzdolž koordinatnih osi. 1 p p . f i g u r e () 2 3 I p r e c n i M a x = I . m a x (0) 4 f u n k c i j e . i m S h o w E x ( I p r e c n i M a x , e x t e n t =[0 , Wmm , 0 , Hmm ] , 5 t i t l e = ’ M a k s . p r o j e k c i j a v z d o l ž z ’ , 6 s u b p l o t = 1 3 1 ) 76 Prikazovanje in preslikovanje slik 5.2 Rešitve in odgovori na vprašanja 7 8 I c e l n i M a x = I . m a x (1) 9 f u n k c i j e . i m S h o w E x ( I c e l n i M a x , e x t e n t =[0 , Wmm , 0 , Dmm ] , 10 t i t l e = ’ M a k s . p r o j e k c i j a v z d o l ž y ’ , 11 s u b p l o t = 1 3 2 ) 12 13 I s t r a n s k i M a x = I . m a x (2) 14 f u n k c i j e . i m S h o w E x ( I s t r a n s k i M a x , e x t e n t =[0 , Hmm , 0 , Dmm ] , 15 t i t l e = ’ M a k s . p r o j e k c i j a v z d o l ž x ’ , 16 s u b p l o t = 1 3 3 ) 17 18 p p . s h o w () 2. (a) V modulu funkcije ustvarimo funkcijo imScale. 1 def i m S c a l e ( img , slope , i n t e r s e c t i o n ) : 2 r e t u r n i m g . a s t y p e ( n p . f l o a t ) * s l o p e + i n t e r s e c t i o n (b) Izvedemo invertiranje slike in prikažemo rezultat (slika 5.10). 0.06 200 0.04 100 0.02 0.00 0 0 100 200 0 200 400 600 (a) Izvirna (b) Histogram (c) Linijski prerez pri y = 175 mm 0.06 200 0.04 100 0.02 0.00 0 0 100 200 0 200 400 600 (d) Invertirana (e) Histogram (f) Linijski prerez pri y = 175 mm Slika 5.10: Invertiranje slike. 1 I x S c a l e d = f u n k c i j e . i m S c a l e ( Ix , -1 .0 , 255 .0 ) 2 p p . f i g u r e () 3 4 # Ix 77 Prikazovanje in preslikovanje slik 5.2 Rešitve in odgovori na vprašanja 5 f u n k c i j e . i m S h o w E x ( Ix , e x t e n t = I x E x t e n t , 6 s u b p l o t =231 , t i t l e = ’ I z v i r n a s l i k a ’ ) 7 p p . p l o t ( yi , zi , ’ - b ’ ) 8 p p . s u b p l o t (2 , 3 , 2) 9 p p . h i s t ( I x . f l a t t e n () , nBins , [0 , 256] , n o r m e d = T r u e ) 10 p p . x l i m ([0 , 2 5 6 ] ) 11 p p . s u b p l o t (2 , 3 , 3) 12 p p . p l o t ( zi , i n t e r p . i n t e r p 2 ( y , z , Ix , yi , zi ) ) 13 p p . y l i m ([0 , 2 5 5 ] ) 14 15 # IxScaled 16 f u n k c i j e . i m S h o w E x ( I x S c a l e d , e x t e n t = I x E x t e n t , 17 s u b p l o t =234 , t i t l e = ’ i m S c a l e ’ ) 18 p p . p l o t ( yi , zi , ’ - b ’ ) 19 p p . s u b p l o t (2 , 3 , 5) 20 p p . h i s t ( I x S c a l e d . f l a t t e n () , nBins , [0 , 256] , n o r m e d = T r u e ) 21 p p . x l i m ([0 , 2 5 6 ] ) 22 p p . s u b p l o t (2 , 3 , 6) 23 p p . p l o t ( zi , i n t e r p . i n t e r p 2 ( y , z , I x S c a l e d , yi , zi ) ) 24 p p . y l i m ([0 , 2 5 5 ] ) 25 26 p p . s h o w () 3. (a) V modulu funkcije ustvarimo funkcijo imWindow. 1 def i m W i n d o w ( img , center , width , ls = 2 5 5 ) : 2 o i m g = n p . z e r o s ( i m g . s h a p e ) 3 i n d 1 = img < c e n t e r - w i d t h *0 .5 4 o i m g [ i n d 1 ] = 0 5 i n d 2 = img > c e n t e r + w i d t h *0 .5 6 o i m g [ i n d 2 ] = ls 7 i n d 3 = n p . l o g i c a l _ n o t ( i n d 1 | i n d 2 ) 8 o i m g [ i n d 3 ] = ls / w i d t h *( img [ i n d 3 ] - ( c e n t e r - w i d t h *0 .5 ) ) 9 10 r e t u r n o i m g (b) Izvedemo zahtevano oknjenje slike in prikažemo rezultat (slika 5.11). 1 tmp = n p . s o r t ( I x . f l a t t e n () ) 2 s t a r t = tmp [ r o u n d ( t m p . s i z e *0 .05 ) ] + 1 3 end = tmp [ r o u n d ( t m p . s i z e *0 .95 ) ] - 1 4 c e n t e r = 0 .5 *( s t a r t + end ) 5 w i d t h = end - s t a r t 6 I x W i n d o w = f u n k c i j e . i m W i n d o w ( Ix , center , width , 2 5 5 ) 7 8 p p . f i g u r e () 9 10 # Ix 11 f u n k c i j e . i m S h o w E x ( Ix , e x t e n t = I x E x t e n t , 12 s u b p l o t =231 , t i t l e = ’ I z v i r n a s l i k a ’ ) 78 Prikazovanje in preslikovanje slik 5.2 Rešitve in odgovori na vprašanja 0.06 200 0.04 100 0.02 0.00 0 0 100 200 0 200 400 600 (a) Izvirna (b) Histogram (c) Linijski prerez pri y = 175 mm 0.06 200 0.04 100 0.02 0.00 0 0 100 200 0 200 400 600 (d) Oknjena (e) Histogram (f) Linijski prerez pri y = 175 mm Slika 5.11: Oknjenje slike z izločitvijo 5 % najtemnejših in 5 % najsvetlejših slikovnih elementov. 13 p p . p l o t ( yi , zi , ’ - b ’ ) 14 p p . s u b p l o t (2 , 3 , 2) 15 p p . h i s t ( I x . f l a t t e n () , nBins , [0 , 256] , n o r m e d = T r u e ) 16 p p . x l i m ([0 , 2 5 6 ] ) 17 p p . s u b p l o t (2 , 3 , 3) 18 p p . p l o t ( zi , i n t e r p . i n t e r p 2 ( y , z , Ix , yi , zi ) ) 19 p p . y l i m ([0 , 2 5 5 ] ) 20 21 # IxWindow 22 f u n k c i j e . i m S h o w E x ( I x W i n d o w , e x t e n t = I x E x t e n t , 23 s u b p l o t =234 , t i t l e = ’ i m W i n d o w ’ ) 24 p p . p l o t ( yi , zi , ’ - b ’ ) 25 p p . s u b p l o t (2 , 3 , 5) 26 p p . h i s t ( I x W i n d o w . f l a t t e n () , nBins , [0 , 256] , n o r m e d = T r u e ) 27 p p . x l i m ([0 , 2 5 6 ] ) 28 p p . s u b p l o t (2 , 3 , 6) 29 p p . p l o t ( zi , i n t e r p . i n t e r p 2 ( y , z , I x W i n d o w , yi , zi ) ) 30 p p . y l i m ([0 , 2 5 5 ] ) 31 32 p p . s h o w () 4. (a) V modulu funkcije ustvarimo funkcijo imThreshold. 1 def i m T h r e s h o l d ( img , t h r e s h o l d , ls = 2 5 5 ) : 79 Prikazovanje in preslikovanje slik 5.2 Rešitve in odgovori na vprašanja 2 o i m g = n p . z e r o s ( i m g . s h a p e ) 3 o i m g [ img < t h r e s h o l d ] = 0 4 o i m g [ img >= t h r e s h o l d ] = ls 5 6 r e t u r n o i m g (b) Preverimo delovanje funkcije in izrišemo izvirno ter upragovljeno sliko (slika 5.12). (a) Izvirna (b) Upragovljena s t = 127 Slika 5.12: Izvirna in upragovljena slika. 1 I x T h r e s h o l d = f u n k c i j e . i m T h r e s h o l d ( Ix , 127 , 2 5 5 ) 2 3 p p . f i g u r e () 4 5 # Ix 6 f u n k c i j e . i m S h o w E x ( Ix , e x t e n t = I x E x t e n t , 7 s u b p l o t =121 , t i t l e = ’ I z v i r n a s l i k a ’ ) 8 9 # IxThreshold 10 f u n k c i j e . i m S h o w E x ( I x T h r e s h o l d , e x t e n t = I x E x t e n t , 11 s u b p l o t =122 , t i t l e = ’ I x T h r e s h o l d ’ ) 12 13 p p . s h o w () 5. (a) V modulu funkcije ustvarimo funkcijo imGamma. 1 def i m G a m m a ( img , gamma , lr = 2 5 5 ) : 2 r e t u r n lr * * ( 1 .0 - g a m m a ) * i m g . a s t y p e ( n p . f l o a t ) ** g a m m a (b) Izvedemo nelinearno Gama preslikavo gamma=2 slike in prikažemo rezultat (slika 5.13). 1 I x G a m m a = f u n k c i j e . i m G a m m a ( Ix , 2) 2 3 p p . f i g u r e () 4 5 # Ix 6 f u n k c i j e . i m S h o w E x ( Ix , e x t e n t = I x E x t e n t , 80 Prikazovanje in preslikovanje slik 5.2 Rešitve in odgovori na vprašanja 0.06 200 0.04 100 0.02 0.00 0 0 100 200 0 200 400 600 (a) Izvirna (b) Histogram (c) Linijski prerez pri y = 175 mm 0.06 200 0.04 100 0.02 0.00 0 0 100 200 0 200 400 600 (d) Preslikana (e) Histogram (f) Linijski prerez pri y = 175 mm Slika 5.13: Nelinearna Gama preslikava. 7 s u b p l o t =231 , t i t l e = ’ I z v i r n a s l i k a ’ ) 8 p p . p l o t ( yi , zi , ’ - b ’ ) 9 p p . s u b p l o t (2 , 3 , 2) 10 p p . h i s t ( I x . f l a t t e n () , nBins , [0 , 256] , n o r m e d = T r u e ) 11 p p . x l i m ([0 , 2 5 6 ] ) 12 p p . s u b p l o t (2 , 3 , 3) 13 p p . p l o t ( zi , i n t e r p . i n t e r p 2 ( y , z , Ix , yi , zi ) ) 14 p p . y l i m ([0 , 2 5 5 ] ) 15 16 # IxWindow 17 f u n k c i j e . i m S h o w E x ( IxGamma , e x t e n t = I x E x t e n t , 18 s u b p l o t =234 , t i t l e = ’ I x G a m m a ’ ) 19 p p . p l o t ( yi , zi , ’ - b ’ ) 20 p p . s u b p l o t (2 , 3 , 5) 21 p p . h i s t ( I x G a m m a . f l a t t e n () , nBins , [0 , 256] , n o r m e d = T r u e ) 22 p p . x l i m ([0 , 2 5 6 ] ) 23 p p . s u b p l o t (2 , 3 , 6) 24 p p . p l o t ( zi , i n t e r p . i n t e r p 2 ( y , z , IxGamma , yi , zi ) ) 25 p p . y l i m ([0 , 2 5 5 ] ) 26 27 p p . s h o w () 6. (a) V modulu funkcije ustvarimo funkcijo imMultiscale. 81 Prikazovanje in preslikovanje slik 5.2 Rešitve in odgovori na vprašanja 1 def i m M u l t i s c a l e ( img , r , s ) : 2 o i m g = n p . z e r o s ( i m g . s h a p e ) 3 for i in r a n g e ( len ( r ) - 1) : 4 ind = ( img >= r [ i ]) & ( img <= r [ i + 1]) 5 o i m g [ ind ] = ( s [ i + 1] - s [ i ]) /( r [ i + 1] - r [ i ]) * \ 6 ( img [ ind ] - r [ i ]) + s [ i ] 7 8 r e t u r n o i m g (b) Preizkusimo aproksimacijo nelinearne Gama preslikave z odsekoma linearno preslikavo. Ugotovimo, da lahko nelinearno Gama preslikavo za γ = 2 zadovoljivo apro-ksimiramo z odsekoma linearno preslikavo, ki jo sestavlja 10 odsekov (slika 5.14). Odsek. lin. Odsek. lin. Odsek. lin. Odsek. lin. 200 Gama 200 Gama 200 Gama 200 Gama 100 100 100 100 0 0 0 0 0 200 0 200 0 200 0 200 60 6 1.0 0.2 40 4 0.5 20 0.1 2 0 0 0.0 0.0 0 100 200 0 100 200 0 100 200 0 100 200 (a) 1 odsek (b) 3 odseki (c) 7 odsekov (d) 15 odsekov Slika 5.14: Aproksimacija nelinearne Gama preslike pri γ = 2 z odsekoma linearno preslikavo (prva vrstica) in pripadajoče napake aproksimacije (druga vrstica). 1 g a m m a = 2 2 g a m m a A p p r o x N = [2 , 4 , 8 , 16] 3 N = len ( g a m m a A p p r o x N ) 4 g a m m a A p p r o x I m g = [] 5 g a m m a R e f = f u n k c i j e . i m G a m m a ( Ix , g a m m a ) 6 r G a m m a = n p . l i n s p a c e (0 , 255 , 1 0 0 0 ) 7 s G a m m a = f u n k c i j e . i m G a m m a ( rGamma , g a m m a ) 8 9 p p . f i g u r e () 10 p p . s u p t i t l e ( ’ A p r o k s i m a c i j a g a m a p r e s l i k a v e ( g a m m a = { } ) ’ \ 82 Prikazovanje in preslikovanje slik 5.2 Rešitve in odgovori na vprašanja 11 ’ z o d s e k o m a l i n e a r n o p r e s l i k a v o ’ . f o r m a t ( g a m m a ) ) 12 13 for index , n in e n u m e r a t e ( g a m m a A p p r o x N ) : 14 r = n p . l i n s p a c e (0 .0 , 255 .0 , n ) 15 s = f u n k c i j e . i m G a m m a ( r , g a m m a ) 16 a p p r o x = f u n k c i j e . i m M u l t i s c a l e ( Ix , r , s ) 17 g a m m a A p p r o x I m g . a p p e n d ( a p p r o x ) 18 19 f u n k c i j e . i m S h o w E x ( approx , e x t e n t = I x E x t e n t , 20 s u b p l o t =(3 , N , i n d e x + 1) , 21 t i t l e = ’ Š t. s e g m e n t o v n ={} ’ . f o r m a t ( n ) , 22 v m i n =0 , v m a x = 2 5 5 ) 23 24 p p . s u b p l o t (3 , N , N + i n d e x + 1) 25 p p . t i t l e ( ’ N a p a k a ’ ) 26 p p . i m s h o w ( g a m m a R e f - approx , c m a p = ’ g r a y ’ ) 27 p p . c o l o r b a r () 28 29 p p . s u b p l o t (3 , N , 2* N + i n d e x + 1) 30 p p . p l o t ( r , s , ’. - r ’ , l a b e l = ’ O d s e k . l i n . ’ ) 31 p p . p l o t ( rGamma , sGamma , ’ - - b ’ , l a b e l = ’ G a m a ’ ) 32 p p . l e g e n d () 33 34 p p . s h o w () 7. (a) V modulu funkcije ustvarimo funkcijo imProfile2d. 1 def i m P r o f i l e 2 d ( img , x , y , 2 t1 , t2 , s t e p =1 , o r d e r =1) : 3 t1 = n p . a s a r r a y ( t1 , d t y p e = n p . f l o a t ) 4 t2 = n p . a s a r r a y ( t2 , d t y p e = n p . f l o a t ) 5 s = t2 - t1 6 s = s / n p . l i n a l g . n o r m ( s ) 7 xi = n p . a r a n g e ( t1 [0] , t2 [0] , s [ 0 ] * f l o a t ( s t e p ) ) 8 yi = n p . a r a n g e ( t1 [1] , t2 [1] , s [ 1 ] * f l o a t ( s t e p ) ) 9 op = i n t e r p . i n t e r p 2 ( x , y , img , xi , yi ) 10 11 r e t u r n op , xi , yi Izrišemo diagonalna linijska prereza 2D slike Ix (slika 5.15). 1 p2a , p2ax , p 2 a y = f u n k c i j e . i m P r o f i l e 2 d ( 2 Ix , y , z , 3 [0 .0 , 0 .0 ] , [ y [ -1] , z [ -1]] , 4 s t e p =2 .0 , o r d e r =1) 5 p2b , p2bx , p 2 b y = f u n k c i j e . i m P r o f i l e 2 d ( 6 Ix , y , z 7 [ y [ -1] , 0 .0 ] , [0 .0 , z [ -1]] , 8 s t e p =2 .0 , o r d e r =1) 9 83 Prikazovanje in preslikovanje slik 5.2 Rešitve in odgovori na vprašanja 200 100 0 0 100 200 300 400 Slika 5.15: Diagonalna linijska prereza slike Ix. 10 p p . f i g u r e () 11 f u n k c i j e . i m S h o w E x ( Ix , s u b p l o t =121 , e x t e n t = I x E x t e n t ) 12 p p . p l o t ([0 .0 , y [ -1]] , [0 .0 , z [ -1]] , ’ - r ’ ) 13 p p . p l o t ([ y [ -1] , 0 .0 ] , [0 .0 , z [ -1]] , ’ - g ’ ) 14 p p . s u b p l o t (1 , 2 , 2) 15 p p . p l o t ( p2a , ’ - r ’ ) 16 p p . p l o t ( p2b , ’ - g ’ ) 17 p p . y l i m ([0 , 2 5 5 ] ) 18 p p . s h o w () (b) V modulu funkcije ustvarimo še funkcijo imProfile3d. 1 def i m P r o f i l e 3 d ( img , x , y , z , 2 t1 , t2 , s t e p =1 , o r d e r =1) : 3 t1 = n p . a s a r r a y ( t1 , d t y p e = n p . f l o a t ) 4 t2 = n p . a s a r r a y ( t2 , d t y p e = n p . f l o a t ) 5 s = t2 - t1 6 s = s / n p . l i n a l g . n o r m ( s ) 7 xi = n p . a r a n g e ( t1 [0] , t2 [0] , s [ 0 ] * f l o a t ( s t e p ) ) 8 yi = n p . a r a n g e ( t1 [1] , t2 [1] , s [ 1 ] * f l o a t ( s t e p ) ) 9 zi = n p . a r a n g e ( t1 [2] , t2 [2] , s [ 2 ] * f l o a t ( s t e p ) ) 10 op = i n t e r p . i n t e r p 3 ( x , y , z , img , xi , yi , zi ) 11 12 r e t u r n op , xi , yi , zi Izrišemo diagonalni prerez 3D slike (5.16). 1 p3 , p3x , p3y , p3z = f u n k c i j e . i m P r o f i l e 3 d ( 2 I , x , y , z , 3 [0 .0 , 0 .0 , 0 .0 ] , [ x [ -1] , y [ -1] , z [ -1]] , 4 s t e p =2 .0 , o r d e r =1) 5 6 p p . f i g u r e () 7 p p . p l o t ( p3 ) 8 p p . y l i m ([0 , 2 5 5 ] ) 9 p p . s h o w () 84 Prikazovanje in preslikovanje slik 5.2 Rešitve in odgovori na vprašanja 200 100 0 0 200 400 Slika 5.16: Diagonalni linijski prerez 3D slike z enim krajiščem v koordinatnem izhodišču. 85 Prikazovanje in preslikovanje slik 5.2 Rešitve in odgovori na vprašanja 86 Poglavje 6 Kalibracija in obnova sivinskih vrednosti Sivinske vrednosti biomedicinskih slik, predvsem mikroskopskih in magnetno resonančnih, so zaradi nehomogenosti osvetlitve vzorca in/ali neenakomerne prostorske občutljivosti naprav za zajem slik pogosto prostorsko nehomogene. Nehomogenosti se odražajo v neenakomernem kontrastu in svetlosti istega tkiva, katerega sivinske vrednosti so odvisne od prostorske lege na zajeti sliki. Opisani neželeni pojav imenujemo prostorska nehomogenost sivinskih vrednosti, ki lahko predstavlja veliko težavo pri avtomatski obdelavi, razgradnji in kvantitativni analizi slik. Sivinske nehomogenosti zajete slike g( x, y) lahko pogosto zadovoljivo opišemo z linearnim Slika 6.1: Primera prostorske nehomogenosti sivinskih vrednosti v magnetnoresonančni (levo) in mikroskopski sliki shading_lung.png (desno). modelom prostorske nehomogenosti [7]: g( x, y) = m( x, y) · f ( x, y) + a( x, y) , (6.1) kjer m( x, y) predstavlja multiplikativno, a( x, y) pa aditivno komponento nehomogenosti. Linearno kalibracijo nehomogenosti izvajamo tako, da ocenimo multiplikativno in aditivno komponento nehomogenosti s pomočjo dveh kalibracijskih slik, in sicer svetle slike gB( x, y) in temne slike gD( x, y). Za to potrebujemo dva homogena difuzna kalibra različne svetlosti. Pogosto se zadovoljimo le z enim kalibrom, saj lahko temno sliko zajamemo tako, da izklopimo vse 87 Kalibracija in obnova sivinskih vrednosti 6.1 Naloge in vprašanja svetlobne vire. V primeru kamere temno sliko zajamemo tako, da pokrijemo objektiv ali popolnoma zapremo zaslonko. Zajeta temna slika opisuje prostorsko odvisnost temnega odziva tipala, svetla slika pa njegovo prostorsko odvisno občutljivost ter prostorsko nehomogenost optičnega sistema in vzbujanja (svetila). Komponenti nehomogenosti a( x, y) in m( x, y) nato določimo tako, da temni gD( x, y) in svetli gB( x, y) sliki priredimo konstantni sivinski vrednosti D in B: B = gB( x, y) − a( x, y) m( x, y) , (6.2) D = gD( x, y) − a( x, y) m( x, y) . Iz zgornjih enačb lahko izrazimo aditivno a( x, y) in multiplikativno m( x, y) komponento nehomogenosti kot: a( x, y) = B · gD( x, y) − D · gB( x, y) , B − D (6.3) m( x, y) = gB( x, y) − gD( x, y) . B − D Poljubno zajeto sivinsko sliko g( x, y) nato kalibriramo kot: f ( x, y) = g( x, y) · ( B − D) − B · gD( x, y) + D · gB( x, y) gB( x, y) − gD( x, y) . (6.4) 6.1 Naloge in vprašanja (a) Slika shading_muscle.png. (b) slika shading_dark.png. (c) Slika shading_bright.png. Slika 6.2: Svetlostno nehomogena slika s pripadajočo temno gD in svetlo gB kalibracijsko sliko. 1. Ustvarite funkcijo imShadingCalibrate, ki kalibrira nehomogenost slike img z linearnim modelom ter vrne oceno aditivne ofa in multiplikativne ofm komponente nehomogenosti. Parameter dark ustreza temni kalibracijski sliki gD, parameter bright svetli kalibracijski sliki gB, parametra d in b pa konstantnima sivinskima vrednostima D in B. 1 def i m S h a d i n g C a l i b r a t e ( img , dark , bright , d =0 , b = 2 5 5 ) : 2 ... 3 r e t u r n omg , ofa , ofm 88 Kalibracija in obnova sivinskih vrednosti 6.1 Naloge in vprašanja (a) Izrišite histogram nehomogene slike shading_muscle.png s pripadajočim vzdolžnim sivinski prerezom. (b) Ocenite aditivno in multiplikativno komponento nehomogenosti testne slike s pomo- čjo pripadajočih kalibracijskih slik shading_bright.png ( gB( x, y)) in shading_dark.png ( gD( x, y)). Sivinsko vrednost D postavite na 0, sivinsko vrednost B pa določite tako, da bosta povprečna svetlost nehomogene in obnovljene slike približno enaki. Izrišite histogram in vzdolžni sivinski prerez obnovljene slike. (c) Kako vpliva prostorska nehomogenost na histogram in sivinski prerez slike? 2. Pogosto je kalibracija že dovolj učinkovita, če uporabimo zgolj multiplikativni kalibracijski model g( x, y) = m( x, y) · f( x, y). Na ta način bistveno poenostavimo postopek svetlostne kalibracije, saj potrebujemo le sliko gB( x, y) homogenega kalibracijskega objekta: m( x, y) = gB( x, y) , B (6.5) B f ( x, y) = g( x, y) · gB( x,y) . Kalibracijo je mogoče izvesti tudi z uporabo zgolj aditivnega modela g( x, y) = f( x, y) + a( x, y): a( x, y) = gD( x, y) − D, (6.6) f ( x, y) = g( x, y) − gD( x, y) + D. (a) Nadgradite funkcijo imShadingCalibrate tako, da bo obnova v primeru, ko je vrednost parametra d enaka None, temeljila zgolj na multiplikativni komponenti, ko je vrednost parametra b enaka None, pa zgolj na aditivni komponenti. (b) Obnovite homogenost slike shading_muscle.png z multiplikativnim modelom ter iz-rišite pripadajoči histogram in vzdolžni sivinski prerez obnovljene slike. Oceno multiplikativne komponente nehomogenosti primerjajte z oceno multiplikativne komponente iz prejšnje točke. Sivinsko vrednost B določite tako, da bosta povprečna svetlost nehomogene in obnovljene slike enaki. (c) Ali je kalibracija z aditivnim modelom primerna za testno nehomogeno sivinsko sliko in zakaj? Poleg opisanih postopkov kalibracije lahko prostorsko nehomogenost sivinskih vrednosti odpravimo tudi z retrospektivni postopki, kjer informacijo o prostorski odvisnosti aditivne a( x, y) in multiplikativne m( x, y) komponente nehomogenosti sivinskih vrednosti ocenimo z obdelavo zajete nehomogene slike. 3. Če se na sliki nahajajo zgolj objekti, katerih frekvenčni spekter se ne prekriva s frekvenčnim spektrom svetlostnih nehomogenosti, lahko sliko zgladimo z nizkoprepustnim sitom F tako, da se objekti zlijejo z ozadjem. Dobljena slika predstavlja oceno aditivne komponente nehomogenosti: a( x, y) ≈ F ( g( x, y)) . (6.7) 89 Kalibracija in obnova sivinskih vrednosti 6.1 Naloge in vprašanja (a) Ustvarite funkcijo imShadingFilter, ki obnovi sivinske vrednosti nehomogene slike img ter vrne homogeno sliko oimg in oceno aditivne komponente nehomogenosti of. Za glajenje slike lahko uporabite funkcijo gaussian_filter modula scipy.ndimage. filters, ki filtrira sliko z Gaussovim jedrom standardne deviacije sigma. 1 def i m S h a d i n g F i l t e r ( img , s i g m a ) : 2 ... 3 r e t u r n oimg , of (a) Slika shading_1.png (b) Slika shading_2.png (c) Slika shading_3.png (d) Slika shading_4.png Slika 6.3: Testne slike, ustvarjene z enakim poljem svetlostne nehomogenosti. (b) Ocenite sivinsko nehomogenost testne slike shading_muscle.png. Izrišite obnovljeno sliko, pripadajoči histogram, vzdolžni sivinski prerez ter polje nehomogenosti. Poskrbite, da bosta povprečna vrednost in standardna deviacija sivinskih vrednosti nehomogene in obnovljene slike enaki. (c) Na podoben način obnovite še sivinske vrednosti nehomogene mikroskopske slike shading_lung.png in testnih slik shading_1.png, shading_2.png, shading_3.png ter shading_4.png. Ali lahko s filtriranjem ocenite polje nehomogenosti za vse testne slike? 4. Obnovo prostorske homogenosti z multiplikativno komponento lahko izvedemo s (homomorfnim) filtriranjem v logaritemskem prostoru, kjer multiplikativna komponenta postane aditivna: log ( g( x, y)) = log ( f( x, y) · m( x, y)) = log ( f( x, y)) + log ( m( x, y)) . (6.8) Logaritem multiplikativne komponente ocenimo s filtriranjem logaritma nehomogene slike log ( m( x, y)) = F ∗ log ( g( x, y)). Nato z inverzno transformacijo (eksponent) izračunamo multiplikativno komponento nehomogenosti m( x, y) = e F∗log( g( x,y)). Sledi že opisani postopek obnove homogenosti z multiplikativno komponento: f ( x, y) = g( x, y) · e− F ∗log( g( x,y)) . (6.9) (a) Ustvarite funkcijo imShadingHomomorphic, ki obnovi sivinske vrednosti nehomogene slike img s homomorfnim filtriranjem ter vrne homogeno sliko oimg in oceno multiplikativne komponente nehomogenosti of (e F∗log( g( x,y))). Parameter sigma določa standardno deviacijo Gaussovega filtra F . 1 def i m S h a d i n g H o m o m o r p h i c ( img , s i g m a ) : 2 r e t u r n oimg , of 90 Kalibracija in obnova sivinskih vrednosti 6.1 Naloge in vprašanja (b) Obnovite homogenost slike shading_muscle.png ter izrišite histogram nehomogene in obnovljene slike ter vzdolžna sivinska prereza. Določite ustrezno standardno deviacijo sigma Gaussovega filtra F ter prikažite oceno multiplikativne komponente nehomogenosti. Poskrbite, da bosta povprečna vrednost in standardna deviacija sivinskih vrednosti nehomogene in obnovljene slike enaki. (c) Na podoben način obnovite še sivinske vrednosti nehomogene mikroskopske slike shading_lung.png in testnih slik shading_1.png, shading_2.png, shading_3.png ter shading_4.png. Ali lahko s homomorfnim filtriranjem ocenite polje nehomogenosti za vse testne slike? 91 Kalibracija in obnova sivinskih vrednosti 6.1 Naloge in vprašanja 92 Kalibracija in obnova sivinskih vrednosti 6.2 Rešitve in odgovori na vprašanja 6.2 Rešitve in odgovori na vprašanja Pri odgovorih privzamemo, da se funkcije iz rešitev nahajajo v modulu funkcije, slikovno gradivo pa se nahaja v podmapi poglavje_6. Naprej uvozimo potrebne module, naložimo slike in definiramo pomožne spremenljivke. 1 i m p o r t n u m p y as np 2 f r o m m a t p l o t l i b i m p o r t p y p l o t as pp 3 f r o m PIL i m p o r t I m a g e as im 4 i m p o r t f u n k c i j e 5 6 I = n p . a s a r r a y ( i m . o p e n ( ’ . / p o g l a v j e _ 6 / s h a d i n g _ m u s c l e . p n g ’ ) ) 7 HI , WI = I . s h a p e 8 Id = n p . a s a r r a y ( i m . o p e n ( ’ . / p o g l a v j e _ 6 / s h a d i n g _ d a r k . p n g ’ ) ) 9 Ib = n p . a s a r r a y ( i m . o p e n ( ’ . / p o g l a v j e _ 6 / s h a d i n g _ b r i g h t . p n g ’ ) ) 10 n B i n s = 64 11 12 Il = n p . a s a r r a y ( i m . o p e n ( ’ . / p o g l a v j e _ 6 / s h a d i n g _ l u n g . p n g ’ ) ) 13 HIl , WIl = I l . s h a p e 14 15 Is1 = n p . a s a r r a y ( i m . o p e n ( ’ . / p o g l a v j e _ 6 / s h a d i n g _ 1 . p n g ’ ) ) 16 Is2 = n p . a s a r r a y ( i m . o p e n ( ’ . / p o g l a v j e _ 6 / s h a d i n g _ 2 . p n g ’ ) ) 17 Is3 = n p . a s a r r a y ( i m . o p e n ( ’ . / p o g l a v j e _ 6 / s h a d i n g _ 3 . p n g ’ ) ) 18 Is4 = n p . a s a r r a y ( i m . o p e n ( ’ . / p o g l a v j e _ 6 / s h a d i n g _ 4 . p n g ’ ) ) 19 HIs , WIs = I s 1 . s h a p e 1. Kalibracija svetlostnih nehomogenosti. V modulu funkcije najprej ustvarimo funkcijo imShadingCalibrate. 1 def i m S h a d i n g C a l i b r a t e ( img , d a r k = None , b r i g h t = None , d =0 , b = 2 5 5 ) : 2 img = n p . a s a r r a y ( img , n p . f l o a t ) 3 if d a r k is not N o n e : 4 d a r k = n p . a s a r r a y ( dark , n p . f l o a t ) 5 if b r i g h t is not N o n e : 6 b r i g h t = n p . a s a r r a y ( bright , n p . f l o a t ) 7 8 if b r i g h t is N o n e : 9 ofa = d a r k - d 10 ofm = N o n e ; 11 o i m g = img - d a r k + d 12 13 e l i f d a r k is N o n e : 14 ofa = N o n e 15 ofm = b r i g h t / b 16 o i m g = img * b / b r i g h t 17 18 e l s e : 19 ofa = ( d * d a r k - b * b r i g h t ) / f l o a t ( b - d ) 20 ofm = ( b r i g h t - d a r k ) / f l o a t ( b - d ) 93 Kalibracija in obnova sivinskih vrednosti 6.2 Rešitve in odgovori na vprašanja 21 o i m g = ( img *( b - d ) - b * d a r k + d * b r i g h t ) /( b r i g h t - d a r k ) 22 23 r e t u r n oimg , ofa , ofm (a) Izrišemo nehomogeno sliko shading_muscle.png s pripadajočim histogramom in vzdol- žnim linijskim prerezom (slika 6.4). 200 4000 2000 100 0 0 0 100 200 0 200 400 Slika 6.4: Nehomogena slika s pripadajočim histogramom in vzdolžnim linijskim prerezom. 1 p p . f i g u r e () 2 3 f u n k c i j e . i m S h o w E x ( I , t i t l e = ’ N e h o m o g e n a ’ , s u b p l o t =131 , 4 v m i n =0 , v m a x = 2 5 5 ) 5 p p . p l o t ([0 , WI - 1] ,[ HI //2 , HI //2] , ’ - b ’ ) 6 7 p p . s u b p l o t (1 , 3 , 2) 8 p p . h i s t ( I . f l a t t e n () , nBins , [0 , 256] , n o r m e d = T r u e ) 9 10 p p . s u b p l o t (1 , 3 , 3) 11 p p . p l o t ( I [ int ( HI / / 2 ) ]) 12 p p . y l i m ([0 , 2 5 5 ] ) 13 14 p p . s h o w () (b) Kalibriramo svetlostne nehomogenosti slike shading_muscle.png ter izrišemo kalibri-rano sliko s pripadajočim histogramom in vzdolžnim linijskim prerezom (slika 6.5). 1 Ic , IcA , IcM = f u n k c i j e . i m S h a d i n g C a l i b r a t e ( I , Id , Ib , 0 , 1 9 2 ) 2 3 p p . f i g u r e () 4 5 f u n k c i j e . i m S h o w E x ( Ic , t i t l e = ’ O b n o v l j e n a ’ , s u b p l o t =141 , 6 v m i n =0 , v m a x = 2 5 5 ) 7 p p . p l o t ([0 , WI - 1] ,[ HI //2 , HI //2] , ’ - b ’ ) 8 9 f u n k c i j e . i m S h o w E x ( 10 IcM , t i t l e = ’ M u l t i p l i k a t i v n o p o l j e ’ , s u b p l o t = 1 4 2 ) 11 12 p p . s u b p l o t (1 , 4 , 3) 94 Kalibracija in obnova sivinskih vrednosti 6.2 Rešitve in odgovori na vprašanja 0.015 200 0.010 100 0.005 0.000 0 0 100 200 0 200 400 Slika 6.5: Svetlostno kalibrirana slika z izračunanim multiplikativnim poljem nehomogenosti, histogramom in vzdolžnim linijskim prerezom. 13 p p . h i s t ( I c . f l a t t e n () , nBins , [0 , 256] , n o r m e d = T r u e ) 14 15 p p . s u b p l o t (1 , 4 , 4) 16 p p . p l o t ( Ic [ int ( HI / / 2 ) ]) 17 p p . y l i m ([0 , 2 5 5 ] ) 18 19 p p . s h o w () (c) Prostorska nehomogenost sivinskih vrednosti se odraža v nizkofrekvenčni komponenti linijskega prereza. V histogram vnaša razširitev porazdelitve sivinskih vrednosti, ki pripadajo določenemu tkivu. 2. Svetlostna kalibracija zgolj z multiplikativnim modelom. (a) Glej funkcijo imShadingCalibrate. (b) Kalibriramo sliko shading_muscle.png zgolj s svetlo kalibracijsko sliko (slika 6.6). 1 Ic1 , tmp , I c 1 M = f u n k c i j e . i m S h a d i n g C a l i b r a t e ( 2 I , b r i g h t = Ib , b = 1 9 2 ) 3 4 p p . f i g u r e () 5 f u n k c i j e . i m S h o w E x ( Ic1 , t i t l e = ’ O b n o v l j e n a ’ , s u b p l o t =141 , 6 v m i n =0 , v m a x = 2 5 5 ) 7 p p . p l o t ([0 , WI - 1] ,[ HI //2 , HI //2] , ’ - b ’ ) 8 95 Kalibracija in obnova sivinskih vrednosti 6.2 Rešitve in odgovori na vprašanja 0.015 200 0.010 100 0.005 0.000 0 0 100 200 0 200 400 Slika 6.6: Svetlostno kalibrirana slika z izračunanim multiplikativnim poljem nehomogenosti, histogramom in vzdolžnim linijskim prerezom. 9 f u n k c i j e . i m S h o w E x ( 10 Ic1M , t i t l e = ’ M u l t i p l i k a t i v n o p o l j e ’ , s u b p l o t = 1 4 2 ) 11 12 p p . s u b p l o t (1 , 4 , 3) 13 p p . h i s t ( I c 1 . f l a t t e n () , nBins , [0 , 256] , n o r m e d = T r u e ) 14 15 p p . s u b p l o t (1 , 4 , 4) 16 p p . p l o t ( Ic1 [ int ( HI / / 2 ) ]) 17 p p . y l i m ([0 , 2 5 5 ] ) 18 19 p p . s h o w () (c) Kalibracija slike z aditivnim modelom ni ustrezna, saj je svetlost temne kalibracijske slike zanemarljiva, svetlostna nehomogenost v svetli kalibracijski sliki pa izrazita. 3. Obnova svetlostne homogenosti s filtriranjem. (a) V modulu funkcije ustvarimo funkcijo imShadingFilter ter jo preizkusimo na svetlostno nehomogeni sliki shading_muscle.png. 1 def i m S h a d i n g F i l t e r ( img , s i g m a ) : 2 img = i m g . a s t y p e ( n p . f l o a t ) 3 af = i m G a u s s F i l t 2 d ( img , f l o a t ( s i g m a ) , b o u n d a r y = ’ r e f l e c t ’ ) 4 o i m g = img - af 5 6 r e t u r n oimg , af 96 Kalibracija in obnova sivinskih vrednosti 6.2 Rešitve in odgovori na vprašanja (b) Obnovimo svetlostno homogenost slike shading_muscle.png ter izrišemo obnovljeno sliko, oceno aditivnega polja nehomogenosti, histogram ter vzdolžni linijski prerez (slika 6.7). Uporabimo Gaussov filter σ = 50. 0.010 200 0.005 100 0.000 0 0 100 200 0 200 400 Slika 6.7: Svetlostno obnovljena slika z ocenjenim aditivnim poljem nehomogenosti, pripadajo- čim histogramom in vzdolžnim linijskim prerezom. 1 Ifc , IfA = f u n k c i j e . i m S h a d i n g F i l t e r ( I , s i g m a = 5 0 ) 2 Ifc = ( Ifc - I f c . m e a n () ) / I f c . s t d () * I . s t d () + I . m e a n () 3 4 p p . f i g u r e () 5 6 f u n k c i j e . i m S h o w E x ( Ifc , t i t l e = ’ O b n o v l j e n a ’ , 7 s u b p l o t =141 , v m i n =0 , v m a x = 2 5 5 ) 8 9 f u n k c i j e . i m S h o w E x ( IfA , t i t l e = ’ M u l t i p l i k a t i v n o p o l j e ’ , 10 s u b p l o t = 1 4 2 ) 11 p p . p l o t ([0 , WI - 1] ,[ HI //2 , HI //2] , ’ - b ’ ) 12 13 p p . s u b p l o t (1 , 4 , 3) 14 p p . h i s t ( I f c . f l a t t e n () , nBins , [0 , 256] , n o r m e d = T r u e ) 15 16 p p . s u b p l o t (1 , 4 , 4) 17 p p . p l o t ( Ifc [ int ( HI / / 2 ) ]) 18 19 p p . s h o w () (c) Obnovimo še svetlostno homogenost mikroskopske slike shading_lung.png (slika 6.8) 97 Kalibracija in obnova sivinskih vrednosti 6.2 Rešitve in odgovori na vprašanja ter štirih sintetičnih slik shading_1.png, shading_2.png, shading_3.png in shading_4.png (slika 6.9). 0.0075 200 0.0050 100 0.0025 0.0000 0 0 100 200 0 50 100 150 200 0.010 200 0.005 100 0.000 0 0 100 200 0 50 100 150 200 Slika 6.8: Izvirna in svetlostno obnovljena slika z ocenjenim aditivnim poljem nehomogenosti ter pripadajoča histograma in vzdolžna linijska prereza. 1 Ilfc , I l f A = f u n k c i j e . i m S h a d i n g F i l t e r ( Il , s i g m a = 2 0 ) 2 I l f c = ( I l f c - I l f c . m e a n () ) / I l f c . s t d () * I l . s t d () + I l . m e a n () 3 4 p p . f i g u r e () 5 6 f u n k c i j e . i m S h o w E x ( Ilfc , t i t l e = ’ O b n o v l j e n a ’ , 7 s u b p l o t =141 , v m i n =0 , v m a x = 2 5 5 ) 8 9 f u n k c i j e . i m S h o w E x ( IlfA , t i t l e = ’ A d i t i v n o p o l j e ’ , 10 s u b p l o t = 1 4 2 ) 11 12 p p . p l o t ([0 , WI - 1] ,[ HI //2 , HI //2] , ’ - b ’ ) 13 14 p p . s u b p l o t (1 , 4 , 3) 15 p p . h i s t ( I l f c . f l a t t e n () , nBins , [0 , 256] , n o r m e d = T r u e ) 16 17 p p . s u b p l o t (1 , 4 , 4) 18 p p . p l o t ( I l f c [ int ( HIl / / 2 ) ]) 19 20 21 s i g m a = [7 , 14 , 28 , 56] 22 Is = [ Is1 , Is2 , Is3 , Is4 ] 23 I f s c = [] 24 I f s c A = [] 25 for i in r a n g e (4) : 26 s = Is [ i ] 27 sc , sca = f u n k c i j e . i m S h a d i n g F i l t e r ( s , s i g m a = s i g m a [ i ]) 28 sc = ( sc - s c . m e a n () ) / s c . s t d () * s . s t d () + s . m e a n () 29 I f s c . a p p e n d ( sc ) 30 I f s c A . a p p e n d ( sca ) 98 Kalibracija in obnova sivinskih vrednosti 6.2 Rešitve in odgovori na vprašanja 31 32 p p . f i g u r e () 33 34 f u n k c i j e . i m S h o w E x ( s , t i t l e = ’ I z v i r n a ’ , s u b p l o t =241 , 35 v m i n =0 , v m a x = 2 5 5 ) 36 p p . p l o t ([0 , WIs - 1] ,[ HIs //2 , HIs //2] , ’ - b ’ ) 37 38 p p . s u b p l o t (2 , 4 , 3) 39 p p . h i s t ( s . f l a t t e n () , nBins , [0 , 256] , n o r m e d = T r u e ) 40 41 p p . s u b p l o t (2 , 4 , 4) 42 p p . p l o t ( s [ int ( HIs / / 2 ) ]) 43 44 f u n k c i j e . i m S h o w E x ( sc , t i t l e = ’ O b n o v l j e n a ’ , 45 s u b p l o t =245 , v m i n =0 , v m a x = 2 5 5 ) 46 p p . p l o t ([0 , WIs - 1] ,[ HIs //2 , HIs //2] , ’ - b ’ ) 47 48 f u n k c i j e . i m S h o w E x ( sca , t i t l e = ’ A d i t i v n o p o l j e ’ , 49 s u b p l o t = 2 4 6 ) 50 51 p p . s u b p l o t (2 , 4 , 7) 52 p p . h i s t ( s c . f l a t t e n () , nBins , [0 , 256] , n o r m e d = T r u e ) 53 54 p p . s u b p l o t (2 , 4 , 8) 55 p p . p l o t ( sc [ int ( HIs / / 2 ) ]) 56 57 p p . s h o w () Z večanjem velikosti pravokotnih področij testnih slik narašča tudi napaka pri oceni polja nehomogenosti s postopkom filtriranja. 4. Obnova svetlostne homogenosti s homomorfnim filtriranjem. (a) V modulu funkcije ustvarimo funkcijo imShadingHomomorphic ter jo preizkusimo na svetlostno nehomogeni sliki shading_muscle.png. 1 def i m S h a d i n g H o m o m o r p h i c ( img , s i g m a ) : 2 l o g i m g = n p . l o g ( n p . a s a r r a y ( img , d t y p e = n p . f l o a t ) + 1 .0 ) 3 l o g i m g f = i m G a u s s F i l t 2 d ( 4 logimg , f l o a t ( s i g m a ) , b o u n d a r y = ’ r e f l e c t ’ ) 5 mf = n p . e x p ( l o g i m g f ) - 1 .0 6 o i m g = i m g . a s t y p e ( n p . f l o a t ) / mf 7 8 r e t u r n oimg , mf (b) Obnovimo svetlostno homogenost slike shading_muscle.png ter izrišemo obnovljeno sliko, oceno multiplikativnega polja nehomogenosti, histogram ter vzdolžni linijski prerez (slika 6.10). Uporabimo Gaussov filter σ = 50. 1 Ihfc , I h f M = f u n k c i j e . i m S h a d i n g H o m o m o r p h i c ( I , s i g m a = 5 0 ) 99 Kalibracija in obnova sivinskih vrednosti 6.2 Rešitve in odgovori na vprašanja 0.03 0.04 0.02 0.04 0.02 0.02 0.01 0.02 0.01 0.00 0.00 0.00 0.00 0 100 200 0 100 200 0 100 200 0 100 200 200 200 200 200 100 100 100 100 0 0 0 0 0 100 200 0 100 200 0 100 200 0 100 200 Slika 6.9: Obnovljene sintetične slike s pripadajočimi ocenami aditivnega polja svetlostne nehomogenosti, histogrami in vzdolžnimi linijskimi prerezi. 2 I h f c = ( I h f c - I h f c . m e a n () ) / I h f c . s t d () * I . s t d () + \ 3 I . m e a n () 4 5 p p . f i g u r e () 6 7 f u n k c i j e . i m S h o w E x ( Ihfc , t i t l e = ’ O b n o v l j e n a ’ , 8 s u b p l o t =141 , v m i n =0 , v m a x = 2 5 5 ) 9 10 f u n k c i j e . i m S h o w E x ( IhfM , t i t l e = ’ M u l t i p l i k a t i v n o p o l j e ’ , 11 s u b p l o t =142 , v m i n =0 , v m a x = 2 5 5 ) 12 p p . p l o t ([0 , WI - 1] ,[ HI //2 , HI //2] , ’ - b ’ ) 13 14 p p . s u b p l o t (1 , 4 , 3) 15 p p . h i s t ( I h f c . f l a t t e n () , nBins , [0 , 256] , n o r m e d = T r u e ) 16 17 p p . s u b p l o t (1 , 4 , 4) 18 p p . p l o t ( I h f c [ int ( HI / / 2 ) ]) 19 20 p p . s h o w () (c) Obnovimo še svetlostno homogenost mikroskopske slike shading_lung.png (slika 6.11) 100 Kalibracija in obnova sivinskih vrednosti 6.2 Rešitve in odgovori na vprašanja 0.006 200 0.004 100 0.002 0.000 0 0 100 200 0 200 400 Slika 6.10: Svetlostno obnovljena slika z ocenjenim multiplikativnim poljem nehomogenosti, pripadajočim histogramom in vzdolžnim linijskim prerezom. ter štirih sintetičnih slik shading_1.png, shading_2.png, shading_3.png in shading_4.png (slika 6.12). 0.0075 200 0.0050 100 0.0025 0.0000 0 0 100 200 0 50 100 150 200 0.010 200 0.005 100 0.000 0 0 100 200 0 50 100 150 200 Slika 6.11: Izvirna in svetlostno obnovljena slika z ocenjenim multiplikativnim poljem nehomogenosti, pripadajoča histograma in vzdolžna linijska prereza. 1 Ilhfc , I l h f M = f u n k c i j e . i m S h a d i n g H o m o m o r p h i c ( Il , s i g m a = 2 0 ) 2 I l h f c = ( I l h f c - I l h f c . m e a n () ) / I l h f c . s t d () * I l . s t d () + \ 3 I l . m e a n () 4 5 p p . f i g u r e () 6 101 Kalibracija in obnova sivinskih vrednosti 6.2 Rešitve in odgovori na vprašanja 7 f u n k c i j e . i m S h o w E x ( Ilhfc , t i t l e = ’ O b n o v l j e n a ’ , 8 s u b p l o t =141 , v m i n =0 , v m a x = 2 5 5 ) 9 10 f u n k c i j e . i m S h o w E x ( IlhfM , t i t l e = ’ M u l t i p l i k a t i v n o p o l j e ’ , 11 s u b p l o t =142 , v m i n =0 , v m a x = 2 5 5 ) 12 p p . p l o t ([0 , WIl - 1] ,[ HIl //2 , HIl //2] , ’ - b ’ ) 13 14 p p . s u b p l o t (1 , 4 , 3) 15 p p . h i s t ( I l h f c . f l a t t e n () , nBins , [0 , 256] , n o r m e d = T r u e ) 16 17 p p . s u b p l o t (1 , 4 , 4) 18 p p . p l o t ( I l h f c [ int ( HIl / / 2 ) ]) 19 20 21 s i g m a = [7 , 14 , 28 , 56] 22 Is = [ Is1 , Is2 , Is3 , Is4 ] 23 I h f s c = [] 24 I h f s c M = [] 25 for i in r a n g e (4) : 26 s = Is [ i ] 27 sc , scm = f u n k c i j e . i m S h a d i n g H o m o m o r p h i c ( s , s i g m a = s i g m a [ i ]) 28 sc = ( sc - s c . m e a n () ) / s c . s t d () * s . s t d () + s . m e a n () 29 I h f s c . a p p e n d ( sc ) 30 I h f s c M . a p p e n d ( scm ) 31 32 p p . f i g u r e () 33 34 f u n k c i j e . i m S h o w E x ( s , t i t l e = ’ I z v i r n a ’ , 35 s u b p l o t =241 , v m i n =0 , v m a x = 2 5 5 ) 36 p p . p l o t ([0 , WIs - 1] ,[ HIs //2 , HIs //2] , ’ - b ’ ) 37 38 p p . s u b p l o t (2 , 4 , 3) 39 p p . h i s t ( s . f l a t t e n () , nBins , [0 , 256] , n o r m e d = T r u e ) 40 41 p p . s u b p l o t (2 , 4 , 4) 42 p p . p l o t ( s [ int ( HIs / / 2 ) ]) 43 44 f u n k c i j e . i m S h o w E x ( sc , t i t l e = ’ O b n o v l j e n a ’ , s u b p l o t = 2 4 5 ) 45 p p . p l o t ([0 , WIs - 1] ,[ HIs //2 , HIs //2] , ’ - b ’ ) 46 47 f u n k c i j e . i m S h o w E x ( scm , t i t l e = ’ M u l t i p l i k a t i v n o p o l j e ’ , 48 s u b p l o t =246 , v m i n =0 , v m a x = 2 5 5 ) 49 50 p p . s u b p l o t (2 , 4 , 7) 51 p p . h i s t ( s c . f l a t t e n () , nBins , [0 , 256] , n o r m e d = T r u e ) 52 53 p p . s u b p l o t (2 , 4 , 8) 54 p p . p l o t ( sc [ int ( HIs / / 2 ) ]) 55 102 Kalibracija in obnova sivinskih vrednosti 6.2 Rešitve in odgovori na vprašanja 56 p p . s h o w () 0.06 0.03 0.10 0.10 0.04 0.02 0.05 0.05 0.02 0.01 0.00 0.00 0.00 0.00 0 100 200 0 100 200 0 100 200 0 100 200 200 200 200 200 100 100 100 100 0 0 0 0 0 100 200 0 100 200 0 100 200 0 100 200 Slika 6.12: Obnovljene sintetične slike s pripadajočimi ocenami multiplikativnega polja svetlostne nehomogenosti, histogrami in vzdolžnimi linijskimi prerezi. (d) Z večanjem velikosti pravokotnih področij testnih slik narašča tudi napaka pri oceni polja nehomogenosti s postopkom homomorfnega filtriranja. 103 Kalibracija in obnova sivinskih vrednosti 6.2 Rešitve in odgovori na vprašanja 104 Poglavje 7 Geometrijske preslikave slik Z geometrijskimi preslikavami 2D slik T : R 2 → R 2 in 3D slik T : R 3 → R 3 preslikamo lokacije vseh slikovnih elementov iz ( x, y) ali ( x, y, z) v ( x 0 , y 0) oziroma ( x 0 , y 0 , z 0), pri tem pa ohranimo njihove sivinske vrednosti. Na ta način lahko izvedemo povečavo oziroma pomanjšavo (skaliranje), premik (translacijo), zasuk (rotacijo), pa tudi številne druge linearne in nelinearne geometrijske preslikave slik. Poljubno geometrijsko preslikavo 2D oziroma 3D slike zapišemo kot: ( x 0 , y 0) = T ( x, y) ali ( x 0 , y 0 , z 0) = T ( x, y, z) . (7.1) Linearne preslikave T lahko zapišemo v matrični obliki T . V kolikor želimo tudi translacijo obravnavati kot linearno preslikavo, je potrebno uporabiti homogene koordinate ( x, y, 1) oziroma ( x, y, z, 1). Med linearnimi preslikavami je najbolj splošna afina preslikava, ki omogoča poljubno skaliranje, translacijo, rotacijo in strig. Afina preslikava je v 2D določena s 6, v 3D pa z 12 parametri:                 x 0 x a x x 0 x a 11 a 12 a 13 tx 11 a 12 tx x  y 0   y  a 21 a 22 a 23 ty  y  y 0 = T  y =  a            21 a 22 ty y ali = T = , (7.2)                 1 1 0 0 1 1 z 0 z a z      31 a 32 a 33 ty   1 1 0 0 0 1 1 kjer parametri tx, ty, tz določajo translacijo slik v x, y, z smeri, parametri aij pa skaliranje, rotacijo in strig. Matriko afine preslikave Tafina lahko sestavimo z zaporednim matričnim množenje homogenih matrik elementarnih preslikav v želenem vrstnem redu (slika 7.1): Tafina = Tstrig · Trot · Ttrans · Tskal. (7.3) V praksi se pogosto uporabljata toga preslikava, ki jo dobimo s kompozitumom rotacijske in translacijske elementarne preslikave, in podobnostna preslikava, ki jo dobimo s kompozitumom toge preslikave in skaliranja. Poleg linearnih se uporabljajo tudi nelinearne preslikave. Med njimi si bomo podrobneje ogledali projektivno preslikavo, ki je v 2D določena z 8, v 3D pa s 15 parametri. Projektivno preslikavo zapišemo z nehomogeno matriko (slika 7.3). Pri preslikavah digitalnih slik se diskretni slikovni elementi 2D referenčne slike ( xi, yj) preslikajo na nove lokacije T ( xi, yj) = ( x 0 , y 0 ), ki v splošnem ne sovpadajo z diskretno mrežo vzorčnih točk preslikane i j 105 Geometrijske preslikave slik 7.1 Naloge in vprašanja (a) Strig Tstrig (b) Rotacija Trot (c) Translacija Ttrans (d) Skaliranje Tskal  1        gxy 0 cos( α) − sin( α) 0 1 0 tx kx 0 0  g        yx 1 0 sin( α) cos( α) 0 0 1 ty 0 ky 0         0 0 1 0 0 1 0 0 1 0 0 1  1 g      xy gxz 0 1 0 0 tx kx 0 0 0  gyx 1 gyz 0 0 1 0 ty  0 ky 0 0   T      g  x · Ty · Tz 0 0 1 t   0 0 k   zx gzy 1 0  z   z 0 0 0 0 1 0 0 0 1 0 0 0 1 Slika 7.1: Afina preslikava 2D in 3D slik. cos( γ) − sin( γ) 0 0  cos( β) 0 sin( β) 0 1 0 0 0  sin( γ) cos( γ) 0 0  0 1 0 0 0 cos( α) − sin( α) 0        0 0 1 0 − sin( β) 0 cos( β) 0 0 sin( α) cos( α) 0       0 0 0 1 0 0 0 1 0 0 0 1 (a) Tz (b) Ty (c) Tx Slika 7.2: Homogene matrike, ki opisujejo 3D rotacijo okoli x, y in z koordinatnih osi. slike ( un, vm). V točkah ( um, vn) je zato potrebno določiti sivinske vrednosti z interpolacijo. Ker pa se točke ( x, y) v splošnem preslikajo na poljubno diskretno mrežo ( x 0 , y 0 ), lahko tudi i j neortogonalno, postane postopek interpolacije zelo zapleten, zato pri geometrijskem preslikova-nju slik uporabljamo inverzno preslikavo T −1( um, vn) = ( u 0 ), ki ohrani referenčno sliko na m, v 0 n pravokotni diskretni mreži točk (slika 7.4). 7.1 Naloge in vprašanja 1. Ustvarite funkcijo transformAffine2d, ki zgradi transformacijsko matriko T poljubne 2D afine geometrijske preslikave, kjer je scale niz parametrov skaliranja kx in ky, trans niz parametrov translacije tx in ty, rot kot rotacije α v radianih in shear niz parametrov striga gx in gy. Matrično množenje najenostavneje izvedemo s funkcijo dot modula numpy. 1 def t r a n s f o r m A f f i n e 2 d ( s c a l e =[1 .0 , 1 .0 ] , t r a n s =[0 .0 , 0 .0 ] , 106 Geometrijske preslikave slik 7.1 Naloge in vprašanja x 0 = a 11 x + a 12 y + a 13 z + tx pxx + pyy + pzz + 1 x 0 = a 11 x + a 12 y + tx y 0 = a 21 x + a 22 y + a 23 z + ty p pxx + pyy + pzz + 1 xx + py y + 1 y 0 = a 21 x + a 22 y + ty z 0 = a 31 x + a 32 y + a 33 z + tz p pxx + pyy + pzz + 1 xx + py y + 1             u a x u a 11 a 12 a 13 tx 11 a 12 tx x  v   a   y  v =  a    21 a 22 a 23 ty 21 a 22 ty y   =            w  a   z f p 31 a 32 a 33 tz x py 1 1       f px py pz 1 1 x 0 = u f x 0 = u f y 0 = v f y 0 = v f z 0 = w f Slika 7.3: Projektivna preslikava 2D in 3D slik. ( ', ') ( x y x , ) i j ( , ) i yj um vn Neposredna preslikava T(x , ) = ( ', ') i yj xi yj Interpoliramo v točkah (u , ) m vn Znane sivine (u ', ') m vn Iskane sivine (x , ) i yj (u , ) m vn Inverzna preslikava T -1(u , ) = ( ', ') m vn um vn Interpoliramo v točkah (u ', ') m vn Slika 7.4: Preslikave slikovnih elementov digitalnih slik. 107 Geometrijske preslikave slik 7.1 Naloge in vprašanja 2 rot =0 .0 , s h e a r =[0 .0 , 0 .0 ]) : 3 ... 4 r e t u r n T (a) Ustvarite funkcijo ptTransform2d, ki s poljubno afino ali projektivno transformacijo preslika set točk (x, y) v (ox, oy). Ko je vrednost parametra inverse enaka True, funkcija preslika točke z inverzom transformacije T. Inverz transformacijske matrike lahko robustno izračunamo z reševanjem linearnega sistema enačb, in sicer s funkcijo solve modula numpy.linalg. 1 def p t T r a n s f o r m 2 d ( T , x , y , i n v e r s e = F a l s e ) : 2 ... 3 r e t u r n ox , oy (b) Ustvarite pravokotno polje referenčnih točk: 1 Y , X = m e s h g r i d ( n p . a r a n g e (9) , n p . a r a n g e ( 1 2 ) , i n d e x i n g = ’ ij ’ ) Preizkusite delovanje funkcij transformAffine2d ter ptTransform2d tako, da set referenčnih točk rotirate za 10◦, premaknete za [10 , 1], skalirate s faktorjem [0 . 5 , 0 . 5] in strižete s [0 . 25 , 0 . 5]. Preizkusite naštete transformacije posamično in vse hkrati. S funkcijo plot modula matplotlib.pylot na isti graf izrišite referenčno (uporabite oznake ’xr’) in transformirano (uporabite oznake ’xb’) množico točk. 2. Ustvarite funkcijo imTransform2d, ki preslika vhodno sliko s poljubno afino ali projektivno preslikavo T in vrne transformirano sliko oimg. Ko je vrednost parametra expand enaka ’same’ naj se definicijsko območje slike ohrani, ko je ’crop’ naj definicijsko območje obsega celotno transformirano sliko, ko je ’full’ pa celotno transformirano sliko in definicijsko območje vhodne slike img. Parameter center naj določa koordinatno izhodišče preslikave. Vektorja točk x in y določata koordinatni sistem slike. Ko sta vrednosti vektorjev x in y enaki None, naj točka (0 . 0 , 0 . 0) predstavlja zgornje levo krajišče slike, velikost slikovnega elementa pa naj bo 1 × 1. Sivinske vrednosti transformirane slike interpolirajte s funkcijo interp2 modula interp, red interpolacije pa naj bo določen s parametrom order. 1 def i m T r a n s f o r m 2 d ( img , T , x = None , y = None , c e n t e r =(0 .0 , 0 .0 ) , 2 o r d e r =1 , e x p a n d = ’ s a m e ’ ) : 3 ... 4 r e t u r n o i m g (a) Preizkusite delovanje funkcije imTransform2d za različne afine preslikave. Uporabite sliko preslikave_ct.png. (b) Izvedite rotacijo slike okoli geometričnega središča slike. Rešitev udejanite v obliki funkcije imRotate2d. Parameter angle naj določa kot rotacije v radianih, preostali parametri pa naj imajo enak pomen kot pri funkciji imTransform2d. 1 def i m R o t a t e 2 d ( img , angle , o r d e r =1 , e x p a n d = ’ s a m e ’ ) : 2 ... 3 r e t u r n o i m g 108 Geometrijske preslikave slik 7.2 Rešitve in odgovori na vprašanja 7.2 Rešitve in odgovori na vprašanja Pri odgovorih privzamemo, da se funkcije iz rešitev nahajajo v modulu funkcije, slikovno gradivo pa se nahaja v podmapi poglavje_7. Naprej uvozimo potrebne module, naložimo slike in definiramo pomožne spremenljivke. 1 i m p o r t n u m p y as np 2 f r o m m a t p l o t l i b i m p o r t p y p l o t as pp 3 f r o m PIL i m p o r t I m a g e as im 4 i m p o r t f u n k c i j e 5 6 I = n p . a r r a y ( i m . o p e n ( ’ . / p o g l a v j e _ 7 / p r e s l i k a v e _ c t . p n g ’ ) ) 7 fi = 1 0 / 1 8 0 * n p . p i 1. V modulu funkcije ustvarimo funkcijo transformAffine2d. 1 def t r a n s f o r m A f f i n e 2 d ( s c a l e =[1 .0 , 1 .0 ] , t r a n s =[0 .0 , 0 .0 ] , 2 rot =0 .0 , s h e a r =[0 .0 , 0 .0 ]) : 3 4 fi = rot 5 6 S = n p . a r r a y ([[ s c a l e [0] , 0 , 0] , 7 [0 , s c a l e [1] , 0] , 8 [0 , 0 , 1 .0 ]] , ’ f l o a t ’ ) 9 10 T = n p . a r r a y ([[1 , 0 , t r a n s [0]] , 11 [0 , 1 , t r a n s [1]] , 12 [0 , 0 , 1 .0 ]] , ’ f l o a t ’ ) 13 14 R = n p . a r r a y ([[ n p . c o s ( fi ) , - n p . s i n ( fi ) , 0] , 15 [ n p . s i n ( fi ) , n p . c o s ( fi ) , 0] , 16 [0 , 0 , 1 .0 ]] , ’ f l o a t ’ ) 17 18 H = n p . a r r a y ([[1 , s h e a r [0] , 0] , 19 [ s h e a r [1] , 1 , 0] , 20 [0 , 0 , 1 .0 ]] , ’ f l o a t ’ ) 21 22 r e t u r n n p . d o t ( H , R ) . d o t ( T ) . d o t ( S ) (a) V modulu funkcije ustvarimo še funkcijo ptTransform2d. 1 def p t T r a n s f o r m 2 d ( T , x , y , i n v e r s e = F a l s e ) : 2 x = n p . a s a r r a y ( x , d t y p e = n p . f l o a t ) 3 y = n p . a s a r r a y ( y , d t y p e = n p . f l o a t ) 4 T = n p . a s a r r a y ( T ) 5 R = n p . v s t a c k ( 6 ( x . f l a t t e n () , 7 y . f l a t t e n () , 8 n p . o n e s ([ x . s i z e ]) ) 109 Geometrijske preslikave slik 7.2 Rešitve in odgovori na vprašanja 9 ) 10 if i n v e r s e : 11 Rt = n p . l i n a l g . s o l v e ( T , R ) 12 13 e l s e : 14 Rt = n p . d o t ( T , R ) 15 16 ox , oy = Rt [0 , :]/ Rt [ -1 , :] , Rt [1 , :]/ Rt [ -1 , :] 17 o x . s h a p e , o y . s h a p e = x.shape , y . s h a p e 18 19 r e t u r n ox , oy (b) Preverimo delovanje funkcij transformAffine2d in ptTransform2d (slika 7.5). 1 Y , X = n p . m e s h g r i d ( 2 n p . a r a n g e (9) , n p . a r a n g e ( 1 2 ) , i n d e x i n g = ’ ij ’ ) 3 T1 = f u n k c i j e . t r a n s f o r m A f f i n e 2 d ( 4 s c a l e =[0 .5 , 0 .5 ] , t r a n s =[10 , 1] , 5 rot = fi , s h e a r =[0 .25 , 0 .5 ]) 6 Xt1 , Yt1 = f u n k c i j e . p t T r a n s f o r m 2 d ( T1 , X , Y ) 7 8 p p . f i g u r e () 9 p p . p l o t ( X . f l a t t e n () , Y . f l a t t e n () , ’ rx ’ , 10 l a b e l = ’ R e f e r e n č ne ’ ) 11 p p . p l o t ( X t 1 . f l a t t e n () , Y t 1 . f l a t t e n () , ’ bx ’ , 12 l a b e l = ’ P r e s l i k a n e ’ ) 13 p p . l e g e n d ( loc = ’ u p p e r l e f t ’ ) 14 p p . s h o w () 15 Referenčne Preslikane 10 5 0 0 5 10 15 Slika 7.5: Mreža referenčnih in preslikanih točk za podano afino transformacijo. 2. V modulu funkcije ustvarimo funkcijo imTransform2d. 1 def i m T r a n s f o r m 2 d ( img , T , x = None , y = None , c e n t e r =(0 .0 , 0 .0 ) , 2 o r d e r =1 , e x p a n d = ’ s a m e ’ ) : 3 H , W = i m g . s h a p e 110 Geometrijske preslikave slik 7.2 Rešitve in odgovori na vprašanja 4 if x is N o n e : 5 x = n p . a r a n g e ( W ) - c e n t e r [0] 6 if y is N o n e : 7 y = n p . a r a n g e ( H ) - c e n t e r [1] 8 9 dx , dy = x [1] - x [0] , y [1] - y [0] 10 11 if e x p a n d == ’ s a m e ’ : 12 xmin , x m a x = x . m i n () , x . m a x () 13 ymin , y m a x = y . m i n () , y . m a x () 14 15 e l i f e x p a n d in [ ’ f u l l ’ , ’ c r o p ’ ]: 16 # oglišča referenčne slike v preslikani sliki določajo meje razširitve 17 etx , ety = p t T r a n s f o r m 2 d ( t , 18 [ x [0] , x [0] , x [ -1] , x [ -1]] , 19 [ y [0] , y [ -1] , y [0] , y [ -1]]) 20 21 xmin , x m a x = n p . f l o o r ( etx ) . m i n () , n p . f l o o r ( etx ) . m a x () 22 ymin , y m a x = n p . c e i l ( ety ) . m i n () , n p . c e i l ( ety ) . m a x () 23 24 if e x p a n d == ’ f u l l ’ : 25 x m i n = min ( x . m i n () , x m i n ) 26 x m a x = min ( x . m a x () , x m a x ) 27 y m i n = min ( y . m i n () , y m i n ) 28 y m a x = min ( y . m a x () , y m a x ) 29 30 xt = n p . a r a n g e ( xmin , x m a x + dx , dx ) 31 yt = n p . a r a n g e ( ymin , y m a x + dy , dy ) 32 Yt , Xt = n p . m e s h g r i d ( yt , xt , i n d e x i n g = ’ ij ’ ) 33 Xi , Yi = p t T r a n s f o r m 2 d ( T , Xt , Yt , i n v e r s e = T r u e ) 34 35 o i m g = i n t e r p . i n t e r p 2 ( x , y , i m g . a s t y p e ( n p . f l o a t ) , Xi , Yi ) 36 37 r e t u r n o i m g (a) Izvirna slika (b) Primer afine transformacije. (c) Primer rotacije. Slika 7.6: Primera afine trasformacije slike preslikave_ct.png. (a) Preverimo delovanje funkcije imTransform2d (slika 7.6b). 111 Geometrijske preslikave slik 7.2 Rešitve in odgovori na vprašanja 1 It = f u n k c i j e . i m T r a n s f o r m 2 d ( I , T1 ) (b) V modulu funkcije ustvarimo še funkcijo imRotate2d. 1 def i m R o t a t e 2 d ( img , angle , o r d e r =1 , e x p a n d = ’ s a m e ’ ) : 2 H , W = i m g . s h a p e 3 x , y = n p . a r a n g e ( W ) , n p . a r a n g e ( H ) 4 x -= x . m e a n () 5 y -= y . m e a n () 6 T = t r a n s f o r m A f f i n e 2 d ( rot = a n g l e ) 7 8 r e t u r n i m T r a n s f o r m 2 d ( img , T , x , y , 9 e x p a n d = expand , o r d e r = o r d e r ) Preverimo še delovanje funkcije inRotate2d (slika 7.6c). 1 Ir = f u n k c i j e . i m R o t a t e 2 d ( I , fi ) 2 3 p p . f i g u r e () 4 5 f u n k c i j e . i m S h o w E x ( I , s u b p l o t =131 , t i t l e = ’ I z v i r n a ’ ) 6 f u n k c i j e . i m S h o w E x ( It , s u b p l o t =132 , t i t l e = ’ T r a n s f o r m i r a n a ’ ) 7 f u n k c i j e . i m S h o w E x ( Ir , s u b p l o t =133 , t i t l e = ’ R o t i r a n a ’ ) 8 9 p p . s h o w () 112 Poglavje 8 Geometrijska kalibracija slik S postopkom geometrijske kalibracije slikovnega sistema zagotovimo konsistentno absolutno velikost slikovnega elementa, ki je v splošnem lahko odvisna od lege na sliki (projekcija) in dodatno popačena zaradi optičnih aberacij, med katerimi so najpogostejše radialne distorzije tipa sodček in blazinica. Po izvedeni geometrijski kalibraciji slikovnega sistema lahko enostavno izvajamo meritve dimenzij, ploščin in volumnov objektov na slikah v absolutnih enotah (npr. mm, mm2, mm3). Za geometrijsko kalibracijo 2D slik uporabljamo kalibre z dobro definiranimi periodič- nimi geometričnimi strukturami, kot so šahovnica, mreža tankih črt ali polje točk (slika 8.1). S postopkom kalibracije geometrijsko poravnamo strukture zajete f( u, v) in referenčne g( x, y) (a) Šahovnica (b) Mreža črt (c) Polje točk Slika 8.1: Primeri kalibracijskih vzorcev. slike kalibracijskega objekta (slika 8.2). V ta namen lahko uporabimo celotno slikovno informacijo ali pa izluščimo korespondenčne pare točk referenčne in kalibracijske slike ter s pomočjo njih določimo parametre geometrijske preslikave (poravnave) tako, da se preslikane točke referenčne slike čim bolje ujemajo s korespondenčnimi točkami kalibracijske slike in obratno. Glede na število parov korespondenčnih točk in vrsto preslikave lahko točke preslikamo tako, da se popolnoma prekrivajo, tj. T ( xi, yj) = ( ui, vj), kar imenujemo interpolacijska poravnava, ali pa tako, da se točke le približno prekrijejo, tj. T ( xi, yj) ≈ ( ui, vj), kar imenujemo aproksimacijska poravnava. 113 Geometrijska kalibracija slik 8.1 Toga poravnava g (x, y) f (u, v) T(xi, yj) = (xi', yj') T -1(um, vn) = (um', vn') (xi, yj) (um, vn) Slika 8.2: Geometrijska kalibracija s poravnavo struktur zajete in referenčne slike. 8.1 Toga poravnava Toga poravnava je vedno aproksimacijska, saj že zahtevano minimalno število parov korespondenčnih točk vodi do predoločenega sistema enačb, tako da dobimo več enačb kot je neznanih parametrov. Za določitev parametrov 2D toge preslikave potrebujemo vsaj K ≥ 2 parov korespondenčnih točk, preslikavo pa določimo z minimizacijo povprečne kvadratne evklidske razdalje E med točkami: 1 K−1 X E = k Ttoga( xk, yk) − ( uk, vk)k2 , K k=0 (8.1) 1 K−1 X E = ( xk cos α − yk sin α + tx − uk)2 + ( xk sin α + yk cos α + ty − vk)2 , K k=0 ki jo odvajamo po parametrih tx, ty in α ter odvode postavimo na nič: ∂E 2 K−1 = X (( xk cos α − yk sin α + tx − uk)) = 2(¯ x cos α − ¯ y sin α + tx − ¯ u) = 0 , ∂tx K k=0 ∂E 2 K−1 = X (( xk sin α + yk cos α + ty − vk)) = 2(¯ x sin α + ¯ y cos α + ty − ¯ v) = 0 , ∂ty K k=0 ∂E 2 K−1 = X (( x (8.2) k cos α − yk sin α + tx − uk) (− xk sin α − yk cos α)) + ∂α K k=0 2 K−1 X (( xk sin α + yk cos α + ty − vk) ( xk cos α − yk sin α)) K k=0 =2 ( xu sin α + yu cos α − xv cos α + yv sin α) − 2 tx (¯ x sin α + ¯ y cos α) + 2 ty (¯ x cos α − ¯ y sin α) = 0 . 114 Geometrijska kalibracija slik 8.2 Afina poravnava Rešitev sistema enačb je: tx = ¯ u − ¯ x cos( α) + ¯ y sin( α) , ty = ¯ v − ¯ x sin( α) − ¯ y cos( α) , (8.3) α = − arctan( yu − xv − ¯ y · ¯ u + ¯ x · ¯ v ) , xu + yv − ¯ x · ¯ u − ¯ y · ¯ v kjer elementi s črto označujejo povprečne vrednosti: 1 K−1 1 K−1 ¯ X X x = xk, ¯ y = yk, K K k=0 k=0 1 K−1 1 K−1 ¯ X X u = uk, ¯ v = vk, K K k=0 k=0 (8.4) 1 k= K−1 1 k= K−1 X X xu = xkuk, yu = ykuk, K K k=0 k=0 1 k= K−1 1 k= K−1 X X xv = xkvk, yv = ykvk. K K k=0 k=0 8.2 Afina poravnava Afina poravnava je v 2D enolično določena s tremi ( K = 3) pari korespondenčnih točk ( ui, vi) in ( xi, yj):          −1 u a 11 a 12 tx x u 1 u 2 u 3 x 1 x 2 x 3  v =  a        21 a 22 ty y ⇒ Tafina = v 1 v 2 v 3 y 1 y 2 y 3 . (8.5)           1 0 0 1 1 1 1 1 1 1 1 2D afino aproksimacijsko poravnavo pa lahko uporabimo takrat, ko poznamo več kot tri pare korespondenčnih točk ( K > 3). V tem primeru dobimo predoločen sistem enačb, zato lahko korespondenčne točke poravnamo le približno (aproksimacijsko). To storimo tako, da minimiziramo povprečno kvadratno evklidsko razdaljo E med korespondenčnimi točkami: 1 K−1 X E = k Tafina( xk, yk) − ( uk, vk)k2 , K k=0 (8.6) 1 K−1 X E = ( xka 11 + yka 12 + tx − uk)2 + ( xka 21 + yka 22 + ty − vk)2 . K k=0 Optimalne vrednosti neznanih parametrov preslikave dobimo tako, da odvode povprečne kvadratne evklidske razdalje po vseh parametrih postavimo na nič, in s tem dobimo sledeči sistem 115 Geometrijska kalibracija slik 8.2 Afina poravnava linearnih enačb za parametre preslikave: ∂E 2 K−1 = X ( xka 11 + yka 12 + tx − uk) xk = 2 ( xxa 11 + xya 12 + xtx − xu) = 0 , ∂a 11 K k=0 ∂E 2 K−1 = X ( xka 11 + yka 12 + tx − uk) yk = 2 ( xya 11 + yya 11 + ytx − yu) = 0 , ∂a 12 K k=0 ∂E 2 K−1 = X ( xka 11 + yka 12 + tx − uk) = 2 ( xa 11 + ya 11 + tx − u) = 0 , ∂tx K k=0 (8.7) ∂E 2 K−1 = X ( xka 21 + yka 22 + ty − vk) xk = 2 ( xxa 21 + xya 22 + xty − xv) = 0 , ∂a 21 K k=0 ∂E 2 K−1 = X ( xka 21 + yka 22 + ty − vk) yk = 2 ( xya 21 + yya 22 + yty − yv) = 0 , ∂a 22 K k=0 ∂E 2 K−1 = X ( xka 21 + yka 22 + ty − vk) = 2 ( xa 21 + ya 22 + ty − v) = 0 . ∂ty K k=0 Elementi s črto označujejo povprečne vrednosti: 1 K−1 1 K−1 ¯ X X x = xk, ¯ y = yk, K K k=0 k=0 1 K−1 1 K−1 X X xx = x 2 yy = y 2 K k , K k , k=0 k=0 1 K−1 1 K−1 ¯ X X u = uk, ¯ v = vk, (8.8) K K k=0 k=0 1 k= K−1 1 k= K−1 X X xu = xkuk, yu = ykuk, K K k=0 k=0 1 k= K−1 1 k= K−1 X X xv = xkvk, yv = ykvk. K K k=0 k=0 Zgornji sistem enačb lahko preoblikujemo v pregledno matrično obliko:  xx xy x 0 0 0  a    11 xu  xy yy y 0 0 0  a 12  yu        x y 1 0 0 0  tx   u      =   . (8.9)  0 0 0 xx xy x  a   xv    21    0 0 0 xy yy y  a   yv    22   0 0 0 x y 1 ty v 116 Geometrijska kalibracija slik 8.3 Projektivna poravnava 8.3 Projektivna poravnava Projektivno preslikavo Tprojektivna smo spoznali že v poglavju 7. Njene parametre lahko dolo- čimo s postopkom optimizacije, ki poišče takšne vrednosti parametrov preslikave, pri katerih je vrednost kvadratne evklidske razdalje E med podanimi korespondenčnimi točkami minimalna: 1 K−1 X E = k( uk, vk) − Tprojektivna( xk, yk)k2 , K (8.10) k=0 Tprojektivna = arg min( E) . Za iskanje optimalnih vrednosti parametrov projektivne preslikave bomo uporabili optimizacijsko funkcijo fmin modula scipy.optimize, ki poišče minimum večrazsežne funkcije. V našem primeru bomo iskali minimum funkcije E (enačba 8.10). Uporabo funkcije fmin za iskanja minimuma enostavne dvoparametrične konveksne funkcije f ( x, y) = x 2 + y 2, ilustrira sledeči primer. 1 f r o m s c i p y . o p t i m i z e i m p o r t f m i n 2 3 # funkcija, katere minimum iščemo z fmin 4 def fun ( x ) : 5 f = x [ 0 ] * * 2 + x [ 1 ] * * 2 6 # izpišemo parametre in funkcijsko vrednost v vsaki iteraciji 7 p r i n t ( f , x ) 8 r e t u r n f 9 10 # začetni približek parametrov funkcije 11 x0 = (1 .0 , 1 .0 ) 12 # poiščemo minimum funkcije 13 x = f m i n ( fun , x0 ) 14 # izpišemo ocenjene vrednosti parametrov funkcije v njenem minimumu 15 p r i n t ( ’ M i n i m u m f u k c i j e x * x + y * y : ’ ) 16 p r i n t ( ’ x = ’ , x [ 0 ] ) 17 p r i n t ( ’ y = ’ , x [ 1 ] ) Pri funkcijah, ki izkazujejo več lokalnih minimumov, je rezultat optimizacije odvisen od vrednosti začetnega približka. Tako je pri funkciji f ( x) = sin x + sin 10 x (slika 8.3), ki na intervalu 3 [2 , 8] izkazuje tri lokalne minimume, rezultat optimizacije odvisen od vrednosti začetnega približka x 0. Z začetnimi približki x 0 = 2 , 8, x 0 = 6 , 0 in x 0 = 7 , 3 postopek optimizacije vsakokrat zaključimo v drugem/najbližjem lokalnem minimumu funkcije f( x). 8.4 Odprava radialnih distorzij V praksi se za geometrijsko kalibracijo slikovnih sistemov pogosto uporablja afini ali projektivni model geometrijske preslikave, po potrebi pa še ustrezni model za odpravo radialnih distorzij tipa sodček in blazinica (slika 8.4). Za ta namen lahko uporabimo Brawnov model radialnih 117 Geometrijska kalibracija slik 8.4 Odprava radialnih distorzij Funkcija f (x) = sin(x) + sin( 10 x) 3 2 zač. pribl. x0 = 2,8 rezultat za x0 = 2,8 1 zač. pribl. x0 = 6,0 rezultat za x0 = 6,0 )(x 0 zač. pribl. x0 = 7,3 f rezultat za x0 = 7,3 −1 −2 2 4 6 8 10 x Slika 8.3: Potek in končni rezultat optimizacije funkcije f ( x) = sin x + sin 10 x v odvisnosti 3 od vrednosti začetnega približka x 0. distorzij, ki je določen s koordinatami središča distorzij ( xc, yc) ter utežmi radialnih funkcij Ki: ux = xc + ( x − xc)(1 + K 1 r 2 + K 2 r 4 + ... ) , vy = yc + ( y − yc)(1 + K 1 r 2 + K 2 r 4 + ... ) , q r = ( x − x (8.11) c)2 + ( y − yc)2) ( xc, yc) − koordinate središča radialnih distorzij Kn − uteži radialnih funkcij Kalibracijo izvedemo tako, da najprej opravimo transformacijo z modelom radialnih distorzij in x u (u , ) x vy (x, y) r (x , ) c yc y v Slika 8.4: Radialne distorzije 118 Geometrijska kalibracija slik 8.5 Naloge in vprašanja šele nato uporabimo projektivno preslikavo. Ker je Brawnov model radialnih distorzij nelinea-ren, je za izračun parametrov modela potrebno uporabiti optimizacijski postopek, ki minimizira ustrezno kriterijsko funkcijo, npr. povprečno kvadratno evklidsko razdaljo med izbranimi korespondenčnimi točkami. V ta namen lahko uporabimo že omenjeno optimizacijsko funkcijo fmin modula scipy.optimize 8.5 Naloge in vprašanja (a) cal_barrel.png (b) cal_projective.png Slika 8.5: Sliki kalibracijskega objekta. 1. Ustvarite funkcijo transformEstimate2D za določanje parametrov geometrijskih preslikav, kjer x in y ter u in v določajo koordinate korespondenčnih točk, parameter kind pa tip aproksimacijske preslikave, ’rigid’ za togo, ’affine’ za afino ter ’projective’ za projektivno. Pri tem si pomagajte s funkcijo fmin modula scipy.optimize. Ko je vrednost parametra animate=True, v skupni graf izrišite referenčne in preslikane točke v vsaki iteraciji izračuna parametrov aproksimacijske projektivne preslikave. Parametre projektivne aproksimacijske preslikave določite tako, da neposredno minimizirate povprečno vrednost kvadratne evklidske razdalje med korespondenčnimi točkami. Začetne vrednosti parametrov projektivne aproksimacijske preslikave aproksimirajte s parametri afine aproksimacijske preslikave. Funkcija naj vrne izračunano aproksimacijsko preslikavo T (numpy polje velikosti 3 × 3) in koren povprečne kvadratne evklidske razdalje med korespondenčnimi točkami err. 1 def t r a n s f o r m E s t i m a t e 2 D ( x , y , u , v , k i n d = ’ r i g i d ’ , a n i m a t e = F a l s e ) : 2 ... 3 r e t u r n T , err 2. Naložite sliko cal_projective.png (slika 8.5) kalibracijskega objekta ter s pomočjo nekaj izbranih korespondenčnih točk izračunajte parametre aproksimacijske toge poravnave med kalibracijsko in referenčno sliko kalibracijskega objekta. Predpostavite, da stranice posameznih kvadratnih področij kalibracijskega objekta merijo 1 mm. Prikažite sliko kalibracijskega objekta pred in po transformaciji z izračunano aproksimacijsko preslikavo. 119 Geometrijska kalibracija slik 8.5 Naloge in vprašanja Kalibracijo izvedite tako, da bo na kalibrirani sliki velikost slikovnega elementa znašala 0 , 02 mm. (a) Izračunajte parametre aproksimacijske afine preslikave, ki poravnajo naloženo sliko z referenčno sliko kalibracijskega objekta. Določite parametre afine interpolacijske preslikave tako, da izberete tri primerne korespondenčne točke. Prikažite sliko kalibracijskega objekta pred in po transformaciji z izračunano aproksimacijsko afino preslikavo. Določite še parametre aproksimacijske projektivne preslikave. Prika- žite sliko kalibracijskega objekta pred in po transformaciji z izračunano projektivno preslikavo. (b) Ali je afina preslikava primerna za geometrijsko kalibracijo podane slike? 3. Naložite sliko cal_barrel.png (slika 8.5) kalibracijskega objekta ter s pomočjo nekaj korespondenčnih točk izračunajte parametre afine in projektivne aproksimacijske preslikave med kalibracijsko sliko in referenčno sliko kalibracijskega objekta. Predpostavite, da stranice posameznih kvadratnih področij kalibracijskega objekta merijo 1 mm. Prikažite sliko kalibracijskega objekta pred in po transformaciji z izračunano aproksimacijsko preslikavo. Ali sta toga in afina preslikava zadostni za kalibracijo slikovnega sistema? Kalibracijo izvedite tako, da bo na kalibrirani sliki velikost slikovnega elementa 0,02 mm. (a) Kalibracijo izvedite še z uporabo Brawnovega modela radialnih distorzij (prvi red), tako da minimizirate povprečno kvadratno evklidsko razdaljo med korespondenčnimi točkami s funkcijo fmin modula scipy.optimize. Parametri optimizacije naj obse-gajo le parametre modela radialnih distorzij, parametre aproksimativne projektivne preslikave pa določite vsakokrat posebej. Začetne vrednosti parametrov radialne transformacije Ki postavite na 0, center radialnih distorzij pa v geometrično središče slike. V ta namen dopolnite funkcijo transformEstimate2d z dodatnim parametrom nr, ki določa red radialnih distorzij. Funkcija naj vrne parametre aproksimacijske projektivne preslikave tp, parametre radialnih distorzij tr (vektor [ xc, yc, K 1 , K 2 , ... ]) in koren povprečne kvadratne evklidske razdalje med korespondenčnimi točkami err. 1 def t r a n s f o r m E s t i m a t e 2 d ( x , y , u , v , k i n d = ’ r i g i d ’ , nr =1 , 2 a n i m a t e = F a l s e ) : 3 ... 4 e l i f k i n d == ’ r a d i a l ’ : 5 ... 6 r e t u r n tp , tr , err Prikažite transformirano sliko kalibracijskega objekta. (b) Postopek kalibracije nekajkrat ponovite, tako da vsakokrat ponovno označite izbrane točke na sliki kalibracijskega objekta. Na podlagi dobljenih rezultatov ocenite natančnost opisanega postopka geometrijske kalibracije. 120 Geometrijska kalibracija slik 8.6 Rešitve in odgovori na vprašanja 8.6 Rešitve in odgovori na vprašanja Pri odgovorih privzamemo, da se funkcije iz rešitev nahajajo v modulu funkcije, slikovno gradivo pa se nahaja v podmapi poglavje_8. Najprej naložimo testni sliki in ustvarimo pomožne spremenljivke. 1 \ b e g i n { p y t h o n } 2 i m p o r t o s . p a t h 3 i m p o r t f u n k c i j e 4 i m p o r t n u m p y as np 5 i m p o r t i n t e r p 6 f r o m m a t p l o t l i b i m p o r t p y p l o t as pp 7 f r o m PIL i m p o r t I m a g e as im 8 9 # naložimo sliko kalibracijskega objekta 10 I1 = n p . a r r a y ( i m . o p e n ( ’ . / p o g l a v j e _ 8 / c a l _ p r o j e c t i v e . p n g ’ ) ) 11 H1 , W1 = I 1 . s h a p e 12 xg1 , yg1 = n p . a r a n g e ( W1 ) , n p . a r a n g e ( H1 ) 13 # definiramo referenčne točke 14 xr1 = n p . a r r a y ([0 , 4 , 8 , 8 , 8 , 4 , 0 , 0] , d t y p e = n p . f l o a t ) 15 yr1 = n p . a r r a y ([0 , 0 , 0 , 3 , 6 , 6 , 6 , 3] , d t y p e = n p . f l o a t ) 16 # definiramo koordinatno mrežo točk kalibrirane slike 17 x1c = n p . a r a n g e (0 , 8 .0 + 0 .01 , 0 .02 ) 18 y1c = n p . a r a n g e (0 , 6 .0 + 0 .01 , 0 .02 ) 19 Y1c , X1c = n p . m e s h g r i d ( y1c , x1c , i n d e x i n g = ’ ij ’ ) 20 21 # naložimo sliko kalibracijske tarče 22 I2 = n p . a r r a y ( i m . o p e n ( ’ . / p o g l a v j e _ 8 / c a l _ b a r r e l . p n g ’ ) ) 23 H2 , W2 = I 2 . s h a p e 24 xg2 , yg2 = n p . a r a n g e ( W2 ) , n p . a r a n g e ( H2 ) 25 # definiramo referenčne točke 26 xr2 = xr1 27 yr2 = yr1 28 # definiramo koordinatno mrežo točk kalibrirane slike 29 x2c , y2c = x1c , y1c 30 X2c , Y2c = X1c , Y1c 1. V modulu funkcije ustvarimo funkcijo transformEstimate2d. 1 def t r a n s f o r m E s t i m a t e 2 d ( x , y , u , v , k i n d = ’ r i g i d ’ , nr =1 , 2 a n i m a t e = F a l s e ) : 3 x = n p . a s a r r a y ( x ) . a s t y p e ( n p . f l o a t ) . f l a t t e n () 4 y = n p . a s a r r a y ( y ) . a s t y p e ( n p . f l o a t ) . f l a t t e n () 5 u = n p . a s a r r a y ( u ) . a s t y p e ( n p . f l o a t ) . f l a t t e n () 6 v = n p . a s a r r a y ( v ) . a s t y p e ( n p . f l o a t ) . f l a t t e n () 7 t = tr = err = N o n e 8 9 if k i n d == ’ r i g i d ’ : 10 xm = x . m e a n () 121 Geometrijska kalibracija slik 8.6 Rešitve in odgovori na vprašanja 11 um = u . m e a n () 12 ym = y . m e a n () 13 vm = v . m e a n () 14 yum = n p . m e a n ( y * u ) 15 xvm = n p . m e a n ( x * v ) 16 xum = n p . m e a n ( x * u ) 17 yvm = n p . m e a n ( y * v ) 18 a = - n p . a r c t a n ( 19 ( yum - xvm - ym * um + xm * vm ) / 20 ( xum + yvm - xm * um - ym * vm ) ) 21 tx = um - xm * n p . c o s ( a ) + ym * n p . s i n ( a ) 22 ty = vm - xm * n p . s i n ( a ) - ym * n p . c o s ( a ) 23 t = n p . d o t ( 24 t r a n s f o r m A f f i n e 2 d ( t r a n s =[ tx , ty ]) , 25 t r a n s f o r m A f f i n e 2 d ( rot = a ) ) 26 tx , ty = p t T r a n s f o r m 2 d ( t , x , y ) 27 err = ((( u - tx ) **2 + ( v - ty ) * * 2 ) . m e a n () ) **0 .5 28 r e t u r n t , err 29 30 e l i f k i n d == ’ a f f i n e ’ : 31 xxm = n p . m e a n ( x * x ) 32 xym = n p . m e a n ( x * y ) 33 yym = n p . m e a n ( y * y ) 34 xm = x . m e a n () 35 ym = y . m e a n () 36 uxm = n p . m e a n ( x * u ) 37 uym = n p . m e a n ( u * y ) 38 vxm = n p . m e a n ( v * x ) 39 vym = n p . m e a n ( y * v ) 40 um = u . m e a n () 41 vm = v . m e a n () 42 t = n p . z e r o s ([3 ,3]) 43 t [ -1 , -1] = 1 .0 44 t v e c = n p . l i n a l g . s o l v e ( 45 n p . a r r a y ( 46 [[ xxm , xym , xm , 0 , 0 , 0] , 47 [ xym , yym , ym , 0 , 0 , 0] , 48 [ xm , ym , 1 , 0 , 0 , 0] , 49 [0 , 0 , 0 , xxm , xym , xm ] , 50 [0 , 0 , 0 , xym , yym , ym ] , 51 [0 , 0 , 0 , xm , ym , 1]] 52 ) , 53 n p . a r r a y ([ uxm , uym , um , vxm , vym , vm ]) ) 54 t [0] = t v e c [ : 3 ] 55 t [1] = t v e c [ 3 : ] 56 tx , ty = p t T r a n s f o r m 2 d ( t , x , y ) 57 err = ((( u - tx ) **2 + ( v - ty ) * * 2 ) . m e a n () ) **0 .5 58 r e t u r n t , err 59 122 Geometrijska kalibracija slik 8.6 Rešitve in odgovori na vprašanja 60 e l i f k i n d == ’ p r o j e c t i v e ’ : 61 if a n i m a t e : 62 p p . f i g u r e () 63 t0 , err = t r a n s f o r m E s t i m a t e 2 d ( x , y , u , v , ’ a f f i n e ’ ) 64 t0 = t 0 . f l a t t e n () [: -1] 65 t o p t = o p t . f m i n ( 66 l a m b d a t : k P r o j e c t i v e 2 d ( t , x , y , u , v , a n i m a t e ) , t0 ) 67 t = n p . o n e s ([9] , ’ f l o a t ’ ) 68 t [ : 8 ] = t o p t 69 t . s h a p e = [3 , 3] 70 err = k P r o j e c t i v e 2 d ( topt , x , y , u , v , F a l s e ) 71 r e t u r n t , err 72 73 e l i f k i n d == ’ r a d i a l ’ : 74 if a n i m a t e : 75 p p . f i g u r e () 76 T p r o j = n p . z e r o s ([3 , 3]) 77 xc = x . m e a n () 78 yc = y . m e a n () 79 tr0 = n p . z e r o s ([ nr + 2]) 80 tr0 [0] = xc 81 tr0 [1] = yc 82 t r o p t = o p t . f m i n ( 83 l a m b d a tr : 84 k P r o j e c t i v e R a d i a l 2 d ( tr , x , y , u , v , Tproj , a n i m a t e ) , 85 tr0 ) 86 tr = t r o p t 87 err = k P r o j e c t i v e R a d i a l 2 d ( tropt , x , y , u , v , Tproj , F a l s e ) 88 r e t u r n Tproj , tr , err 89 90 r e t u r n t , tr , err V modulu funkcije ustvarimo še kriterijsko funkcijo kProjective2d, ki jo potrebujemo za izračun vrednosti parametrov projektivne aproksimacijske preslikave. 1 def k P r o j e c t i v e 2 d ( t , x , y , u , v , a n i m a t e ) : 2 T = n p . z e r o s ( [ 9 ] ) 3 T [ : 8 ] = t 4 T [ -1] = 1 .0 5 T . s h a p e = (3 ,3) 6 ue , ve = p t T r a n s f o r m 2 d ( T , x , y ) 7 if a n i m a t e : 8 p p . c l a () 9 p p . p l o t ( u , v , ’ xr ’ ) 10 p p . p l o t ( ue , ve , ’ xb ’ ) 11 p p . d r a w () 12 p p . p a u s e (0 .01 ) 13 14 r e t u r n ((( u - ue ) **2 + ( v - ve ) * * 2 ) . m e a n () ) **0 .5 123 Geometrijska kalibracija slik 8.6 Rešitve in odgovori na vprašanja Sledi geometrijska kalibracija slike cal_projective.png. 1 # ročno označevanje referenčnih točk 2 p p . f i g u r e () 3 if o s . p a t h . i s f i l e ( ’ . / p o g l a v j e _ 8 / r e z u l t a t i / r e f _ p t s _ 1 . n p y ’ ) : 4 t = n p . l o a d ( ’ . / p o g l a v j e _ 8 / r e z u l t a t i / r e f _ p t s _ 1 . n p y ’ ) 5 e l s e : 6 p p . i m s h o w ( I1 , c m a p = ’ g r a y ’ ) 7 p p . t i t l e ( 8 ’ O z n a č i o g l i š č a in r a z p o l o v i š č a s t r a n i c . ’ 9 ’ Pri č ni l e v o zgoraj , n a d a l j u j v s m e r i u r i n e g a k a z a l c a . . ’ ) 10 t = n p . a s a r r a y ( p p . g i n p u t (8 , t i m e o u t = 6 0 0 ) ) 11 n p . s a v e ( ’ . / p o g l a v j e _ 8 / r e z u l t a t i / r e f _ p t s _ 1 . n p y ’ , t ) 12 p p . c l o s e () 13 u1 , v1 = t [: ,0] , t [: ,1] 14 15 # kalibracija z interpolacijsko afino preslikavo 16 # uporabimo levo zgornje, desno zgornje in desno spodnje krajišče 17 i n d s = [0 , 2 , 4] 18 T1Ai , e r r 1 A i = f u n k c i j e . t r a n s f o r m E s t i m a t e 2 d ( 19 xr1 [ i n d s ] , yr1 [ i n d s ] , u1 [ i n d s ] , v1 [ i n d s ] , ’ a f f i n e ’ ) 20 x1Ai , y 1 A i = f u n k c i j e . p t T r a n s f o r m 2 d ( T1Ai , u1 , v1 , i n v e r s e = T r u e ) 21 tmpx , t m p y = f u n k c i j e . p t T r a n s f o r m 2 d ( T1Ai , X1c , Y1c ) 22 I 1 A i = i n t e r p . i n t e r p 2 ( tmpx , tmpy , xg1 , yg1 , I1 , c v a l = 2 5 5 ) 23 24 # kalibracija z afino aproksimacijsko preslikavo 25 T1A , e r r 1 A = f u n k c i j e . t r a n s f o r m E s t i m a t e 2 d ( 26 xr1 , yr1 , u1 , v1 , ’ a f f i n e ’ ) 27 x1A , y1A = f u n k c i j e . p t T r a n s f o r m 2 d ( T1A , u1 , v1 , i n v e r s e = T r u e ) 28 tmpx , t m p y = f u n k c i j e . p t T r a n s f o r m 2 d ( T1A , X1c , Y1c ) 29 I1A = i n t e r p . i n t e r p 2 ( tmpx , tmpy , xg1 , yg1 , I1 , c v a l = 2 5 5 ) 30 31 # kalibracija s projektivno preslikavo 32 T1P , e r r 1 P = f u n k c i j e . t r a n s f o r m E s t i m a t e 2 d ( 33 xr1 , yr1 , u1 , v1 , ’ p r o j e c t i v e ’ , a n i m a t e = F a l s e ) 34 x1P , y1P = f u n k c i j e . p t T r a n s f o r m 2 d ( T1P , u1 , v1 , i n v e r s e = T r u e ) 35 tmpx , t m p y = f u n k c i j e . p t T r a n s f o r m 2 d ( T1P , X1c , Y1c ) 36 I1P = i n t e r p . i n t e r p 2 ( tmpx , tmpy , xg1 , yg1 , I1 , c v a l = 2 5 5 ) 37 38 p r i n t ( ’ K a l i b r a c i j a s l i k e c a l _ p r o j e c t i v e . p n g : ’ ) 39 p r i n t ( ’ N a p a k a za i n t e r p . a f i n i m o d e l : ’ , e r r 1 A i ) 40 p r i n t ( ’ N a p a k a za a p r o k s . a f i n i m o d e l : ’ , e r r 1 A ) 41 p r i n t ( ’ N a p a k a za p r o j . m o d e l : ’ , e r r 1 P ) 42 43 p p . f i g u r e () 44 45 p p . s u b p l o t (2 , 2 , 1) 46 p p . p l o t ( xr1 , yr1 , ’ xr ’ , l a b e l = ’ I z v i r n a ’ ) 47 p p . p l o t ( x1A , y1A , ’ xb ’ , l a b e l = ’ A f i n a ’ ) 48 p p . p l o t ( x1P , y1P , ’ xg ’ , l a b e l = ’ P r o j e k t i v n a ’ ) 124 Geometrijska kalibracija slik 8.6 Rešitve in odgovori na vprašanja 49 p p . l e g e n d ( loc = ’ u p p e r r i g h t ’ ) 50 51 p p . s u b p l o t (2 , 2 , 2) 52 p p . i m s h o w ( I1 , c m a p = ’ g r a y ’ ) 53 p p . t i t l e ( ’ I z v i r n a ’ ) 54 55 p p . s u b p l o t (2 , 2 , 3) 56 p p . i m s h o w ( I1A , c m a p = ’ g r a y ’ ) 57 p p . t i t l e ( ’ A f i n a ’ ) 58 59 p p . s u b p l o t (2 , 2 , 4) 60 p p . i m s h o w ( I1P , c m a p = ’ g r a y ’ ) 61 p p . t i t l e ( ’ P r o j e k t i v n a ’ ) 62 63 p p . s h o w () 2. Izvedemo zahtevano kalibracijo slike cal_projective.png (a) Parametre interpolacijske afine preslikave določimo na podlagi treh korespondenčnih točk, ki se nahajajo v levem zgornjem, desnem zgornjem in desnem spodnjem krajišču kalibracijskega objekta. (a) Zajeta slika (b) Afina interp. (c) Afina aproks. (d) Projektivna Slika 8.6: Geometrijska kalibracija slike cal_projective.png z afino in projektivno preslikavo. (b) Za kalibracijo zajete slike je potrebno uporabiti projektivno preslikavo. Koren povprečne kvadratne evklidske razdalje med korespondenčnimi točkami v prostoru zajete slike znaša približno 50 slikovnih elementov za aproksimacijsko afino in 0 , 5 slikovnega elementa za projektivno preslikavo. 3. V modulu funkcije ustvarimo kriterijsko funkcijo kProjectiveRadial2d, ki jo potrebujemo za izračun parametrov radialnega modela distorzij. 1 def k P r o j e c t i v e R a d i a l 2 d ( t , x , y , u , v , Tproj , a n i m a t e ) : 2 # najprej izvedemo radialno preslikavo 3 xr , yr = p t T r a n s f o r m R a d i a l 2 d ( t , x , y ) 4 5 # in se aproksimacijska projektivna preslikava 6 t , err = t r a n s f o r m E s t i m a t e 2 d ( 7 xr , yr , u , v , ’ p r o j e c t i v e ’ , F a l s e ) 8 [ ue , ve ] = p t T r a n s f o r m 2 d ( t , xr , yr ) 125 Geometrijska kalibracija slik 8.6 Rešitve in odgovori na vprašanja 9 T p r o j [: , :] = t 10 11 if a n i m a t e : 12 p p . c l a () 13 p p . p l o t ( u , v , ’ xr ’ ) 14 p p . p l o t ( ue , ve , ’ xb ’ ) 15 p p . d r a w () 16 p p . p a u s e (0 .01 ) 17 18 r e t u r n ((( u - ue ) **2 + ( v - ve ) * * 2 ) . m e a n () ) **0 .5 V modulu funkcije ustvarimo še funkcijo ptTransformRadial2d, ki točke preslika z radialno preslikavo. 1 def p t T r a n s f o r m R a d i a l 2 d ( tr , x , y ) : 2 x = n p . a s a r r a y ( x ) 3 y = n p . a s a r r a y ( y ) 4 5 tr = n p . a s a r r a y ( tr , ’ f l o a t ’ ) 6 7 xc = tr [0] 8 yc = tr [1] 9 K = tr [ 2 : ] 10 11 rr = ( x - xc ) **2 + ( y - yc ) **2 12 sr = 1 13 for i in r a n g e ( len ( K ) ) : 14 sr += K [ i ]*( rr **( i + 1 .0 ) ) 15 16 xt = xc + ( x - xc ) * sr 17 yt = yc + ( y - yc ) * sr 18 19 r e t u r n xt , yt (a) Z afino in projektivno preslikavo ne moremo izvesti zadovoljive geometrijske kalibracije slike cal_barrel.png (slika 8.7). Koren povprečne kvadratne evklidske razdalje med korespondenčnimi točkami v prostoru zajete slike znaša približno 10 slikovnih elementov za afino, 7 slikovnih elementov za projektivno in 0 , 5 slikovnega elementa za kombinacijo radialne in projektivne preslikave. Na koncu geometrijsko kalibriramo še sliko cal_barrel.png. 1 p p . f i g u r e () 2 if o s . p a t h . i s f i l e ( ’ . / p o g l a v j e _ 8 / r e z u l t a t i / r e f _ p t s _ 2 . n p y ’ ) : 3 t = n p . l o a d ( ’ . / p o g l a v j e _ 8 / r e z u l t a t i / r e f _ p t s _ 2 . n p y ’ ) 4 e l s e : 5 p p . i m s h o w ( I2 , c m a p = ’ g r a y ’ ) 6 p p . t i t l e ( 7 ’ I z b e r i o g l i š č a in r a z p o l o v i š č a s t r a n i c . ’ 8 ’ Pri č ni l e v o z g o r a j . ’ ) 126 Geometrijska kalibracija slik 8.6 Rešitve in odgovori na vprašanja 9 t = n p . a s a r r a y ( p p . g i n p u t (8 , t i m e o u t = 6 0 0 ) ) 10 n p . s a v e ( ’ . / p o g l a v j e _ 8 / r e z u l t a t i / r e f _ p t s _ 2 . n p y ’ , t ) 11 p p . c l o s e () 12 u2 , v2 = t [: ,0] , t [: ,1] 13 14 # kalibracija z aproksimacijsko afino preslikavo 15 T2A , e r r 2 A = f u n k c i j e . t r a n s f o r m E s t i m a t e 2 d ( 16 xr2 , yr2 , u2 , v2 , ’ a f f i n e ’ ) 17 tmpx , t m p y = f u n k c i j e . p t T r a n s f o r m 2 d ( T2A , X2c , Y2c ) 18 I2A = i n t e r p . i n t e r p 2 ( tmpx , tmpy , xg2 , yg2 , I2 , c v a l = 2 5 5 ) 19 20 # kalibracija s projektivno preslikavo 21 T2P , e r r 2 P = f u n k c i j e . t r a n s f o r m E s t i m a t e 2 d ( 22 xr2 , yr2 , u2 , v2 , ’ p r o j e c t i v e ’ ) 23 tmpx , t m p y = f u n k c i j e . p t T r a n s f o r m 2 d ( T2P , X2c , Y2c ) 24 I2P = i n t e r p . i n t e r p 2 ( tmpx , tmpy , xg2 , yg2 , I2 , c v a l = 2 5 5 ) 25 26 # a - kalibracija z radialnim Brownovim modelom 27 T2RP , T2RB , e r r 2 R P = f u n k c i j e . t r a n s f o r m E s t i m a t e 2 d ( 28 xr2 , yr2 , u2 , v2 , ’ r a d i a l ’ , a n i m a t e = T r u e ) 29 tmpx , t m p y = f u n k c i j e . p t T r a n s f o r m R a d i a l 2 d ( T2RB , X2c , Y2c ) 30 tmpx , t m p y = f u n k c i j e . p t T r a n s f o r m 2 d ( T2RP , tmpx , t m p y ) 31 I 2 R P = i n t e r p . i n t e r p 2 ( tmpx , tmpy , xg2 , yg2 , I2 , c v a l = 2 5 5 ) 32 33 p r i n t ( ’ K a l i b r a c i j a s l i k e c a l _ b a r r e l . p n g : ’ ) 34 p r i n t ( ’ N a p a k a za a f i n i m o d e l p r e s l i k a v e : ’ , e r r 2 A ) 35 p r i n t ( ’ N a p a k a za p r o j . m o d e l p r e s l i k a v e : ’ , e r r 2 P ) 36 p r i n t ( ’ N a p a k a za p r o j . in r a d . m o d e l p r e s l i k a v e : ’ , e r r 2 R P ) 37 38 # napaka pri kalibraciji z afino, projektivno in 39 # radialno/projektivno preslikavo 40 p r i n t ( err2A , err2P , e r r 2 R P ) 41 42 p p . f i g u r e () 43 44 p p . s u b p l o t (2 , 2 , 1) 45 p p . i m s h o w ( I2 , c m a p = ’ g r a y ’ ) 46 p p . t i t l e ( ’ Z a j e t a ’ ) 47 48 p p . s u b p l o t (2 , 2 , 2) 49 p p . i m s h o w ( I2A , c m a p = ’ g r a y ’ ) 50 p p . t i t l e ( ’ A f i n a p r e s l i k a v a ’ ) 51 52 p p . s u b p l o t (2 , 2 , 3) 53 p p . i m s h o w ( I2P , c m a p = ’ g r a y ’ ) 54 p p . t i t l e ( ’ P r o j e k t i v n a p r e s l i k a v a ’ ) 55 56 p p . s u b p l o t (2 , 2 , 4) 57 p p . i m s h o w ( I2RP , c m a p = ’ g r a y ’ ) 127 Geometrijska kalibracija slik 8.6 Rešitve in odgovori na vprašanja 58 p p . t i t l e ( ’ R a d i a l n a p r e s l i k a v a ’ ) 59 60 tmpx , t m p y = f u n k c i j e . p t T r a n s f o r m R a d i a l 2 d ( T2RB , xr2 , yr2 ) 61 x2RP , y 2 R P = f u n k c i j e . p t T r a n s f o r m 2 d ( T2RP , tmpx , t m p y ) 62 63 p p . f i g u r e () 64 65 p p . p l o t ( u2 , v2 , ’ xr ’ , l a b e l = ’ Z a j e t a ’ ) 66 p p . p l o t ( x2RP , y2RP , ’ xb ’ , l a b e l = ’ R a d i a l n a + P r o j e k t i v n a ’ ) 67 p p . l e g e n d ( loc = ’ u p p e r r i g h t ’ ) 68 69 p p . s h o w () (a) Zajeta slika (b) Afina (c) Projektivna (d) Radialna/projektivna Slika 8.7: Geometrijska kalibracija slike cal_barrel.png z afino, projektivno ter s kombinacijo radialne in projektivne preslikave. (b) Z nekajkratno ponovitvijo postopka kalibracije pridemo do ocene natančnosti, ki znaša približno 0 , 3 slikovnega elementa zajete slike. 128 Poglavje 9 Geometrijska poravnava slik s postopkom optimizacije Geometrijska poravnava dveh ali več slik je proces iskanja optimalnih geometrijskih preslikav T , ki nam slike preslikajo tako, da se iste strukture oziroma objekti slik po poravnavi nahajajo na enakih položajih. Pred postopkom poravnave je potrebno izbrati model geometrijske preslikave, mero podobnosti ter optimizacijski postopek [8]. Tekom postopka poravnave nam izbrana optimizacijska metoda iterativno spreminja parametre geometrijske preslikave, in sicer tako, da teži k optimalni vrednosti mere podobnosti. Glavna prednost geometrijske poravnave slik s postopkom optimizacije je v splošnosti, saj ne zahteva predhodne izbire kontrolnih točk in jo zato lahko relativno preprosto avtomatiziramo. Naj bo a( x, y) referenčna slika, b( u, v) pa poljubna slika, ki jo želimo poravnati z referenčno sliko a. Postopek poravnave slik z optimizacijo mere podobnosti prikazuje slika 9.1. Mera podobnosti je poljubna skalarna funkcija, določena nad Referenčna1slika Lebdeča1slika Vhodna1slika a(x,1y) b(x,1y) T(b(x,1y)) b(u,1v) T -1(b(u,1v)) MP Mera podobnosti Preslikava P Optimizacijski A postopek Podobnost Parametri Slika 9.1: Poravnava slik z optimizacijo mere podobnosti. vsemi istoležnimi slikovnimi elementi referenčne slike a( x, y) in lebdeče slike b( x, y), ki ima optimalno vrednost pri optimalni poravnavi slik. Mero podobnosti je potrebno smiselno izbrati, tako da je čim manj občutljiva na motilna slikovna neskladja in čim bolj občutljiva na dejanska geometrijska neskladja med slikama. Ob predpostavki, da sta velikosti referenčne in lebdeče 129 Geometrijska poravnava slik s postopkom optimizacije slike enaki ( M, N), lahko zapišemo sledeče primere mer podobnosti: 1. Srednja kvadratna napaka MSE (ang. Mean Square Error): 1 M −1 N −1 X X M SE( a, b) = ( a( xi, yj) − b( xi, yj))2 . (9.1) M · N i=0 j=0 2. Srednja absolutna napaka MAE (ang. Mean Absolute Error): 1 M −1 N −1 X X M AE( a, b) = | a( xi, yj) − b( xi, yj)| . (9.2) M · N i=0 j=0 3. Korelacijski koeficient CC (ang. Correlation Coefficient): P M −1 P N −1 ( a( x i=0 j=0 i, yj ) − ¯ a) · ( b( xi, yj) − ¯ b) CC( a, b) = , qP M−1 P N−1 ( a( x P N −1 ( b( x i=0 j=0 i, yj ) − ¯ a)2 · P M−1 i=0 j=0 i, yj ) − ¯ b)2 1 M −1 N −1 ¯ X X a = a( xi, yj) , (9.3) M · N i=0 j=0 M −1 N −1 ¯ 1 X X b = b( xi, yj) . M · N i=0 j=0 4. Medsebojna informacija MI (ang. Mutual Information): M I( a, b) = H( a) + H( b) − H( a, b) , (9.4) kjer je H( a) entropija referenčne slike a( x, y), H( b) entropija lebdeče slike b( x, y), H( a, b) pa njuna skupna entropija: L X H( a) = − pa( la) · log ( pa( la)) , la=0 L X H( b) = − pb( lb) · log ( pb( lb)) , (9.5) lb=0 L L X X H( a, b) = − pab( la, lb) · log ( pab( la, lb)) . la=0 lb=0 Verjetnostni porazdelitvi pa( la) in pb( lb) ter skupno porazdelitev pab( la, lb) ocenimo z nor-malizacijo pripadajočih histogramov ha( la), hb( lb) ter hab( la, lb): pa( la) = ha( la) , M · N p (9.6) b( lb) = hb( lb) , M · N pab( la, lb) = hab( la, lb) . M · N 130 Geometrijska poravnava slik s postopkom optimizacije 9.1 Naloge in vprašanja Spremenljivki la in lb označujeta diskretne sivinske vrednosti referenčne slike a( x, y) in lebdeče slike b( x, y), in sicer la, lb ∈ {0 , 1 , 2 , ..., L}. 9.1 Naloge in vprašanja 1. Potek mere podobnosti v bližini optimuma bistveno vpliva na številne lastnosti postopkov poravnave slik z optimizacijo. Za podano referenčno sliko reg_reference.png (slika 9.2) določite vrednosti mere podobnosti MSE, MAE, CC ter MI v parametričnem prostoru preslikave, ki ga napenjata vektorja premikov tx in ty na intervalu [−15 , 15] s korakom 1 slikovni element. Polje premikov ustvarite z ustrezno uporabo funkcije meshgrid modula numpy, za transformacijo (premik) slik uporabite funkcijo imTransform2D, vrednost parametra expand pa postavite na ’same’. Pri izračunu medsebojne informacije verjetnost pab ocenite iz histograma, ki ima število razredov bistveno manjše od 256 × 256. Slika 9.2: Od leve proti desni: referenčna slika reg_reference.png in tri vhodne slike reg_input1.png, reg_input2.png in reg_input3.png. (a) Ustvarite funkcijo imSM, ki izračuna vrednost izbrane mere podobnosti sm (’MSE’, ’MAE’, ’CC’ ali ’MI’) med slikama imageA in imageB. Število razredov histogramov pri izračunu medsebojne informacije naj določa parameter nb, razpon sivinskih vrednosti pa parameter span. 1 def i m S M ( imageA , imageB , sm = ’ CC ’ , nb =16 , s p a n =(0 , 2 5 5 ) ) : 2 ... 3 r e t u r n f (b) Izrišite izračunane vrednosti mer podobnosti kot slike v parametričnem prostoru preslikave. (c) Kakšna je optimalna vrednost posameznih mer podobnosti ter kako se mere podobnosti obnašajo v bližini optimuma ( tx=0 in ty=0)? (d) Na podlagi postopka izčrpnega iskanja (ang. exhaustive search) na prej definiranem območju parametričnega prostora preslikave določite parametre premika, ki poravnajo vhodne slike reg_input1.png, reg_input2.png ter reg_input3.png z referenčno sliko reg_reference.png (slika 9.2). Postopek ponovite za vse mere podobnosti. (e) V čem se medsebojna informacija bistveno razlikuje od ostalih naštetih mer podobnosti? 131 Geometrijska poravnava slik s postopkom optimizacije 9.1 Naloge in vprašanja 2. Dani sta dvorazsežni magnetno resonančni sliki glave reg_MR1.png in reg_MR2.png (slika 9.3). Določite parametre toge preslikave ( tx, ty, α), ki poravna dani sliki na podlagi optimizacije z izbrano mero podobnosti. Za optimizacijo uporabite funkcijo fmin modula scipy.optimize, za začetni približek parametrov preslikave pa uporabite ocenjene vrednosti premika in rotacije. Med poravnavo prikazujte razliko med referenčno in lebdečo sliko tako, da razliki slik prištejete 127 in ustrezno odrežete vrednosti izven 8-bitnega dinamičnega območja [0 , 255]. Slika 9.3: Magnetno resonančni sliki glave reg_MR1.png in reg_MR2.png. (a) Funkcija fmin modula scipy.optimize išče minimum večrazsežne funkcije, zato po potrebi preoblikujte naštete mere podobnosti tako, da izkazujejo najmanjšo vrednost, ko sta referenčna in lebdeča slika poravnani. V ta namen ustvarite funkcijo imRigidRegister, ki togo poravna lebdečo sliko imageB na referenčno sliko imageA in pri tem uporabi izbrano mero podobnosti sm ter začetni približek x0 ([ tx, ty, α]). Funkcija naj vrne parametre x optimalne preslikave T, vrednost kriterijske funkcije v optimumu f ter število iteracij optimizacije n. 1 def i m R i g i d R e g i s t e r ( imageA , imageB , sm , x0 =[0 .0 , 0 .0 , 0 .0 ]) : 2 ... 3 r e t u r n x , T , f , n (b) Kolikšno je število potrebnih iteracij optimizacijskega postopka za izbrano mero podobnosti? Ali se postopek poravnave vedno konča tako, da sta referenčna in lebdeča slika "poravnani"? 3. Dane so dvorazsežne T 1, T 2 in SD utežene magnetno resonančne slike glave (slika 9.4). (a) Izrišite poteke izbranih mere podobnosti za sliki SD in T 1 ter sliki SD in T 2 kot slike v parametričnem prostoru, ki ga napenjata vektorja premikov tx = [−15 , 15] in ty = [−30 , 0] s korakom 1 slikovni element. Pri tem naj bosta sliki T 1 in T 2 lebdeči. (b) Določite optimalno vrednost izbrane mere podobnosti ter pripadajoče parametre premika topt in . x topt y (c) Določite še optimalno vrednost izbrane mere podobnosti ter pripadajoče parametre premika topt in z uporabo optimizacijskega postopka, ki ste ga udejanili pod x topt y prejšnjo točko. 132 Geometrijska poravnava slik s postopkom optimizacije 9.1 Naloge in vprašanja (a) T 1 (b) T 2 (c) SD Slika 9.4: T 1 (reg_T1.png), T 2 (reg_T2.png) in SD (reg_SD.png) utežene magnetno resonančne slike glave. 133 Geometrijska poravnava slik s postopkom optimizacije 9.1 Naloge in vprašanja 134 Geometrijska poravnava slik s postopkom optimizacije 9.2 Rešitve in odgovori na vprašanja 9.2 Rešitve in odgovori na vprašanja Pri odgovorih privzamemo, da se funkcije iz rešitev nahajajo v modulu funkcije, slikovno gradivo pa se nahaja v podmapi poglavje_9. Naprej uvozimo potrebne module, naložimo slike in definiramo pomožne spremenljivke. 1 i m p o r t n u m p y as np 2 f r o m m a t p l o t l i b i m p o r t p y p l o t as pp 3 f r o m PIL i m p o r t I m a g e as im 4 i m p o r t f u n k c i j e 5 6 I 1 r e f = n p . a s a r r a y ( i m . o p e n ( ’ . / p o g l a v j e _ 9 / r e g _ r e f e r e n c e . p n g ’ ) ) 7 I 1 i n p u t 1 = n p . a s a r r a y ( i m . o p e n ( ’ . / p o g l a v j e _ 9 / r e g _ i n p u t 1 . p n g ’ ) ) 8 I 1 i n p u t 2 = n p . a s a r r a y ( i m . o p e n ( ’ . / p o g l a v j e _ 9 / r e g _ i n p u t 2 . p n g ’ ) ) 9 I 1 i n p u t 3 = n p . a s a r r a y ( i m . o p e n ( ’ . / p o g l a v j e _ 9 / r e g _ i n p u t 3 . p n g ’ ) ) 10 11 I 2 M R 1 = n p . a s a r r a y ( i m . o p e n ( ’ . / p o g l a v j e _ 9 / r e g _ M R 1 . p n g ’ ) ) 12 I 2 M R 2 = n p . a s a r r a y ( i m . o p e n ( ’ . / p o g l a v j e _ 9 / r e g _ M R 2 . p n g ’ ) ) 13 14 I 3 T 1 = n p . a s a r r a y ( i m . o p e n ( ’ . / p o g l a v j e _ 9 / r e g _ T 1 . p n g ’ ) ) 15 I 3 T 2 = n p . a s a r r a y ( i m . o p e n ( ’ . / p o g l a v j e _ 9 / r e g _ T 2 . p n g ’ ) ) 16 I 3 S D = n p . a s a r r a y ( i m . o p e n ( ’ . / p o g l a v j e _ 9 / r e g _ S D . p n g ’ ) ) 17 18 tx = ty = n p . a r a n g e ( -15 .0 , 15 .0 + 1 .0 ) 19 Ty , Tx = n p . m e s h g r i d ( ty , tx , i n d e x i n g = ’ ij ’ ) 20 Txf , Tyf = T x . f l a t t e n () , T y . f l a t t e n () Ustvarimo pomožne funkcije za izčrpno iskanje optimalnih vrednosti mer podobnosti za dano polje premikov. 1 # izračuna vrednosti vseh mer podobnosti za polje premikov tx, ty 2 def r i g i d S M ( imgA , imgB , tx , ty ) : 3 Ia , Ib = i m g A . a s t y p e ( ’ f l o a t ’ ) , i m g B . a s t y p e ( ’ f l o a t ’ ) 4 t x s h a p e = t x . s h a p e 5 tx = t x . f l a t t e n () . a s t y p e ( ’ f l o a t ’ ) 6 ty = t y . f l a t t e n () . a s t y p e ( ’ f l o a t ’ ) 7 8 MSE = n p . z e r o s _ l i k e ( tx ) 9 MAE = n p . z e r o s _ l i k e ( tx ) 10 CC = n p . z e r o s _ l i k e ( tx ) 11 MI = n p . z e r o s _ l i k e ( tx ) 12 13 for i in r a n g e ( t x . s i z e ) : 14 txi , tyi = tx [ i ] , ty [ i ] 15 T = n p . a r r a y ([[1 , 0 , txi ] ,[0 , 1 , tyi ] ,[0 , 0 , 1]] , d t y p e = ’ f l o a t ’ ) 16 MSE [ i ] = f u n k c i j e . i m S M ( Ia , 17 f u n k c i j e . i m T r a n s f o r m 2 d ( Ib , T , e x p a n d = ’ s a m e ’ ) , ’ MSE ’ ) 18 MAE [ i ] = f u n k c i j e . i m S M ( Ia , 19 f u n k c i j e . i m T r a n s f o r m 2 d ( Ib , T , e x p a n d = ’ s a m e ’ ) , ’ MAE ’ ) 20 CC [ i ] = f u n k c i j e . i m S M ( Ia , 135 Geometrijska poravnava slik s postopkom optimizacije 9.2 Rešitve in odgovori na vprašanja 21 f u n k c i j e . i m T r a n s f o r m 2 d ( Ib , T , e x p a n d = ’ s a m e ’ ) , ’ CC ’ ) 22 MI [ i ] = f u n k c i j e . i m S M ( Ia , 23 f u n k c i j e . i m T r a n s f o r m 2 d ( Ib , T , e x p a n d = ’ s a m e ’ ) , ’ MI ’ ) 24 25 M S E . s h a p e = M A E . s h a p e = C C . s h a p e = M I . s h a p e = t x s h a p e 26 r e t u r n MSE , MAE , CC , MI 27 28 # izpiše premik pri optimalni vrednosti mer podobnosti 29 def p r i n t R i g i d O p t ( MSE , MAE , CC , MI , tx , ty ) : 30 if MSE is not N o n e : 31 ind = n p . a r g m i n ( MSE ) 32 p r i n t ( ’ M i n i m u m MSE ={} pri tx ={} , ty ={} . ’ . f o r m a t ( 33 M S E . f l a t t e n () [ ind ] , t x . f l a t t e n () [ ind ] , t y . f l a t t e n () [ ind ]) ) 34 if MAE is not N o n e : 35 ind = n p . a r g m i n ( MAE ) 36 p r i n t ( ’ M i n i m u m MAE ={} pri tx ={} , ty ={} . ’ . f o r m a t ( 37 M A E . f l a t t e n () [ ind ] , t x . f l a t t e n () [ ind ] , t y . f l a t t e n () [ ind ]) ) 38 if CC is not N o n e : 39 ind = n p . a r g m a x ( CC ) 40 p r i n t ( ’ M a x i m u m CC ={} pri tx ={} , ty ={} . ’ . f o r m a t ( 41 C C . f l a t t e n () [ ind ] , t x . f l a t t e n () [ ind ] , t y . f l a t t e n () [ ind ]) ) 42 if MI is not N o n e : 43 ind = n p . a r g m a x ( MI ) 44 p r i n t ( ’ M a x i m u m MI ={} pri tx ={} , ty ={} . ’ . f o r m a t ( 45 M I . f l a t t e n () [ ind ] , t x . f l a t t e n () [ ind ] , t y . f l a t t e n () [ ind ]) ) 46 47 # izriše kriterijsko funkcijo kot sliko 48 def s h o w S M s ( MSE , MAE , CC , MI , tx , ty , t i t l e = ’ ’ ) : 49 # extent = [left, right, bottom, top] 50 e x t e n t = [ t x . m i n () , t x . m a x () , t y . m a x () , t y . m i n () ] 51 p p . f i g u r e () 52 p p . s u p t i t l e ( t i t l e ) 53 p p . s u b p l o t (1 , 4 , 1) 54 p p . i m s h o w ( MSE , e x t e n t = e x t e n t ) , 55 p p . t i t l e ( ’ MSE ’ ) , p p . c o l o r b a r () 56 p p . s u b p l o t (1 , 4 , 2) 57 p p . i m s h o w ( MAE , e x t e n t = e x t e n t ) 58 p p . t i t l e ( ’ MAE ’ ) , p p . c o l o r b a r () 59 p p . s u b p l o t (1 , 4 , 3) 60 p p . i m s h o w ( CC , e x t e n t = e x t e n t ) 61 p p . t i t l e ( ’ CC ’ ) , p p . c o l o r b a r () 62 p p . s u b p l o t (1 , 4 , 4) 63 p p . i m s h o w ( MI , e x t e n t = e x t e n t ) 64 p p . t i t l e ( ’ MI ’ ) , p p . c o l o r b a r () 1. (a) V modulu funkcije ustvarimo funkcijo imSM. 1 def i m S M ( imageA , imageB , sm , nb =16 , s p a n =[0 , 2 5 5 ] ) : 2 i m a g e A = n p . a s a r r a y ( imageA , d t y p e = n p . f l o a t ) 136 Geometrijska poravnava slik s postopkom optimizacije 9.2 Rešitve in odgovori na vprašanja 3 i m a g e B = n p . a s a r r a y ( imageB , d t y p e = n p . f l o a t ) 4 N = i m a g e A . s i z e 5 nb , s p a n = int ( nb ) , n p . a s a r r a y ( span , d t y p e = n p . f l o a t ) 6 sm = str ( sm ) . l o w e r () 7 if sm == ’ mse ’ : 8 of = (( i m a g e A - i m a g e B ) * * 2 ) . m e a n () 9 10 e l i f sm == ’ mae ’ : 11 of = ( n p . a b s ( i m a g e A - i m a g e B ) ) . m e a n () 12 13 e l i f sm == ’ cc ’ : 14 i m a g e A m = i m a g e A . m e a n () 15 i m a g e B m = i m a g e B . m e a n () 16 of = (( i m a g e A - i m a g e A m ) *( i m a g e B - i m a g e B m ) ) . s u m () / \ 17 n p . s q r t ( 18 (( imageA - i m a g e A m ) * * 2 ) . s u m () * 19 (( i m a g e B - i m a g e B m ) * * 2 ) . s u m () ) 20 21 e l i f sm == ’ mi ’ : 22 d = s p a n [1] - s p a n [0] 23 i m a g e A d = n p . r o u n d (( i m a g e A - s p a n [ 0 ] ) /( d / nb ) ) 24 i m a g e B d = n p . r o u n d (( i m a g e B - s p a n [ 0 ] ) /( d / nb ) ) 25 pa = n p . z e r o s ([ nb ]) 26 pb = n p . z e r o s ([ nb ]) 27 pab = n p . z e r o s ([ nb , nb ]) 28 for i in r a n g e ( nb ) : 29 pa [ i ] = n p . c o u n t _ n o n z e r o ( i m a g e A d == i ) 30 pb [ i ] = n p . c o u n t _ n o n z e r o ( i m a g e B d == i ) 31 32 pa *= 1 .0 / N 33 pb *= 1 .0 / N 34 35 for i in r a n g e ( nb ) : 36 for j in r a n g e ( nb ) : 37 pab [ i , j ] = n p . c o u n t _ n o n z e r o ( 38 ( i m a g e A d == i ) & ( i m a g e B d == j ) ) 39 40 pab *= 1 .0 / N 41 42 pa [ pa == 0] = 1 .0 43 pb [ pb == 0] = 1 .0 44 pab [ pab == 0] = 1 .0 45 Ha , Hb = -( pa * n p . l o g ( pa ) ) . s u m () , -( pb * n p . l o g ( pb ) ) . s u m () 46 Hab = -( pab * n p . l o g ( pab ) ) . s u m () 47 of = Ha + Hb - Hab 48 e l s e : 49 r a i s e V a l u e E r r o r ( ’ I z b r a n a m e r a p o d o b n o s t i ne o b s t a j a . ’ ) 50 51 r e t u r n of 137 Geometrijska poravnava slik s postopkom optimizacije 9.2 Rešitve in odgovori na vprašanja (b) Izrišemo vse štiri mere podobnosti v parametričnem prostoru toge preslikave (slika 9.5). 1 MSEref , MAEref , CCref , M I r e f = r i g i d S M ( I1ref , I1ref , Tx , Ty ) 2 s h o w S M s ( MSEref , MAEref , CCref , MIref , tx , ty , 3 ’ M e r e p o d o b n o s t i med p r e m a k n j e n o in ’ 4 ’ i z v i r n o s l i k o r e g _ r e f e r e n c e . p n g ’ ) 8000 60 −10 7000 −10 50 6000 5000 40 t y 0 4000 t y 0 30 3000 20 2000 10 1000 10 10 0 0 −10 0 10 −10 0 10 tx tx (a) MSE (b) MAE 1.0 −10 0.9 −10 0.9 0.8 0.8 0.7 0.7 t y 0 t y 0 0.6 0.6 0.5 0.5 0.4 10 0.4 10 0.3 0.2 0.3 −10 0 10 −10 0 10 tx tx (c) CC (d) MI Slika 9.5: Mere podobnosti v parametričnem prostoru toge preslikave, ki je definirana s poljem premikov tx = ty = [−15 , 15] . (c) Meri podobnosti MAE in MSE izkazujeta minimum v okolici optimalne vrednosti, meri podobnosti CC in MI pa izkazujeta maksimum v okolici optimalne vrednosti. 1 ind = n p . a r g m i n ( M S E r e f ) 2 p r i n t ( ’ M e r a p o d a o b n o s t i kot f u n k c i j a t o g e g a p r e m i k a ’ 3 ’ za s l i k o r e g _ r e f e r e n c e :\ n ’ ) 4 p r i n t R i g i d O p t ( MSEref , MAEref , CCref , MIref , Tx , Ty ) (d) Parametri premikov, ki poravnajo vhodne slike z referenčno, so zbrani v tabeli 9.1. Pri treji vhodni sliki reg_input3.png je poravnava uspešna le za mero podobnosti M I. 138 Geometrijska poravnava slik s postopkom optimizacije 9.2 Rešitve in odgovori na vprašanja 1 MSEi1 , MAEi1 , CCi1 , M I i 1 = r i g i d S M ( I1ref , I 1 i n p u t 1 , Tx , Ty ) 2 p r i n t ( ’ \ n P o r a v n a v a s l i k e r e g _ r e f e r e n c e in r e g _ i n p u t 1 : ’ ) 3 p r i n t R i g i d O p t ( MSEi1 , MAEi1 , CCi1 , MIi1 , Tx , Ty ) 4 5 MSEi2 , MAEi2 , CCi2 , M I i 2 = r i g i d S M ( I1ref , I 1 i n p u t 2 , Tx , Ty ) 6 p r i n t ( ’ \ n P o r a v n a v a s l i k e r e g _ r e f e r e n c e in r e g _ i n p u t 2 : ’ ) 7 p r i n t R i g i d O p t ( MSEi2 , MAEi2 , CCi2 , MIi2 , Tx , Ty ) 8 9 MSEi3 , MAEi3 , CCi3 , M I i 3 = r i g i d S M ( I1ref , I 1 i n p u t 3 , Tx , Ty ) 10 p r i n t ( ’ \ n P o r a v n a v a s l i k e r e g _ r e f e r e n c e in r e g _ i n p u t 3 : ’ ) 11 p r i n t R i g i d O p t ( MSEi3 , MAEi3 , CCi3 , MIi3 , Tx , Ty ) Tabela 9.1: Parametri premikov pri optimalni vrednosti mer podobnosti, izraženi v slikovnih elementih. Vhodna slika tx ty reg_input1.png -4 8 reg_input2.png 3 -9 reg_input3.png -4 8 (e) Medsebojna informacija je statistična mera podobnosti, katere vrednost izhaja iz verjetnostnih porazdelitev sivinskih vrednosti referenčne in lebdeče slike. 2. (a) V modulu funkcije ustvarimo funkcijo imRigidRegister. 1 def i m R i g i d R e g i s t e r ( imageA , imageB , sm , x0 =[0 .0 , 0 .0 , 0 .0 ] , 2 a n i m a t e = F a l s e ) : 3 # pripravimo vhodne podatke 4 i m a g e A = n p . a s a r r a y ( imageA , d t y p e = n p . f l o a t ) 5 i m a g e B = n p . a s a r r a y ( imageB , d t y p e = n p . f l o a t ) 6 x0 = n p . a s a r r a y ( x0 , d t y p e = n p . f l o a t ) 7 sm = str ( sm ) . l o w e r () 8 9 # ponastavimo vrednost števca klicev kriterijske funkcije 10 N r e g = n p . a r r a y (0) 11 12 # pripravimo okno za izrisovanje vmesnih rezultatov 13 if a n i m a t e : 14 p p . f i g u r e () 15 16 # začnemo poravnavo z optimizaciojo mere podobnosti 17 ox = o p t . f m i n ( 18 l a m b d a x : k F u n R i g i d R e g ( 19 x , imageA , imageB , sm , animate , N r e g ) , x0 ) 20 # izračunamo vrednost kriterijske funkcije ob zaključku poravnave 21 of = k F u n R i g i d R e g ( ox , imageA , imageB , sm , F a l s e ) 22 # ustvarimo transformacijsko matriko toge preslikave 23 ot = t r a n s f o r m A f f i n e 2 d ( t r a n s = ox [:2] , rot = ox [ 2 ] ) 139 Geometrijska poravnava slik s postopkom optimizacije 9.2 Rešitve in odgovori na vprašanja 24 25 r e t u r n ox , ot , of , int ( N r e g ) Ustvarimo še kriterijsko funkcijo, ki jo minimiziramo v optimizacijskem postopku. 1 def k F u n R i g i d R e g ( x , img1 , img2 , sm , animate , N r e g =0) : 2 N r e g += 1 3 # ustvarim matriko toge preslikave in z njo preslikamo sliko 4 T = t r a n s f o r m A f f i n e 2 d ( t r a n s = x [:2] , rot = x [ 2 ] ) 5 i m g 2 t = i m T r a n s f o r m 2 d ( img2 , T , e x p a n d = ’ s a m e ’ ) 6 # izračunamo vrednost mere podobnosti med lebdečo in referenčno sliko 7 f = i m S M ( img1 , img2t , sm ) 8 if sm == ’ cc ’ : 9 f = 1 .0 - f 10 11 e l i f sm == ’ mi ’ : 12 f = - f 13 14 # po potrebi prikažemo stanje poravnave 15 if a n i m a t e and ( N r e g % 10) == 0: 16 p p . i m s h o w ( 1 2 8 .0 + i m g 2 t - img1 , c m a p = ’ g r a y ’ , 17 v m i n =0 , v m a x = 2 5 5 ) 18 p p . t i t l e ( ’ I t e r a c i j a {} , v r e d n o s t ’ 19 ’ k r i t e r i j s k e f u n k c i j e {} ’ . f o r m a t ( Nreg , f ) ) 20 p p . d r a w () 21 p p . p a u s e (0 .01 ) 22 23 r e t u r n f (b) Postopek poravnave se vedno ne konča tako, da sta sliki poravnani. Rezultat postopka poravnave je odvisen od izbrane mere podobnosti in začetnega približka preslikave (tabela 9.2). Tabela 9.2: Parametri poravnave za štiri mere podobnosti. Vrednosti parametrov premikov tx in ty so podane v slikovnih elementih, kot rotacije α je podan v radianih, končna vrednost mere podobnosti fk pa v slikovnih elementih. N določa število izračunov mere podobnosti. Mera podobnosti tx ty α fk N M SE 15.00 -6.00 0.087 33.63 203 M AE 15.00 -6.00 0.087 2.86 178 CC 15.00 -6.00 0.087 0.0064 245 M I 15.00 -6.00 0.087 -1.64 227 1 X 2 C C = [] 2 T 2 C C = [] 3 f 2 C C = [] 4 N 2 C C = [] 5 for sm in [ ’ MSE ’ , ’ MAE ’ , ’ CC ’ , ’ MI ’ ]: 140 Geometrijska poravnava slik s postopkom optimizacije 9.2 Rešitve in odgovori na vprašanja 6 X2CCi , T2CCi , f2CCi , N 2 C C i = f u n k c i j e . i m R i g i d R e g i s t e r ( 7 I2MR1 , I2MR2 , sm , [5 , 5 , 0 .1 ] , a n i m a t e = T r u e ) 8 p r i n t ( 9 ’ \ n P a r a m e t r i t o g e p o r a v n a v e s l i k r e g _ M R 1 in r e g _ M R 2 s ’ 10 ’ SM = ’ ’ {} ’ ’ : tx ={} , ty ={} , fi ={} rad , f ={} , N ={} ’ . f o r m a t ( 11 sm , X 2 C C i [0] , X 2 C C i [1] , X 2 C C i [2] , f2CCi , N 2 C C i ) ) 12 X 2 C C . a p p e n d ( X 2 C C i ) 13 T 2 C C . a p p e n d ( T 2 C C i ) 14 f 2 C C . a p p e n d ( f 2 C C i ) 15 N 2 C C . a p p e n d ( N 2 C C i ) 3. (a) Vrednosti štirih mer podobnosti v parametričnem prostoru preslikave, ki ga napenjata vektorja premikov tx = [−15 , 15] in ty = [−30 , 0] slikovnih elementov, prikazu-jeta sliki 9.6 in 9.7. −30 15000 −30 100 14000 95 −20 13000 −20 90 12000 t y t y 85 11000 80 −10 10000 −10 75 9000 70 0 8000 0 −10 0 10 −10 0 10 tx tx (a) MSE (b) MAE −30 0.7 −30 0.9 0.8 0.6 0.7 −20 0.5 −20 0.6 t y 0.4 t y 0.5 0.4 −10 0.3 −10 0.3 0.2 0.2 0.1 0 0.1 0 −10 0 10 −10 0 10 tx tx (c) CC (d) MI Slika 9.6: Mere podobnosti v parametričnem prostoru toge preslikave za sliki reg_SD.png in reg_T1.png. . 1 tx3 = n p . a r a n g e ( -15 .0 , 15 .0 + 1 .0 ) 2 ty3 = n p . a r a n g e ( -30 .0 , 0 + 1 .0 ) 141 Geometrijska poravnava slik s postopkom optimizacije 9.2 Rešitve in odgovori na vprašanja −30 −30 13000 90 12000 85 −20 11000 −20 80 10000 75 t y 9000 t y 70 −10 8000 −10 65 7000 60 6000 55 0 5000 0 50 −10 0 10 −10 0 10 tx tx (a) MSE (b) MAE −30 0.8 −30 1.0 0.7 −20 0.6 −20 0.8 t y 0.5 t y 0.6 −10 0.4 −10 0.4 0.3 0.2 0 0.2 0 −10 0 10 −10 0 10 tx tx (c) CC (d) MI Slika 9.7: Mere podobnosti v parametričnem prostoru toge preslikave za sliki reg_SD.png in reg_T2.png. . 3 Ty3 , Tx3 = n p . m e s h g r i d ( ty3 , tx3 , i n d e x i n g = ’ ij ’ ) 4 5 MSET1 , MAET1 , CCT1 , M I T 1 = r i g i d S M ( I3SD , I3T1 , Tx3 , Ty3 ) 6 p r i n t ( ’ \ n M e r e p o d o b n o s t i med s l i k a m a r e g _ S D in r e g _ T 1 : ’ ) 7 p r i n t R i g i d O p t ( MSET1 , MAET1 , CCT1 , MIT1 , Tx3 , Ty3 ) 8 s h o w S M s ( MSET1 , MAET1 , CCT1 , MIT1 , tx3 , ty3 , 9 ’ P o r a v n a v a r e g _ S D in r e g _ T 1 ’ ) 10 11 MSET2 , MAET2 , CCT2 , M I T 2 = r i g i d S M ( I3SD , I3T2 , Tx3 , Ty3 ) 12 p r i n t ( ’ \ n M e r e p o d o b n o s t i med s l i k a m a r e g _ S D in r e g _ T 2 : ’ ) 13 p r i n t R i g i d O p t ( MSET2 , MAET2 , CCT2 , MIT2 , Tx3 , Ty3 ) 14 s h o w S M s ( MSET2 , MAET2 , CCT2 , MIT2 , tx3 , ty3 , 15 ’ P o r a v n a v a r e g _ S D in r e g _ T 2 ’ ) (b) Določimo še vrednosti parametrov premika, pri katerih dobimo optimalno vrednost mere podobnosti (tabeli 9.3 in 9.4). (c) Izberemo medsebojno informacijo MI kot mero podobnosti (tabela 9.5). 142 Geometrijska poravnava slik s postopkom optimizacije 9.2 Rešitve in odgovori na vprašanja Tabela 9.3: Parametri premika tx in ty, izraženi v slikovnih elementih, pri optimalni vrednosti mer podobnosti za sliko reg_T1.png. Mera podobnosti tx ty SM M SE 11 -16 7832.9 M AE 11 -16 65.30 CC 11 -16 0.736 M I 11 -16 0.922 Tabela 9.4: Parametri premika tx in ty, izraženi v slikovnih elementih, pri optimalni vrednosti mer podobnosti za sliko reg_T2.png. Mera podobnosti tx ty SM M SE 3 -9 4946.1 M AE 3 -9 49.84 CC 3 -9 0.834 M I 3 -9 1.112 Tabela 9.5: Rezultati poravnave slik z mero podobnosti MI. Vrednosti parametrov premikov tx in ty so podane v slikovnih elementih, kot rotacije α je podan v radianih, končna vrednost mere podobnosti fk pa v slikovnih elementih. N določa število izračunov mere podobnosti. Vhodna slika tx ty α fk N reg_T1.png 10.99 15.96 0.000 -0.933 85 reg_T2.png 2.99 -9.00 0.000 -1.133 84 1 ind = n p . a r g m a x ( M I T 1 ) 2 x0 = [ T x 3 . f l a t t e n () [ ind ] , T y 3 . f l a t t e n () [ ind ] , 0] 3 X3CCT1 , T3CCT1 , f3CCT1 , N 3 C C T 1 = f u n k c i j e . i m R i g i d R e g i s t e r ( 4 I3SD , I3T1 , ’ MI ’ , x0 = x0 , a n i m a t e = T r u e ) 5 p r i n t ( 6 ’ P a r a m e t r i t o g e p r e s l i k a v e , ki p o r a v n a s l i k i ’ 7 ’ r e g _ S D in r e g _ T 1 : ’ 8 ’ tx ={} , ty ={} , fi ={} rad , f ={} , N ={} ’ . f o r m a t ( 9 X 3 C C T 1 [0] , X 3 C C T 1 [1] , X 3 C C T 1 [2] , f3CCT1 , N 3 C C T 1 ) ) 10 11 ind = n p . a r g m a x ( M I T 2 ) 12 x0 = [ T x 3 . f l a t t e n () [ ind ] , T y 3 . f l a t t e n () [ ind ] , 0] 13 X3CCT2 , T3CCT2 , f3CCT2 , N 3 C C T 2 = f u n k c i j e . i m R i g i d R e g i s t e r ( 14 I3SD , I3T2 , ’ MI ’ , x0 = x0 , a n i m a t e = T r u e ) 15 p r i n t ( 16 ’ P a r a m e t r i t o g e p r e s l i k a v e , ki p o r a v n a s l i k i ’ 17 ’ r e g _ S D in r e g _ T 2 : ’ 18 ’ tx ={} , ty ={} , fi ={} rad , f ={} , N ={} ’ . f o r m a t ( 19 X 3 C C T 2 [0] , X 3 C C T 2 [1] , X 3 C C T 2 [2] , f3CCT2 , N 3 C C T 2 ) ) 20 143 Geometrijska poravnava slik s postopkom optimizacije 9.2 Rešitve in odgovori na vprašanja 21 p p . s h o w () 144 Poglavje 10 Projekcije 2D slik V okviru tega poglavja si bomo podrobneje ogledali dva osnovna tipa projekcij, in sicer pravokotno ter stožčasto projekcijo (slika 10.1). Stožčasta projekcija nam dobro opiše dogajanje tekom zajema sodobnih CT in rentgenskih slik. Podrobneje bomo spoznali tudi sinogram, ki ga sestavljajo projekcije enega prečnega prereza CT slike, zajete pod različnimi koti. Posamezne projekcije sinograma predstavljajo odziv linijskega tipala, projekcijske daljice pa pot žarkov od izvora do posameznega slikovnega elementa linijskega tipala. Za rotacijo točk okoli koordinatnega izhodišča lahko uporabimo rotacijsko matriko Tr, ki smo jo podrobneje spoznali v poglavju 7: "cos # ϕ − sin ϕ Tr = sin . (10.1) ϕ cos ϕ Pri izračunu projekcije 2D slik vzdolž poljubnih projekcijskih daljic izberemo korak vzorčenja ∆ p običajno tako, da ni manjši od najmanjše razsežnosti slikovnega elementa ∆ p ≈ min(∆ x, ∆ y). Pri vzorčenju sivinskih vrednosti vzdolž projekcijskih daljic v splošnem ne naletimo na vzorčne vrednosti digitalne slike, razen ko računamo pravokotne projekcije vzdolž osnovnih koordinatnih osi slike. Zato je v splošnem potrebno sivinsko vrednost v vzorčnih točkah izračunati s pomočjo interpolacije. V okviru tega poglavja se bomo omejili na bilinearno interpolacijo, ki jo lahko izvedemo s funkcijo interp2 modula interp. 10.1 Naloge in vprašanja 1. Ustvarite funkcijo imParallelBeamProject2d, ki izračuna 1D projekcijo (odziv linijskega tipala), na katerega žarki padajo pravokotno, in sicer za kote rotacije fi med linijskim tipalom in y osjo. Predpostavite, da se vhodna slika img nahaja na mreži točk, ki jo napenjata vektorja x in y. Izvor vzporednih žarkov in linijsko tipalo naj bosta na razdalji d, število slikovnih elementov linijskega tipala naj bo n, velikost posameznega kvadratnega slikovnega elementa tipala pa pixelSize. Izračunane projekcije naj bodo shranjene v vrsticah matrike P. Korak vzorčenja v smeri projekcijskih daljic naj bo step. Parameter kind naj določa tip projekcije, in sicer maksimalne vrednosti ’max’ , vsote ’sum’ ali srednje vrednosti ’mean’. Podrobnejše informacije o geometriji prikazuje slika 10.3. 145 Projekcije 2D slik 10.1 Naloge in vprašanja Δx Δx Δy Δy Δp Δp (a) Pravokotna projekcija (b) Stožčasta projekcija Slika 10.1: Ilustracija pravokotne in stožčaste projekcije 2D slike na linijsko tipalo. (a) Testna slika (b) Prerez CT slike Slika 10.2: Testna slika proj2d_testna.png (200×200 slikovnih elementov velikosti 1×1 mm) ter prečni prerez CT slike trupa proj2d_ct.png (287 × 165 slikovnih elementov velikosti 2 × 2 mm). 1 def i m P a r a l l e l B e a m P r o j e c t 2 d ( fi , step , img , x , y , 2 d , n , p i x e l S i z e , k i n d = ’ sum ’ ) : 3 ... 4 r e t u r n P (a) Naložite testno sliko proj2d_test.png (slika 10.2), izračunajte 2D projekcije (kind=’sum’) za kote med linijskim tipalom in y osjo iz intervala [0 , 359]◦ s korakom 1◦ ter izrišite projekcije P kot sivinsko sliko. Vrednosti parametrov funkcije imParallelBeamProject2d naj bodo sledeče: d=800 mm, n=512, pixelSize=1 mm, step=2 mm, geometrično središče slike pa postavite v koordinatno izhodišče. Velikost slikovnih elementov testne slike znaša 1 × 1 mm. (b) Na enak način izračunajte še projekcije prečnega prereza CT slike trupa proj2d-146 Projekcije 2D slik 10.1 Naloge in vprašanja d/2 Tipalo fi n step x y pixelsize Slika 10.3: Pravokotna projekcija 2D prereza CT slike na linijsko tipalo. _ct.png (slika 10.2) ter izračunane projekcije prikažite kot sliko. Velikost slikovnih elementov prečnega prereza CT slike znaša 2 × 2 mm. 2. Ustvarite še funkcijo imFanBeamProject2d za izračun stožčastih projekcij, ki jih dobimo, ko na linijsko tipalo vpadajo žarki iz točkastega izvora. Pomen parametrov funkcije naj bo enak kot pod prejšnjo točko. Podrobnejše informacije o geometriji postavitve prikazuje slika 10.4. 1 def i m F a n B e a m P r o j e c t 2 d ( fi , step , img , x , y , 2 d , n , p i x e l S i z e , k i n d = ’ sum ’ ) : 3 ... 4 r e t u r n P (a) Naložite testno sliko proj2d_test.png, izračunajte 2D projekcije (kind=’sum’) za kote med linijskim tipalom in y osjo iz intervala [0 , 359]◦ s korakom 1◦ ter izrišite projekcije P kot sivinsko sliko. Vrednosti parametrov naj bodo sledeče: d=800 mm, n=512, pixelSize=1 mm, step=2 mm, geometrično središče slike pa postavite v koordinatno izhodišče. Velikost slikovnega elementa testne slike znaša 1 × 1 mm. (b) Preizkusite, kako vrednost parametra step vpliva na sinogram in kako na čas, ki ga za računanje porabi funkcija imFanBeamProject2d. (c) Izračunajte še projekcije prečnega prereza CT slike trupa proj2d_ct.png ter projekcije P prikažite kot sivinsko sliko. Velikost slikovnih elementov prečnega prereza CT slike znaša 2 × 2 mm. Izračunane projekcije predstavljajo surove podatke, ki jih zajeme CT naprava, in so osnova za rekonstrukcijo enega prečnega prereza 3D CT slike. 147 Projekcije 2D slik 10.1 Naloge in vprašanja d/2 Tipalo fi n step x y pixelsize Slika 10.4: Stožčasta projekcija 2D prereza CT slike na linijsko tipalo. (d) Programsko kodo prilagodite tako, da bodo izračuni projekcij hitri (nekaj deset ms za posamezno projekcijo), saj bomo izračunane projekcije (sinograme) potrebovali v poglavju 12, kjer jih bomo uporabili za rekonstrukcijo prereza 3D CT slike. 148 Projekcije 2D slik 10.2 Rešitve in odgovori na vprašanja 10.2 Rešitve in odgovori na vprašanja Pri odgovorih privzamemo, da se funkcije iz rešitev nahajajo v modulu funkcije, slikovno gradivo pa se nahaja v podmapi poglavje_10. Naprej uvozimo potrebne module, naložimo slike in definiramo pomožne spremenljivke. 1 i m p o r t f u n k c i j e 2 i m p o r t n u m p y as np 3 f r o m m a t p l o t l i b i m p o r t p y p l o t as pp 4 f r o m PIL i m p o r t I m a g e as im 5 i m p o r t t i m e 6 7 It = n p . a r r a y ( i m . o p e n ( ’ . / p o g l a v j e _ 1 0 / p r o j 2 d _ t e s t . p n g ’ ) ) 8 Ht , Wt = I t . s h a p e 9 xt = n p . a r a n g e ( -( Wt - 1) *0 .5 , ( Wt - 1) *0 .5 + 0 .5 , 1) 10 yt = n p . a r a n g e ( -( Ht - 1) *0 .5 , ( Ht - 1) *0 .5 + 0 .5 , 1) 11 12 Ict = n p . a r r a y ( i m . o p e n ( ’ . / p o g l a v j e _ 1 0 / p r o j 2 d _ c t . p n g ’ ) ) 13 Hct , Wct = I c t . s h a p e 14 dy , dx = 2 , 2 15 xct = n p . a r a n g e ( - dx *( Wct - 1) *0 .5 , dx *( Wct - 1) *0 .5 + 0 .5 * dx , dx ) 16 yct = n p . a r a n g e ( - dy *( Hct - 1) *0 .5 , dy *( Hct - 1) *0 .5 + 0 .5 * dy , dy ) 17 18 fi = n p . d e g 2 r a d ( n p . a r a n g e ( 3 6 0 ) ) 1. V modulu funkcije ustvarimo funkcijo imParallelBeamProject2d. 1 def i m P a r a l l e l B e a m P r o j e c t 2 d ( fi , step , image , x , y , 2 d , n , p i x e l S i z e , k i n d = ’ sum ’ ) : 3 # pripravimo vhodne podatke 4 k i n d = str ( k i n d ) . l o w e r () 5 if k i n d == ’ sum ’ : 6 fun = n p . s u m 7 e l i f k i n d == ’ max ’ : 8 fun = n p . m a x 9 e l i f k i n d == ’ m e a n ’ : 10 fun = n p . m e a n 11 e l s e : 12 r a i s e V a l u e E r r o r ( 13 ’ V r e d n o s t p a r a m e t r a " k i n d " je l a h k o " sum " ali " max " . ’ ) 14 i m a g e = n p . a s a r r a y ( image , d t y p e = n p . f l o a t ) 15 x = n p . a s a r r a y ( x , d t y p e = n p . f l o a t ) 16 y = n p . a s a r r a y ( y , d t y p e = n p . f l o a t ) 17 if i s i n s t a n c e ( fi , f l o a t ) or i s i n s t a n c e ( fi , int ) : 18 fi = [ fi ] 19 fi = n p . a s a r r a y ( fi , d t y p e = n p . f l o a t ) 20 p i x e l S i z e = f l o a t ( p i x e l S i z e ) 21 s t e p = f l o a t ( s t e p ) 22 d = f l o a t ( d ) 149 Projekcije 2D slik 10.2 Rešitve in odgovori na vprašanja 23 24 # položaj vira 25 ys = p i x e l S i z e * n p . a r a n g e ( n , d t y p e = n p . f l o a t ) 26 ys -= y s . m e a n () 27 xs = n p . t i l e ( d *0 .5 , y s . s h a p e ) 28 # položaji tipal 29 # yd = ys 30 # xd = -d*0.5 31 32 # vzorčne točke vzdolž projekcijskih daljic 33 t = n p . a r a n g e (0 , d + step , s t e p ) 34 35 # ustvari projekcijske žarke (vsak v svoji vrstici) 36 X s a m p l e s = n p . z e r o s ([ n , t . s i z e ]) 37 Y s a m p l e s = n p . z e r o s ([ n , t . s i z e ]) 38 for i in r a n g e ( n ) : 39 X s a m p l e s [ i ,:] = xs [ i ] + t *( -1 .0 ) 40 Y s a m p l e s [ i ,:] = ys [ i ] + t *(0 .0 ) 41 # vzorčne točke shranimo v dvovrstično matriko - x v prvo, y v drugo vrstico 42 pts = n p . v s t a c k ([ X s a m p l e s . f l a t t e n () , Y s a m p l e s . f l a t t e n () ]) 43 44 # ustvarimo podatkovno polje projekcij/sinograma 45 P = n p . z e r o s ([ fi.size , n ]) 46 for i in r a n g e ( f i . s i z e ) : 47 # rotiramo vzorčne točke za dani kot rotacije 48 tmp = n p . d o t ( n p . a r r a y ([ 49 [ n p . c o s ( fi [ i ]) , - n p . s i n ( fi [ i ]) ] , 50 [ n p . s i n ( fi [ i ]) , n p . c o s ( fi [ i ]) ]]) , pts ) 51 # interpolacija sivinskih vrednosti v vzorčnih točkah 52 p r o j i = i n t e r p . i n t e r p 2 ( tmp [0] , tmp [1] , x , y , i m a g e ) 53 # preoblikuj podatke tako, da so žarki v vrsticah 54 p r o j i . s h a p e = X s a m p l e s . s h a p e 55 # izvedemo zahtevano operacijo vzdolž projekcijskih daljic 56 P [ i ] = fun ( proji , 1) 57 58 r e t u r n P (a) Preizkusimo delovanje funkcije imParallelBeamProject2d na sliki proj2d_test.png. Izračunani sinogram prikazuje slika 10.5. 1 s t a r t = t i m e . p e r f _ c o u n t e r () 2 I t P S = f u n k c i j e . i m P a r a l l e l B e a m P r o j e c t 2 d ( 3 fi , 2 , It , xt , yt , 800 , 512 , 1 , ’ sum ’ ) 4 p r i n t ( ’ I z r a č un {} p r a v o k o t n i h p r o j e k c i j t e s t n e s l i k e ’ 5 ’ v {} s ’ . f o r m a t ( fi.size , t i m e . p e r f _ c o u n t e r () - s t a r t ) ) 6 7 p p . f i g u r e () 8 p p . s u p t i t l e ( ’ T e s t n a s l i k a s p r i p a d a j o č im s i n o g r a m o m - ’ 9 ’ p r a v o k o t n a p r o j e k c i j a . ’ ) 150 Projekcije 2D slik 10.2 Rešitve in odgovori na vprašanja 10 11 p p . s u b p l o t (1 , 2 , 1) 12 p p . i m s h o w ( It , c m a p = ’ g r a y ’ ) 13 14 p p . s u b p l o t (1 , 2 , 2) 15 p p . i m s h o w ( ItPS , c m a p = ’ g r a y ’ ) 16 17 p p . s h o w () Slika 10.5: Testna slika proj2d_test.png s pripadajočim sinogramom, izračunanim s pravokotno projekcijo. (b) Preizkusimo delovanje funkcije imParallelBeamProject2d še na prečnem prerezu CT slike proj2d_ct.png. Izračunani sinogram prikazuje slika 10.6. 1 s t a r t = t i m e . p e r f _ c o u n t e r () 2 I c t P S = f u n k c i j e . i m P a r a l l e l B e a m P r o j e c t 2 d ( 3 fi , 2 , Ict , xct , yct , 800 , 512 , 1 , ’ sum ’ ) 4 p r i n t ( ’ I z r a č un {} p r a v o k o t n i h p r o j e k c i j CT r e z i n e ’ 5 ’ v {} s ’ . f o r m a t ( fi.size , t i m e . p e r f _ c o u n t e r () - s t a r t ) ) 6 7 p p . f i g u r e () 8 p p . s u p t i t l e ( ’ R e z i n a CT s l i k e s p r i p a d a j o č im s i n o g r a m o m - ’ 9 ’ p r a v o k o t n a p r o j e k c i j a . ’ ) 10 11 p p . s u b p l o t (1 , 2 , 1) 12 p p . i m s h o w ( Ict , c m a p = ’ g r a y ’ ) 13 p p . s u b p l o t (1 , 2 , 2) 14 p p . i m s h o w ( IctPS , c m a p = ’ g r a y ’ ) 15 16 p p . s h o w () 2. V modulu funkcije ustvarimo funkcijo imFanBeamProject2d. 1 def i m F a n B e a m P r o j e c t 2 d ( fi , step , image , x , y , 2 d , n , p i x e l S i z e , k i n d = ’ sum ’ ) : 3 4 k i n d = str ( k i n d ) . l o w e r () 151 Projekcije 2D slik 10.2 Rešitve in odgovori na vprašanja Slika 10.6: Prečni prerez CT slike proj2d_ct.png s pripadajočim sinogramom, izračunanim s pravokotno projekcijo. 5 if k i n d == ’ sum ’ : 6 fun = n p . s u m 7 e l i f k i n d == ’ max ’ : 8 fun = n p . m a x 9 e l i f k i n d == ’ m e a n ’ : 10 fun = n p . m e a n 11 e l s e : 12 r a i s e V a l u e E r r o r ( 13 ’ V r e d n o s t p a r a m e t r a " k i n d " je l a h k o " sum " ali " max " . ’ ) 14 15 # pripravi sliko, koordinatno mrežo točk in kote 16 i m a g e = n p . a s a r r a y ( image , d t y p e = n p . f l o a t ) 17 x = n p . a s a r r a y ( x , d t y p e = n p . f l o a t ) 18 y = n p . a s a r r a y ( y , d t y p e = n p . f l o a t ) 19 if i s i n s t a n c e ( fi , f l o a t ) or i s i n s t a n c e ( fi , int ) : 20 fi = [ fi ] 21 fi = n p . a s a r r a y ( fi , d t y p e = n p . f l o a t ) 22 p i x e l S i z e = f l o a t ( p i x e l S i z e ) 23 s t e p = f l o a t ( s t e p ) 24 d = f l o a t ( d ) 25 26 # položaj vira 27 ys = 0 .0 28 xs = d *0 .5 29 # položaji tipal 30 yd = p i x e l S i z e * n p . a r a n g e ( n , d t y p e = n p . f l o a t ) 31 yd -= y d . m e a n () 32 xd = - d *0 .5 33 34 # dolžina najdaljšega žarka 35 d m a x = n p . s q r t ( yd [ 0 ] * * 2 + d * * 2 ) 36 # točke na projekcijski premici 37 t = n p . a r a n g e (0 , d m a x + step , s t e p ) 38 39 # ustvari projekcijske žarke (vsak v svoji vrstici) 152 Projekcije 2D slik 10.2 Rešitve in odgovori na vprašanja 40 X s a m p l e s = n p . z e r o s ([ n , t . s i z e ]) 41 Y s a m p l e s = n p . z e r o s ([ n , t . s i z e ]) 42 for i in r a n g e ( n ) : 43 s = n p . a r r a y ([ xd - xs , yd [ i ] - ys ]) 44 s /= n p . l i n a l g . n o r m ( s ) 45 X s a m p l e s [ i ,:] = xs + t * s [0] 46 Y s a m p l e s [ i ,:] = ys + t * s [1] 47 48 # podatkovno polje sinograma 49 P = n p . z e r o s ([ fi.size , n ]) 50 # interpolacijske točke žarkov 51 pts = n p . v s t a c k ([ X s a m p l e s . f l a t t e n () , Y s a m p l e s . f l a t t e n () ]) 52 for i in r a n g e ( f i . s i z e ) : 53 # rotiraj interpolacijske točke 54 tmp = n p . d o t ( n p . a r r a y ([ 55 [ n p . c o s ( fi [ i ]) , - n p . s i n ( fi [ i ]) ] , 56 [ n p . s i n ( fi [ i ]) , n p . c o s ( fi [ i ]) ]]) , pts ) 57 # interpoliraj 58 p r o j i = i n t e r p . i n t e r p 2 ( tmp [0] , tmp [1] , x , y , i m a g e ) 59 # preoblikuj podatke, tako da so žarki v vrsticah 60 p r o j i . s h a p e = X s a m p l e s . s h a p e 61 P [ i ] = fun ( proji , 1) 62 63 r e t u r n P (a) Preizkusimo delovanje funkcije imFanBeamProject2d na testni sliki proj2d_test.png. Izračunani sinogram prikazuje slika 10.7. 1 s t a r t = t i m e . p e r f _ c o u n t e r () 2 I t S S = f u n k c i j e . i m F a n B e a m P r o j e c t 2 d ( 3 fi , 2 , It , xt , yt , 800 , 512 , 1 , ’ sum ’ ) 4 p r i n t ( ’ I z r a č un {} sto ž č a s t i h p r o j e k c i j t e s t n e s l i k e ’ 5 ’ v {} s ’ . f o r m a t ( fi.size , t i m e . p e r f _ c o u n t e r () - s t a r t ) ) 6 7 p p . f i g u r e () 8 p p . s u p t i t l e ( ’ T e s t n a s l i k a s p r i p a d a j o č im s i n o g r a m o m - ’ 9 ’ sto ž č a s t a p r o j e k c i j a . ’ ) 10 11 p p . s u b p l o t (1 , 2 , 1) 12 p p . i m s h o w ( It , c m a p = ’ g r a y ’ ) 13 14 p p . s u b p l o t (1 , 2 , 2) 15 p p . i m s h o w ( ItSS , c m a p = ’ g r a y ’ ) 16 17 p p . s h o w () (b) Ocenimo še vpliv vzorčnega koraka na izračun sinogramov (slika 10.8 ter tabela 10.1). 1 s t e p = [1 .0 , 2 .0 , 4 .0 , 8 .0 ] 2 TSS = [] 153 Projekcije 2D slik 10.2 Rešitve in odgovori na vprašanja Slika 10.7: Testna slika proj2d_test.png s pripadajočim sinogramom, izračunanim s stožčasto projekcijo. 3 I S S t = [] 4 5 p p . f i g u r e () 6 p p . s u p t i t l e ( ’ S i n o g r a m t e s t n e s l i k e ’ 7 ’ v o d v i s n o s t i od k o r a k a v z o r č e n j a . ’ ) 8 for s t e p i in s t e p : 9 s t a r t = t i m e . p e r f _ c o u n t e r () 10 s = f u n k c i j e . i m F a n B e a m P r o j e c t 2 d ( 11 fi , stepi , It , xt , yt , 800 , 512 , 1 , ’ sum ’ ) 12 T S S . a p p e n d ( t i m e . p e r f _ c o u n t e r () - s t a r t ) 13 I S S t . a p p e n d ( s ) 14 p p . s u b p l o t (1 , 4 , len ( TSS ) ) 15 p p . i m s h o w ( s , c m a p = ’ g r a y ’ ) 16 p p . t i t l e ( ’ K o r a k v z o r č e n j a {: .1f } mm v {: .1f } s ’ . f o r m a t ( 17 stepi , TSS [ -1]) ) 18 19 p p . s h o w () (a) 1 mm (b) 2 mm (c) 4 mm (d) 8 mm Slika 10.8: Vpliv koraka vzorčenja na izračun sinogramov. Tabela 10.1: Vpliv koraka vzorčenja na čas izračuna sinogramov. Korak (mm) 1 2 4 8 Čas (s) 55.1 27.2 13.4 6.7 154 Projekcije 2D slik 10.2 Rešitve in odgovori na vprašanja (c) Preizkusimo delovanje funkcije imFanBeamProject2d še na prečnem prerezu CT slike proj2d_ct.png. Izračunani sinogram prikazuje slika 10.9 1 s t a r t = t i m e . p e r f _ c o u n t e r () 2 I c t S S = f u n k c i j e . i m F a n B e a m P r o j e c t 2 d ( 3 fi , 2 , Ict , xct , yct , 800 , 512 , 1 , ’ sum ’ ) 4 p r i n t ( ’ I z r a č un {} sto ž č a s t i h p r o j e k c i j CT r e z i n e v ’ 5 ’ {} s ’ . f o r m a t ( fi.size , t i m e . p e r f _ c o u n t e r () - s t a r t ) ) 6 7 p p . f i g u r e () 8 p p . s u p t i t l e ( ’ R e z i n a CT s l i k e s p r i p a d a j o č im s i n o g r a m o m - ’ 9 ’ sto ž č a s t a p r o j e k c i j a . ’ ) 10 11 p p . s u b p l o t (1 , 2 , 1) 12 p p . i m s h o w ( Ict , c m a p = ’ g r a y ’ ) 13 14 p p . s u b p l o t (1 , 2 , 2) 15 p p . i m s h o w ( IctSS , c m a p = ’ g r a y ’ ) 16 17 p p . s h o w () Slika 10.9: Prečni prerez CT slike proj2d_ct.png s pripadajočim sinogramom, izračunanim s stožčasto projekcijo. (d) Glej implementacijo funkcij imParallelBeamProject2d in imFanBeamProject2d v modulu funkcije. 155 Projekcije 2D slik 10.2 Rešitve in odgovori na vprašanja 156 Poglavje 11 Projekcije 3D slik V poglavju 10 smo si podrobneje ogledali pravokotne in stožčaste projekcije 2D slik. V tem poglavju bomo pristop posplošili na 2D pravokotne in stožčaste projekcije 3D slik (slika 11.1). Pri obravnavi sledimo že opisanim postopkom projekcije 2D slik. Korak vzorčenja ∆ p v smeri projekcijskih daljic izberemo tako, da ustreza najmanjši velikosti slikovnega elementa ∆ p ≈ min(∆ x, ∆ y, ∆ z). Pri vzorčenju sivinskih vrednosti vzdolž projekcijskih daljic v splo- šnem ne naletimo na vzorčne vrednosti digitalne slike, zato je potrebno sivinske vrednosti v vzorčnih točkah izračunati z interpolacijo. V okviru tega poglavja se bomo omejili na trilinearno interpolacijo, ki je udejanjena v funkciji interp3 modula interp. Za rotacijo točk okoli z koordinatne osi, ki sovpada z osjo CT naprave, bomo uporabili 3D rotacijsko matriko Tz: cos  γ − sin γ 0 T   z = sin γ cos γ 0 . (11.1)   0 0 1 tipalo rotacijska os (z) 3D slika izvor Slika 11.1: Ilustracija stožčaste projekcije 3D slike na 2D tipalo. 157 Projekcije 3D slik 11.1 Naloge in vprašanja 11.1 Naloge in vprašanja 1. Ustvarite funkcijo imParallelBeamProject3d, ki izračuna pravokotne 2D projekcije za kote rotacije fi med senzorskim poljem in y osjo. Predpostavite, da se vhodna 3D slika img nahaja na mreži točk, ki jo napenjajo vektorji x, y in z. Izvor vzporednih žarkov in tipalo naj bosta oddaljena za d, število slikovnih elementov tipala, ki se nahaja v yz ravnini, naj bo ny×nz, velikost kvadratnih slikovnih elementov tipala pa pixelSize. Os tipala naj sovpada z x koordinatno osjo. Izračunane projekcije naj bodo shranjene v 3D polju P, in sicer tako, da tretja razsežnost polja predstavlja kote rotacije fi. Korak vzorčenja v smeri projekcijskih daljic naj določa parameter step. Parameter kind naj določa tip projekcije, in sicer maksimalne vrednosti kind=’max’ ali vsote sivinskih vrednosti kind=’sum’. Podrobnejše informacije o geometriji prikazuje slika 11.2. 1 def i m P a r a l l e l B e a m P r o j e c t 3 d ( 2 fi , step , image , x , y , z , 3 d , ny , nz , p i x e l S i z e , k i n d = ’ max ’ ) : 4 ... 5 r e t u r n P d/2 e Tipalo nz x=- d/2 ny pixelSiz ny step z x x z fi y pixelsize y Slika 11.2: Pravokotna projekcija 3D CT slike na 2D tipalo, prikazana v yz ravnini. (a) S funkcijo imLoadRaw3d naložite 3D CT sliko ct_287x165x194_uint8.raw velikosti 287 × 165 × 194 slikovnih elementov tipa np.uint8, ki so shranjeni v vrstnem redu order=’xyz’, ter izračunajte 2D projekcijo maksimalne vrednosti za kot fi=90◦ med ravnino tipala in y koordinatno osjo. Izrišite izračunano projekcijo. Vrednosti parametrov naj bodo sledeče: d=800 mm, ny=128, nz=128, pixelSize=10 mm, step=2 mm, geometrično središče 3D CT slike pa postavite v koordinatno izhodišče. Velikost slikovnega elementa slike je 2 × 2 × 4 mm. 158 Projekcije 3D slik 11.1 Naloge in vprašanja (b) Na enak način izračunajte še zaporedje projekcij 3D CT slike za kote fi iz intervala [0 , 355]◦ s korakom 5◦ ter projekcije prikažite kot neskončno animacijo, kjer v isto grafično okno zaporedoma izrisujete posamezne projekcije. Ko izrišete zadnjo projekcijo, animacijo ponovite. 2. Ustvarite še funkcijo imFanBeamProject3D, ki izračuna stožčaste 2D projekcije. Pomen parametrov funkcije je enak kot pod prejšnjo točko. Podrobnejše informacije o geometriji projekcije prikazuje slika 11.3. 1 def i m F a n B e a m P r o j e c t 3 D ( 2 fi , step , 3 iImg , iGridX , iGridY , iGridZ , 4 image , x , y , z , 5 d , ny , nz , p i x e l S i z e , k i n d = ’ max ’ ) : 6 ... 7 r e t u r n P d/2 e Tipalo nx x=- d/2 ny pixelSiz ny step z x x z fi y pixelsize y Slika 11.3: Stožčasta projekcija 3D CT slike na 2D tipalo, prikazana v yz ravnini. (a) Naložite 3D CT sliko ct_287x165x194_uint8.raw, izračunajte 2D projekcij maksimalne vrednosti za kot fi=90◦ med ravnino senzorja in y koordinatno osjo ter izri- šite projekcijo P. Vrednosti parametrov naj bodo sledeče: d=800 mm, ny=128, nz=128, pixelSize=20 mm, step=2 mm, geometrično središče 3D CT slike pa postavite v koordinatno izhodišče. (b) Preizkusite, kako vrednost parametra step vpliva na izračunano projekcijo in kako na čas, ki ga za izračun projekcije porabi funkcija imFanBeamProject3D. (c) Izračunajte še zaporedje projekcij 3D CT slike za kote fi iz intervala [0 , 355]◦ s korakom 5◦ ter projekcije prikažite kot neskončno animacijo, kjer v isto grafično okno 159 Projekcije 3D slik 11.1 Naloge in vprašanja zaporedoma izrisujete posamezne projekcije. Ko izrišete zadnjo projekcijo, animacijo ponovite. 160 Projekcije 3D slik 11.2 Rešitve in odgovori na vprašanja 11.2 Rešitve in odgovori na vprašanja Pri odgovorih privzamemo, da se funkcije iz rešitev nahajajo v modulu funkcije, slikovno gradivo pa se nahaja v podmapi poglavje_11. Naprej uvozimo potrebne module, naložimo slike in definiramo pomožne spremenljivke. 1 i m p o r t f u n k c i j e 2 i m p o r t n u m p y as np 3 f r o m m a t p l o t l i b i m p o r t p y p l o t as pp 4 f r o m PIL i m p o r t I m a g e as im 5 i m p o r t t i m e 6 7 # naložimo 3D CT sliko 8 Ict = f u n k c i j e . i m L o a d R a w 3 d ( 9 ’ . / p o g l a v j e _ 1 1 / c t _ 2 8 7 x 1 6 5 x 1 9 4 _ u i n t 8 . r a w ’ , 10 287 , 165 , 1 9 4 ) 11 D , H , W = I c t . s h a p e # velikost slike 12 dz , dy , dx = 4 .0 , 2 .0 , 2 .0 13 # določimo vektorje, ki napenjajo koordinate slikovnih elementov 14 x = n p . a r a n g e ( - dx *( W - 1) *0 .5 , dx *( W - 1) *0 .5 + 0 .5 * dx , dx ) 15 y = n p . a r a n g e ( - dy *( H - 1) *0 .5 , dy *( H - 1) *0 .5 + 0 .5 * dy , dy ) 16 z = n p . a r a n g e ( - dz *( D - 1) *0 .5 , dz *( D - 1) *0 .5 + 0 .5 * dz , dz ) 17 18 # koti za katere bomo izračunali projekcije 19 fi = n p . d e g 2 r a d ( n p . a r a n g e (0 .0 , 360 .0 , 5) ) 1. V modulu funkcije ustvarimo funkcijo imParallelBeamProject3D. 1 def i m P a r a l l e l B e a m P r o j e c t 3 D ( 2 fi , step , image , x , y , z , 3 d , ny , nz , p i x e l S i z e , k i n d = ’ sum ’ ) : 4 5 k i n d = str ( k i n d ) . l o w e r () 6 if k i n d == ’ sum ’ : 7 fun = n p . s u m 8 e l i f k i n d == ’ max ’ : 9 fun = n p . m a x 10 e l s e : 11 r a i s e V a l u e E r r o r ( ’ V r e d n o s t p a r a m e t e r a k i n d je l a h k o ’ 12 ’ " max " ali " sum " . ’ ) 13 14 # pripravi sliko, koordinatno mrežo točk in kote 15 im = n p . a s a r r a y ( image , d t y p e = ’ f l o a t ’ ) 16 x = n p . a s a r r a y ( x , d t y p e = ’ f l o a t ’ ) 17 y = n p . a s a r r a y ( y , d t y p e = ’ f l o a t ’ ) 18 z = n p . a s a r r a y ( z , d t y p e = ’ f l o a t ’ ) 19 if i s i n s t a n c e ( fi , f l o a t ) : fi = [ fi ] 20 fi = n p . a s a r r a y ( fi ) . a s t y p e ( ’ f l o a t ’ ) 21 161 Projekcije 3D slik 11.2 Rešitve in odgovori na vprašanja 22 # vektorja, ki napenjata pozicije tipal 23 yd = p i x e l S i z e *( n p . a r a n g e ( ny ) ) 24 yd -= y d . m e a n () 25 zd = p i x e l S i z e * n p . a r a n g e ( nz ) 26 zd -= z d . m e a n () 27 28 # pozicije tipal 29 Zd , Yd = n p . m e s h g r i d ( zd , yd , i n d e x i n g = ’ ij ’ ) 30 # Xd = -d*0.5 31 32 # pozicije izvorov 33 Xs = d *0 .5 34 Ys , Zs = Yd , Zd 35 36 # korak vzorčenja 37 d m a x = d 38 t = n p . a r a n g e (0 , dmax , s t e p ) 39 n = t . s i z e 40 41 # ustvarimo daljice vzdolž katerih vzorčimo 3D sliko 42 X s a m p l e s = n p . z e r o s ([ nz , ny , n ]) 43 Y s a m p l e s = n p . z e r o s _ l i k e ( X s a m p l e s ) 44 Z s a m p l e s = n p . z e r o s _ l i k e ( X s a m p l e s ) 45 # smerni vektor vzorčnih daljic s = [-1, 0, 0] 46 for i in r a n g e ( nz ) : 47 for j in r a n g e ( ny ) : 48 X s a m p l e s [ i , j ,:] = Xs + ( -1) * t 49 Y s a m p l e s [ i , j ,:] = Ys [ i , j ] + (0) * t 50 Z s a m p l e s [ i , j ,:] = Zs [ i , j ] + (0) * t 51 52 # izračunamo sivine vzdolž točk projekcijskih daljic (tretja razsežnost) 53 P = n p . z e r o s ([ nz , ny , f i . s i z e ]) 54 t m p p t s = n p . v s t a c k ([ X s a m p l e s . f l a t t e n () , 55 Y s a m p l e s . f l a t t e n () , Z s a m p l e s . f l a t t e n () ]) 56 for i in r a n g e ( f i . s i z e ) : 57 # rotiraj interpolacijske točke 58 tmp = n p . d o t ( 59 n p . a r r a y ([[ n p . c o s ( fi [ i ]) , - n p . s i n ( fi [ i ]) , 0 .0 ] , 60 [ n p . s i n ( fi [ i ]) , n p . c o s ( fi [ i ]) , 0 .0 ] , 61 [0 , 0 .0 , 1 .0 ]]) , t m p p t s ) 62 # intepolacija 63 p r o j i = i n t e r p . i n t e r p 3 ( tmp [0] , tmp [1] , tmp [2] , x , y , z , im ) 64 p r o j i . s h a p e = X s a m p l e s . s h a p e 65 # integriraj (ali max) vzdolž daljice 66 P [: ,: , i ] = fun ( proji , 2) 67 68 r e t u r n P (a) Izračunamo projekcijo za kot fi=90◦ med ravnino tipala in y koordinatno osjo (slika 162 Projekcije 3D slik 11.2 Rešitve in odgovori na vprašanja Slika 11.4: Pravokotna projekcija pri kotu 90◦ . 11.4). 1 I c t P 9 0 = f u n k c i j e . i m P a r a l l e l B e a m P r o j e c t 3 D ( 2 n p . d e g 2 r a d ( 9 0 ) , 2 .0 , 3 Ict , x , y , z , 800 .0 , 128 , 128 , 10 .0 , ’ max ’ ) 4 5 p p . f i g u r e () 6 p p . i m s h o w ( n p . s q u e e z e ( I c t P 9 0 ) , c m a p = ’ g r a y ’ ) 7 p p . t i t l e ( ’ P r a v o k o t n a p r o j e k c i j a 90 ’ ) 8 p p . s h o w () (b) Izračunamo projekcije za kote fi iz intervala [0 , 355]◦ s korakom 5◦ (slika 11.5). 1 s t a r t = t i m e . p e r f _ c o u n t e r () 2 I c t P = f u n k c i j e . i m P a r a l l e l B e a m P r o j e c t 3 D ( 3 fi , 2 .0 , Ict , x , y , z , 800 .0 , 128 , 128 , 10 .0 , ’ max ’ ) 4 dt = t i m e . p e r f _ c o u n t e r () - s t a r t 5 p r i n t ( ’ {} p r a v o k o t n i h p r o j e k c i j i z r a č u n a n i h v ’ 6 ’ {: .1f } s. ’ . f o r m a t ( fi.size , dt ) ) 7 8 p p . f i g u r e () 9 p p . i o n () 10 11 frame , t i t l e = None , N o n e 12 for i in r a n g e ( I c t P . s h a p e [ 2 ] ) : 13 if f r a m e is N o n e : 14 f r a m e = p p . i m s h o w ( 15 I c t P [: ,: , i ] , v m i n =0 , v m a x =255 , c m a p = ’ g r a y ’ ) 16 e l s e : 17 f r a m e . s e t _ a r r a y ( I c t P [: ,: , i ]) 18 19 if t i t l e is N o n e : 20 t i t l e = p p . t i t l e ( ’ Fi : {: .0f } ’ . f o r m a t ( n p . r a d 2 d e g ( fi [ i ]) ) ) 21 e l s e : 22 t i t l e . s e t _ t e x t ( ’ Fi : {: .0f } ’ . f o r m a t ( n p . r a d 2 d e g ( fi [ i ]) ) ) 23 24 p p . d r a w () 163 Projekcije 3D slik 11.2 Rešitve in odgovori na vprašanja (a) 0◦ (b) 90◦ (c) 180◦ (d) 270◦ Slika 11.5: Primer pravokotnih projekcij za kote rotacije 0◦, 90◦, 180◦ in 270◦. 25 p p . p a u s e ( .1 ) 26 27 p p . i o f f () 2. V modulu funkcije ustvarimo funkcijo imFanBeamProject3D. 1 def i m F a n B e a m P r o j e c t 3 D ( 2 fi , step , image , x , y , z , 3 d , ny , nz , p i x e l S i z e , k i n d = ’ max ’ ) : 4 5 k i n d = str ( k i n d ) . l o w e r () 6 if k i n d == ’ sum ’ : 7 fun = n p . s u m 8 e l i f k i n d == ’ max ’ : 9 fun = n p . m a x 10 e l s e : 11 r a i s e V a l u e E r r o r ( ’ V r e d n o s t p a r a m e t e r a k i n d je l a h k o ’ 12 ’ " max " ali " sum " . ’ ) 13 14 # pripravi sliko, koordinatno mrežo točk in kote 15 im = n p . a s a r r a y ( image , d t y p e = ’ f l o a t ’ ) 16 x = n p . a s a r r a y ( x , d t y p e = ’ f l o a t ’ ) 17 y = n p . a s a r r a y ( y , d t y p e = ’ f l o a t ’ ) 18 z = n p . a s a r r a y ( z , d t y p e = ’ f l o a t ’ ) 19 if i s i n s t a n c e ( fi , f l o a t ) : 20 fi = [ fi ] 21 fi = n p . a s a r r a y ( fi ) . a s t y p e ( ’ f l o a t ’ ) 22 23 # vektorja, ki napenjata pozicije tipal 24 yd = p i x e l S i z e *( n p . a r a n g e ( ny ) ) 25 yd -= y d . m e a n () 26 zd = p i x e l S i z e * n p . a r a n g e ( nz ) 27 zd -= z d . m e a n () 28 29 # pozicije tipal 30 Zd , Yd = n p . m e s h g r i d ( zd , yd , i n d e x i n g = ’ ij ’ ) 31 Xd = - d *0 .5 164 Projekcije 3D slik 11.2 Rešitve in odgovori na vprašanja 32 33 # pozicije izvorov 34 Xs = d *0 .5 35 Ys , Zs = 0 .0 , 0 .0 36 37 # korak vzorčenja 38 d m a x = d 39 t = n p . a r a n g e (0 , dmax , s t e p ) 40 n = t . s i z e 41 42 # ustvarimo daljice vzdolž katerih vzorčimo 3D sliko 43 X s a m p l e s = n p . z e r o s ([ nz , ny , n ]) 44 Y s a m p l e s = n p . z e r o s _ l i k e ( X s a m p l e s ) 45 Z s a m p l e s = n p . z e r o s _ l i k e ( X s a m p l e s ) 46 # smerni vektor vzorčnih daljic s = [-1, 0, 0] 47 for i in r a n g e ( nz ) : 48 for j in r a n g e ( ny ) : 49 # smerni vektor žarka 50 s = n p . a r r a y ([ Xd - Xs , Yd [ i , j ] - Ys , Zd [ i , j ] - Zs ] , 51 d t y p e = ’ f l o a t ’ ) 52 s /= n p . l i n a l g . n o r m ( s ) 53 X s a m p l e s [ i , j ,:] = Xs + s [ 0 ] * t 54 Y s a m p l e s [ i , j ,:] = Ys + s [ 1 ] * t 55 Z s a m p l e s [ i , j ,:] = Zs + s [ 2 ] * t 56 57 # izračunamo sivine vzdolž točk projekcijskih daljic (tretja razsežnost) 58 P = n p . z e r o s ([ nz , ny , f i . s i z e ]) 59 t m p p t s = n p . v s t a c k ([ X s a m p l e s . f l a t t e n () , 60 Y s a m p l e s . f l a t t e n () , Z s a m p l e s . f l a t t e n () ]) 61 for i in r a n g e ( f i . s i z e ) : # rotiraj interpolacijske točke 62 tmp = n p . d o t ( 63 n p . a r r a y ([[ n p . c o s ( fi [ i ]) , - n p . s i n ( fi [ i ]) , 0 .0 ] , 64 [ n p . s i n ( fi [ i ]) , n p . c o s ( fi [ i ]) , 0 .0 ] , 65 [0 , 0 .0 , 1 .0 ]]) , t m p p t s ) 66 # intepolacija 67 p r o j i = i n t e r p . i n t e r p 3 ( tmp [0] , tmp [1] , tmp [2] , x , y , z , im ) 68 p r o j i . s h a p e = X s a m p l e s . s h a p e 69 # integriraj (ali max) vzdolž daljice 70 P [: ,: , i ] = fun ( proji , 2) 71 72 r e t u r n P (a) Izračunamo projekcijo za kot fi=90◦ med ravnino tipala in y koordinatno osjo (slika 11.6). 1 I c t S 9 0 = f u n k c i j e . i m F a n B e a m P r o j e c t 3 D ( 2 n p . d e g 2 r a d ( 9 0 ) , 2 .0 , 3 Ict , x , y , z , 800 .0 , 128 , 128 , 20 .0 , ’ max ’ ) 4 165 Projekcije 3D slik 11.2 Rešitve in odgovori na vprašanja Slika 11.6: Stožčasta projekcija pri kotu 90◦ . 5 p p . f i g u r e () 6 p p . i m s h o w ( n p . s q u e e z e ( I c t S 9 0 ) , c m a p = ’ g r a y ’ ) 7 p p . t i t l e ( ’ P r a v o k o t n a p r o j e k c i j a 90 ’ ) 8 p p . s h o w () (b) Ovrednotimo vpliv velikosti vzorčnega koraka step na izračun projekcij (slika 11.7) in čas, ki ga porabi funkcija imFanBeamProject3d za izračun projekcije (tabela 11.1 in slika 11.8). Izručune projekcij lahko izdatno pospešimo z uporabo grafičnih procesnih enot [9]. 1 s t e p s = [1 , 2 , 4 , 8] 2 I c t S T = [] 3 TSo = [] 4 T S f b = [] 5 p p . f i g u r e () 6 p p . s u p t i t l e ( ’ V p l i v v z o r č n e g a k o r a k a na i z r a č un p r o j e k c i j . ’ ) 7 8 for i in r a n g e ( len ( s t e p s ) ) : 9 s t a r t = t i m e . p e r f _ c o u n t e r () 10 f u n k c i j e . i m P a r a l l e l B e a m P r o j e c t 3 D ( 11 n p . d e g 2 r a d ( 9 0 ) , s t e p s [ i ] , 12 Ict , x , y , z , 800 .0 , 128 , 128 , 10 .0 , ’ max ’ ) 13 T S o . a p p e n d ( t i m e . p e r f _ c o u n t e r () - s t a r t ) 14 p r i n t ( ’ P r a v o k o t n a p r o j e k c i j a s k o r a k o m v z o r č e n j a {} mm ’ 15 ’ i z r a č u n a n a v {: .0f } ms ’ . f o r m a t ( 16 s t e p s [ i ] , TSo [ - 1 ] * 1 0 0 0 ) ) 17 18 s t a r t = t i m e . p e r f _ c o u n t e r () 19 tmp = f u n k c i j e . i m F a n B e a m P r o j e c t 3 D ( 20 n p . d e g 2 r a d ( 9 0 ) , s t e p s [ i ] , 21 Ict , x , y , z , 800 .0 , 128 , 128 , 20 .0 , ’ max ’ ) 22 I c t S T . a p p e n d ( n p . s q u e e z e ( tmp ) ) 23 T S f b . a p p e n d ( t i m e . p e r f _ c o u n t e r () - s t a r t ) 24 p r i n t ( ’ Sto ž č a s t a p r o j e k c i j a s k o r a k o m v z o r č e n j a {} mm ’ 25 ’ i z r a č u n a n a v {: .0f } ms ’ . f o r m a t ( 26 s t e p s [ i ] , T S f b [ - 1 ] * 1 0 0 0 ) ) 166 Projekcije 3D slik 11.2 Rešitve in odgovori na vprašanja (a) 1 mm (b) 2 mm (c) 4 mm (d) 8 mm Slika 11.7: Vpliv koraka vzorčenja na stožčaste projekcije pri kotu rotacije 90◦. 27 p p . s u b p l o t (1 , 4 , i + 1) 28 p p . i m s h o w ( I c t S T [ -1] , c m a p = ’ g r a y ’ ) 29 p p . t i t l e ( ’ {} mm ’ . f o r m a t ( s t e p s [ i ]) ) 30 31 p p . s h o w () Tabela 11.1: Vpliv koraka vzorčenja na čas potreben za izračun projekcije. Korak vzorčenja (mm) Projekcija 1 2 4 8 Pravokotna 1.67 s 0.89 s 0.56 s 0.36 s Stožčasta 1.95 s 1.15 s 0.76 s 0.57 s 1.0 čas pravokotna stožčasta 0.5 rmalizirani No 0.0 2 4 6 8 Korak vzorčenja (mm) Slika 11.8: Vpliv koraka vzorčenja na časovno učinkovitost izračuna projekcij. (c) Izračunamo projekcije za kote fi iz intervala [0 , 355]◦ s korakom 5◦ (slika 11.9). 1 s t a r t = t i m e . p e r f _ c o u n t e r () 2 I c t S = f u n k c i j e . i m F a n B e a m P r o j e c t 3 D ( 3 fi , 2 .0 , Ict , x , y , z , 800 .0 , 128 , 128 , 20 .0 , ’ max ’ ) 4 dt = t i m e . p e r f _ c o u n t e r () - s t a r t 5 p r i n t ( ’ {} sto ž č a s t i h p r o j e k c i j i z r a č u n a n i h ’ 6 ’ v {: .1f } s. ’ . f o r m a t ( fi.size , dt ) ) 167 Projekcije 3D slik 11.2 Rešitve in odgovori na vprašanja (a) 0◦ (b) 90◦ (c) 180◦ (d) 270◦ Slika 11.9: Primeri stožčastih projekcij za kote rotacije 0◦, 90◦, 180◦ in 270◦. 7 8 p p . f i g u r e () 9 p p . i o n () 10 11 frame , t i t l e = None , N o n e 12 for i in r a n g e ( I c t S . s h a p e [ 2 ] ) : 13 if f r a m e is N o n e : 14 f r a m e = p p . i m s h o w ( 15 I c t S [: ,: , i ] , v m i n =0 , v m a x =255 , c m a p = ’ g r a y ’ ) 16 e l s e : 17 f r a m e . s e t _ a r r a y ( I c t S [: ,: , i ]) 18 19 if t i t l e is N o n e : 20 t i t l e = p p . t i t l e ( ’ Fi : {: .0f } ’ . f o r m a t ( n p . r a d 2 d e g ( fi [ i ]) ) ) 21 e l s e : 22 t i t l e . s e t _ t e x t ( ’ Fi : {: .0f } ’ . f o r m a t ( n p . r a d 2 d e g ( fi [ i ]) ) ) 23 24 p p . d r a w () 25 p p . p a u s e ( .1 ) 26 27 p p . i o f f () 168 Poglavje 12 Rekonstrukcija slik s povratno projekcijo V poglavjih 10 in 11 smo si podrobneje ogledali pravokotne in stožčaste projekcije 2D in 3D slik. V tem poglavju bomo obravnavali inverzni problem, in sicer rekonstrukcijo slike objekta na osnovi množice projekcij. Podrobnejšo obravnavo tematike lahko najdete v [10]. Eden od načinov rekonstrukcije slik je uporaba postopka povratne projekcije (angl. backprojection). Povratno projekcijo izvedemo tako, da vzdolž daljic od tipala do izvora vsakemu slikovnemu elementu rekonstruirane slike prištejemo pripadajočo sivinsko vrednost projekcije. Postopek ponovimo za vse projekcije, ki so določene s kotom rotacije ϕ. Eno izmed možnih izvedb opisanega postopka prikazuje slika 12.1. Pri takšni izvedbi postopka povratne projekcije središče vsakega izmed slikovnih elementov rekonstruirane slike pravokotno ali stožčasto projiciramo na linijsko tipalo. Na ta način dobljene točke (projekcije) v splošnem ne sovpadajo s koordinatami središč posameznih slikovnih elementov linijskega tipala, zato je potrebno sivinske vrednosti v projiciranih točkah določiti z 1D interpolacijo. Interpolirane sivinske vrednosti nato prištejemo pripadajočim slikovnim elementom rekonstruirane slike in postopek ponovimo za vse projekcije. Za določanje povratne projekcije pri poljubnem projekcijskem kotu je potrebno vzorčne točke rekonstruirane slike ustrezno rotirati okoli koordinatnega izhodišča. V ta namen lahko uporabimo rotacijsko matriko Tr: "cos # ϕ − sin ϕ Tr = sin . (12.1) ϕ cos ϕ S povratno projekcijo dobimo rekonstruirano sliko, ki je zamegljena (slika 12.3) in neprimerna za uporabo. Nastalo težavo rešimo tako, da uporabimo postopek s filtrirano povratno projekcijo (angl. filtered backprojection), pri kateremu signal projekcije filtriramo z visoko-prepustnim sitom in šele nato izvedemo povratno projekcijo. Tipična jedra tovrstnih 1D visoko-prepustnih filtrov so prikazana na sliki 12.2. Celotno rekonstrukcijo slike lahko povzamemo v treh točkah: 1. izvedemo konvolucijo med jedrom izbranega visoko-prepustnega filtra in danimi projekcijami, 2. določimo vzorčno mrežo točk rekonstruirane slike in 169 Rekonstrukcija slik s povratno projekcijo 12.1 Naloge in vprašanja Slikovni Slikovni Tipalo element Tipalo element Δy φ Δy φ Δx Izvor Δx Slika 12.1: Pravokotna in stožčasta povratna projekcija. (a) Klančinski (b) Shepp-Loganov (c) Kosinusni (d) Hammingov (e) Hannov Slika 12.2: Primeri visoko-prepustnih sit za filtriranje projekcij. 3. z opisanim postopkom izvedemo povratne projekcije vseh filtriranih projekcij. Primer slike s pripadajočim sinogramom in rekonstrukcijo na osnovi tega sinograma z in brez filtriranja, je prikazan na sliki 12.3. (a) CT prerez (b) Sinogram (c) PP (d) Filtrirana PP Slika 12.3: Prerez CT slike s pripadajočim sinogramom in povratnima projekcijama (PP). 12.1 Naloge in vprašanja 1. Ustvarite funkcijo imParallelBeamBackproject2d, ki izračuna vsoto pravokotnih povratnih projekcij, in sicer za kote rotacije fi med linijskim tipalom in y osjo. Izvor vzporednih žarkov in tipalo naj bosta oddaljena za d, število slikovnih elementov linijskega tipala, ki se nahaja pri y = d/ 2, naj bo n, velikost kvadratnih slikovnih elementov tipala pa pixelSize. V vrsticah podatkovnega polja sinogram naj se nahajajo 1D projekcije za vse 170 Rekonstrukcija slik s povratno projekcijo 12.1 Naloge in vprašanja kote fi. Predpostavite, da se izhodna 2D slika img nahaja na mreži točk, ki jo napenjata vektorja x in y. 1 def i m P a r a l l e l B e a m B a c k p r o j e c t 2 d ( fi , s i n o g r a m , x , y , 2 d , n , p i x e l S i z e ) : 3 ... 4 r e t u r n img (a) Naložite sintetično sliko bproj_test.png in s funkcijo imParallelBeamProject2d izra- čunajte 2D pravokotne projekcije oziroma sinogram za kote fi iz intervala [0 , 359]◦ s korakom 1◦. Velikost slikovnega elementa testne slike znaša 1 × 1 mm. Sinogram testne slike uporabite za rekonstrukcijo s povratno projekcijo (d=1000 mm, n=512, pixelSize=1 mm). (b) Na enak način izračunajte še 2D pravokotne projekcije prečnega prereza CT slike trupa bproj_ct.png. Velikost slikovnega elementa prereza CT slike znaša 2 × 2 mm. Sinogram CT prereza uporabite za rekonstrukcijo s povratno projekcijo (d=1000 mm, n=512, pixelSize=2 mm). 2. Ustvarite še funkcijo imFanBeamBackproject2d, ki izračuna vsoto stožčastih povratnih projekcij. Pomen parametrov naj bo enak enak kot pri funkciji imParallelBeamBackproject2d pod prejšnjo točko. 1 def i m F a n B e a m B a c k p r o j e c t 2 d ( fi , s i n o g r a m , x , y , 2 d , n , p i x e l S i z e ) : 3 ... 4 r e t u r n img (a) Naložite 2D sintetično sliko bproj_test.png in s funkcijo imFanBeamProject2D izračunajte 2D stožčaste projekcije povprečne vrednosti oz. sinogram za kote fi iz intervala [0 , 359]◦ s korakom 1◦. Izračunani sinogram testne slike uporabite za rekonstrukcijo s povratno projekcijo s funkcijo imFanBeamBackproject2d (d=1000 mm, n=512, pixelSize=1 mm). (b) Na enak način izračunajte še 2D stožčaste projekcije prečnega prereza CT slike trupa bproj_ct.png. Izračunani sinogram CT prereza uporabite za rekonstrukcijo s povratno projekcijo s funkcijo imParallelBeamBackproject2d (d=1000 mm, n=512, pixelSize=2 mm). 3. Uporabite priloženo funkcijo create modula hpfilter, da ustvarite izbrano jedro 1D visoko-prepustnega sita. Z vrednostjo parametra kind določite tip filtra, ki je lahko ’ramp’, ’shepp-logan’, ’cosine’, ’hamming’ ali ’hann’. S pomočjo funkcije convolve modula scipy izračunajte konvolucijo med jedrom 1D filtra in posameznimi projekcijami v sinogramih, ki ste jih ustvarili pri prejšnjih točkah. (a) Filtrirane sinograme prikažite in jih primerjajte z izvirnimi. 171 Rekonstrukcija slik s povratno projekcijo 12.1 Naloge in vprašanja (b) Ponovno izračunajte povratni projekciji testne slike in CT prereza, a tokrat uporabite filtrirane sinograme. Kako in zakaj filtrirani sinogrami vplivajo na kvaliteto rekonstruiranih slik? 4. Preučite vpliv števila in izbire 1D projekcij na kvaliteto rekonstruiranih slik. Projekcije vzorčite po kotu ϕ s korakom 1◦, 2◦, 4◦ in 8◦. Prikažite povratne projekcije prereza CT slike in obrazložite vpliv koraka vzorčenja na kvaliteto rekonstruiranih slik. 172 Rekonstrukcija slik s povratno projekcijo 12.2 Rešitve in odgovori na vprašanja 12.2 Rešitve in odgovori na vprašanja Pri odgovorih privzamemo, da se funkcije iz rešitev nahajajo v modulu funkcije, slikovno gradivo pa se nahaja v podmapi poglavje_12. Naprej uvozimo potrebne module, naložimo slike in definiramo pomožne spremenljivke. 1 i m p o r t f u n k c i j e 2 i m p o r t n u m p y as np 3 f r o m m a t p l o t l i b i m p o r t p y p l o t as pp 4 f r o m PIL i m p o r t I m a g e as im 5 i m p o r t t i m e 6 i m p o r t h p f i l t e r 7 i m p o r t o s . p a t h 8 9 # naloži testno slike in pripravi koordinatno mrežo 10 It = n p . a s a r r a y ( i m . o p e n ( ’ . / p o g l a v j e _ 1 2 / b p r o j _ t e s t . p n g ’ ) ) 11 xt = n p . a r a n g e ( I t . s h a p e [1] , d t y p e = n p . f l o a t ) 12 yt = n p . a r a n g e ( I t . s h a p e [0] , d t y p e = n p . f l o a t ) 13 xt -= x t . m e a n () 14 yt -= y t . m e a n () 15 16 # naloži rezino CT slike in pripravi koordinatno mrežo 17 Ict = n p . a s a r r a y ( i m . o p e n ( ’ . / p o g l a v j e _ 1 2 / b p r o j _ c t . p n g ’ ) ) 18 xct = 2 .0 * n p . a r a n g e ( I c t . s h a p e [1] , d t y p e = n p . f l o a t ) 19 yct = 2 .0 * n p . a r a n g e ( I c t . s h a p e [0] , d t y p e = n p . f l o a t ) 20 xct -= x c t . m e a n () 21 yct -= y c t . m e a n () 22 23 fi = n p . d e g 2 r a d ( n p . a r a n g e (0 , 3 6 0 ) ) 24 25 # geometrija pravokotne projekcije 26 dP , nP , psP = 1000 , 512 , 1 27 # geometrija Stožčaste projekcije 28 dS , nS , psS = 1000 , 512 , 2 29 30 # ponovno računanje sinogramov 31 r e c o m p u t e = T r u e 1. V modulu funkcije ustvarimo funkcijo imParallelBeamBackproject2D. 1 def i m P a r a l l e l B e a m B a c k p r o j e c t 2 D ( fi , s i n o g r a m , x , y , 2 d , p i x e l S i z e ) : 3 # priprava podatkov 4 if i s i n s t a n c e ( fi , f l o a t ) or i s i n s t a n c e ( fi , int ) : 5 fi = [ fi ] 6 fi = n p . a s a r r a y ( fi , d t y p e = n p . f l o a t ) 7 s i n o g r a m = n p . a s a r r a y ( s i n o g r a m , d t y p e = n p . f l o a t ) 8 x = n p . a s a r r a y ( x , d t y p e = n p . f l o a t ) 9 y = n p . a s a r r a y ( y , d t y p e = n p . f l o a t ) 173 Rekonstrukcija slik s povratno projekcijo 12.2 Rešitve in odgovori na vprašanja 10 d = f l o a t ( d ) 11 p i x e l S i z e = f l o a t ( p i x e l S i z e ) 12 13 # število slikovnih elementov linijskega tipala 14 n = s i n o g r a m . s h a p e [1] 15 16 # koordinate slikovnih elementov rekonstruirane slike 17 [ Yg , Xg ] = n p . m e s h g r i d ( y , x , i n d e x i n g = ’ ij ’ ) 18 # koordinate razporedimo v dvovrstično matriko - x v prvo, y v drugo vrstico 19 pts = n p . v s t a c k ([ X g . f l a t t e n () , Y g . f l a t t e n () ]) 20 21 # akumulator povratne projekcije 22 oBP = n p . z e r o s ( Y g . s h a p e ) 23 for i in r a n g e ( f i . s i z e ) : 24 # rotacija slikovnih elementovb v obratni smeri 25 # kot bi rotirali tipalo-izvor 26 Tr = n p . a r r a y ([[ n p . c o s ( - fi [ i ]) , - n p . s i n ( - fi [ i ]) ] , 27 [ n p . s i n ( - fi [ i ]) , n p . c o s ( - fi [ i ]) ]]) 28 p t s r = n p . d o t ( Tr , pts ) 29 # y koordinate projiciranih slikovnih elementov na tipalu izražene z 30 # naslovom tipala 31 yt = p t s r [1 ,:]/ p i x e l S i z e + n *0 .5 32 # poiščemo projekcije z veljavnimi naslovi 33 v a l i d i n d s = ( yt >= 0) & ( yt <= n - 1) 34 yt = yt [ v a l i d i n d s ] 35 36 # z linearno interpolacijo določimo vrednosti v projiciranih točkah 37 ind = n p . f l o o r ( yt ) 38 d e l t a = yt - ind 39 i n t i n d = i n d . a s t y p e ( ’ int ’ ) 40 vt = s i n o g r a m [ i , i n t i n d ] * ( 1 .0 - d e l t a ) + \ 41 s i n o g r a m [ i , n p . m i n i m u m ( i n t i n d + 1 , n - 1) ]* d e l t a 42 v a l i d i n d s . s h a p e = X g . s h a p e 43 44 # prištejemo izračunane vrednosti akumulatorju povratne projekcije 45 oBP [ v a l i d i n d s ] += vt 46 47 r e t u r n oBP (a) Izračunamo sinogram in pripadajočo povratno projekcijo testne slike z uporabo pravokotne projekcije (slika 12.4). 1 # izračunaj sinogram, če je to potrebno 2 if o s . p a t h . i s f i l e ( ’ . / p o g l a v j e _ 1 2 / r e z u l t a t i / I t S P . n p y ’ ) and \ 3 not r e c o m p u t e : 4 I t S P = n p . l o a d ( ’ . / p o g l a v j e _ 1 2 / r e z u l t a t i / I t S P . n p y ’ ) 5 e l s e : 6 I t S P = f u n k c i j e . i m P a r a l l e l B e a m P r o j e c t 2 d ( fi , 1 , It , 7 xt , yt , dP , nP , psP , ’ m e a n ’ ) 174 Rekonstrukcija slik s povratno projekcijo 12.2 Rešitve in odgovori na vprašanja 8 n p . s a v e ( ’ . / p o g l a v j e _ 1 2 / r e z u l t a t i / I t S P . n p y ’ , I t S P ) 9 10 s t a r t = t i m e . p e r f _ c o u n t e r () 11 i n d s = n p . a r a n g e ( 3 6 0 ) 12 I t B p P = f u n k c i j e . i m P a r a l l e l B e a m B a c k p r o j e c t 2 D ( 13 fi [ i n d s ] , I t S P [ inds , :] , xt , yt , dP , psP ) 14 T = t i m e . p e r f _ c o u n t e r () - s t a r t 15 16 p p . f i g u r e () 17 18 p p . s u b p l o t (1 , 3 , 1) 19 p p . s u p t i t l e ( ’ T e s t n a s l i k a - p r a v o k o t n a p r o j e k c i j a ’ ) 20 p p . i m s h o w ( It , c m a p = ’ g r a y ’ ) 21 p p . t i t l e ( ’ I z v i r n a ’ ) 22 23 p p . s u b p l o t (1 , 3 , 2) 24 p p . i m s h o w ( ItSP , c m a p = ’ g r a y ’ ) 25 p p . t i t l e ( ’ S i n o g r a m ’ ) 26 27 p p . s u b p l o t (1 , 3 , 3) 28 p p . i m s h o w ( ItBpP , c m a p = ’ g r a y ’ ) 29 p p . t i t l e ( ’ P o v r a t n a p r o j e k c i j a ’ ) 30 31 p p . s h o w () (a) Izvirna (b) Sinogram (c) Povratna projekcija Slika 12.4: Testna slika s pripadajočim sinogramom in pravokotno povratno projekcijo. (b) Izračunamo sinogram in pripadajočo povratno projekcijo prečnega prereza CT slike z uporabo pravokotne projekcije (slika 12.5). 1 # izračunaj sinogram, če je to potrebno 2 if o s . p a t h . i s f i l e ( ’ . / p o g l a v j e _ 1 2 / r e z u l t a t i / I c t S P . n p y ’ ) and \ 3 not r e c o m p u t e : 4 I c t S P = n p . l o a d ( ’ . / p o g l a v j e _ 1 2 / r e z u l t a t i / I c t S P . n p y ’ ) 5 e l s e : 6 I c t S P = f u n k c i j e . i m P a r a l l e l B e a m P r o j e c t 2 d ( 7 fi , 1 , Ict , xct , yct , dP , nP , psP , ’ m e a n ’ ) 8 n p . s a v e ( ’ . / p o g l a v j e _ 1 2 / r e z u l t a t i / I c t S P . n p y ’ , I c t S P ) 9 175 Rekonstrukcija slik s povratno projekcijo 12.2 Rešitve in odgovori na vprašanja 10 s t a r t = t i m e . p e r f _ c o u n t e r () 11 i n d s = n p . a r a n g e ( 3 6 0 ) 12 I c t B p P = f u n k c i j e . i m P a r a l l e l B e a m B a c k p r o j e c t 2 D ( fi [ i n d s ] , 13 I c t S P [ inds , :] , xct , yct , dP , psP ) 14 T = t i m e . p e r f _ c o u n t e r () - s t a r t 15 16 p p . f i g u r e () 17 18 p p . s u b p l o t (1 , 3 , 1) 19 p p . s u p t i t l e ( ’ R e z i n a CT s l i k e - p r a v o k o t n a p r o j e k c i j a ’ ) 20 p p . i m s h o w ( Ict , c m a p = ’ g r a y ’ ) 21 p p . t i t l e ( ’ I z v i r n a ’ ) 22 23 p p . s u b p l o t (1 , 3 , 2) 24 p p . i m s h o w ( IctSP , c m a p = ’ g r a y ’ ) 25 p p . t i t l e ( ’ S i n o g r a m ’ ) 26 27 p p . s u b p l o t (1 , 3 , 3) 28 p p . i m s h o w ( IctBpP , c m a p = ’ g r a y ’ ) 29 p p . t i t l e ( ’ P o v r a t n a p r o j e k c i j a ’ ) 30 31 p p . s h o w () (a) Izvirna (b) Sinogram (c) Povratna projekcija Slika 12.5: Prerez CT slike s pripadajočim sinogramom in pravokotno povratno projekcijo. 2. V modulu funkcije ustvarimo funkcijo imFanBeamBackproject2D. 1 def i m F a n B e a m B a c k p r o j e c t 2 D ( fi , s i n o g r a m , x , y , 2 d , p i x e l S i z e ) : 3 # priprava podatkov 4 if i s i n s t a n c e ( fi , f l o a t ) or i s i n s t a n c e ( fi , int ) : 5 fi = [ fi ] 6 fi = n p . a s a r r a y ( fi , d t y p e = n p . f l o a t ) 7 s i n o g r a m = n p . a s a r r a y ( s i n o g r a m , d t y p e = n p . f l o a t ) 8 x = n p . a s a r r a y ( x , d t y p e = n p . f l o a t ) 9 y = n p . a s a r r a y ( y , d t y p e = n p . f l o a t ) 10 d = f l o a t ( d ) 11 p i x e l S i z e = f l o a t ( p i x e l S i z e ) 12 176 Rekonstrukcija slik s povratno projekcijo 12.2 Rešitve in odgovori na vprašanja 13 # število slikovnih elementov linijskega tipala 14 n = s i n o g r a m . s h a p e [1] 15 16 # koordinate slikovnih elementov rekonstruirane slike 17 [ Xg , Yg ] = n p . m e s h g r i d ( x , y ) 18 # koordinate razporedimo v dvovrstično matriko - x v prvo, y v drugo vrstico 19 pts = n p . v s t a c k ([ X g . f l a t t e n () , Y g . f l a t t e n () ]) 20 21 # akumulator povratne projekcije enake velikosti kot sta Xg in Yg 22 oBP = n p . z e r o s ( Y g . s h a p e ) 23 for i in r a n g e ( f i . s i z e ) : 24 # rotacija slikovnih elementovb v obratni smeri 25 # kot bi rotirali tipalo-izvor 26 Tr = n p . a r r a y ([[ n p . c o s ( - fi [ i ]) , - n p . s i n ( - fi [ i ]) ] , 27 [ n p . s i n ( - fi [ i ]) , n p . c o s ( - fi [ i ]) ]]) 28 p t s r = n p . d o t ( Tr , pts ) 29 # y koordinate projiciranih slikovnih elementov na tipalu izražene z 30 # naslovom tipala 31 yt = 2 .0 * p t s r [ 1 , : ] / ( 1 .0 - 2 .0 * p t s r [0 ,:]/ d ) / \ 32 p i x e l S i z e + n *0 .5 33 # poiščemo projekcije z veljavnimi naslovi 34 v a l i d i n d s = ( yt >= 0) & ( yt <= n - 1) 35 yt = yt [ v a l i d i n d s ] 36 37 # z linearno interpolacijo določimo vrednosti v projiciranih točkah 38 ind = n p . f l o o r ( yt ) 39 d e l t a = yt - ind 40 i n t i n d = i n d . a s t y p e ( ’ int ’ ) 41 vt = s i n o g r a m [ i , i n t i n d ] * ( 1 .0 - d e l t a ) + \ 42 s i n o g r a m [ i , n p . m i n i m u m ( i n t i n d + 1 , n - 1) ]* d e l t a 43 v a l i d i n d s . s h a p e = X g . s h a p e 44 45 # prištejemo izračunane vrednosti akumulatorju povratne projekcije 46 oBP [ v a l i d i n d s ] += vt 47 48 r e t u r n oBP (a) Izračunamo sinogram in pripadajočo povratno projekcijo testne slike z uporabo stož- časte projekcije (slika 12.6). 1 if o s . p a t h . i s f i l e ( ’ . / p o g l a v j e _ 1 2 / r e z u l t a t i / I t S S . n p y ’ ) and \ 2 not r e c o m p u t e : 3 I t S S = n p . l o a d ( ’ . / p o g l a v j e _ 1 2 / r e z u l t a t i / I t S S . n p y ’ ) 4 e l s e : 5 I t S S = f u n k c i j e . i m F a n B e a m P r o j e c t 2 d ( fi , 1 , It , 6 xt , yt , dS , nS , psS , ’ m e a n ’ ) 7 n p . s a v e ( ’ . / p o g l a v j e _ 1 2 / r e z u l t a t i / I t S S . n p y ’ , I t S S ) 8 9 s t a r t = t i m e . p e r f _ c o u n t e r () 177 Rekonstrukcija slik s povratno projekcijo 12.2 Rešitve in odgovori na vprašanja 10 i n d s = n p . a r a n g e ( 3 6 0 ) 11 I t B p S = f u n k c i j e . i m F a n B e a m B a c k p r o j e c t 2 D ( 12 fi [ i n d s ] , I t S S [ inds , :] , xt , yt , dS , psS ) 13 T = t i m e . p e r f _ c o u n t e r () - s t a r t 14 15 p p . f i g u r e () 16 17 p p . s u b p l o t (1 , 3 , 1) 18 p p . s u p t i t l e ( ’ T e s t n a s l i k a - sto ž č a s t a p r o j e k c i j a ’ ) 19 p p . i m s h o w ( It , c m a p = ’ g r a y ’ ) 20 p p . t i t l e ( ’ I z v i r n a ’ ) 21 22 p p . s u b p l o t (1 , 3 , 2) 23 p p . i m s h o w ( ItSS , c m a p = ’ g r a y ’ ) 24 p p . t i t l e ( ’ S i n o g r a m ’ ) 25 26 p p . s u b p l o t (1 , 3 , 3) 27 p p . i m s h o w ( ItBpS , c m a p = ’ g r a y ’ ) ; 28 p p . t i t l e ( ’ P o v r a t n a p r o j e k c i j a ’ ) 29 30 p p . s h o w () (a) Izvirna (b) Sinogram (c) Povratna projekcija Slika 12.6: Testna slika s pripadajočim sinogramom in stožčasto povratno projekcijo. (b) Izračunamo sinogram in pripadajočo povratno projekcijo prečnega prereza CT slike z uporabo stožčaste projekcije (slika 12.7). 1 # izračunaj sinogram, če je to potrebno 2 if o s . p a t h . i s f i l e ( ’ . / p o g l a v j e _ 1 2 / r e z u l t a t i / I c t S S . n p y ’ ) and \ 3 not r e c o m p u t e : 4 I c t S S = n p . l o a d ( ’ . / p o g l a v j e _ 1 2 / r e z u l t a t i / I c t S S . n p y ’ ) 5 e l s e : 6 I c t S S = f u n k c i j e . i m F a n B e a m P r o j e c t 2 d ( fi , 2 , Ict , 7 xct , yct , dS , nS , psS , ’ m e a n ’ ) 8 n p . s a v e ( ’ . / p o g l a v j e _ 1 2 / r e z u l t a t i / I c t S S . n p y ’ , I c t S S ) 9 10 s t a r t = t i m e . p e r f _ c o u n t e r () 11 i n d s = n p . a r a n g e ( 3 6 0 ) 12 I c t B p S = f u n k c i j e . i m F a n B e a m B a c k p r o j e c t 2 D ( fi [ i n d s ] , 178 Rekonstrukcija slik s povratno projekcijo 12.2 Rešitve in odgovori na vprašanja 13 I c t S S [ inds , :] , xct , yct , dS , psS ) 14 T = t i m e . p e r f _ c o u n t e r () - s t a r t 15 16 p p . f i g u r e () 17 18 p p . s u b p l o t (1 , 3 , 1) 19 p p . s u p t i t l e ( ’ R e z i n a CT s l i k e - sto ž č a s t a p r o j e k c i j a ’ ) 20 p p . i m s h o w ( Ict , c m a p = ’ g r a y ’ ) 21 p p . t i t l e ( ’ I z v i r n a ’ ) 22 23 p p . s u b p l o t (1 , 3 , 2) 24 p p . i m s h o w ( IctSS , c m a p = ’ g r a y ’ ) 25 p p . t i t l e ( ’ S i n o g r a m ’ ) 26 27 p p . s u b p l o t (1 , 3 , 3) 28 p p . i m s h o w ( IctBpS , c m a p = ’ g r a y ’ ) 29 p p . t i t l e ( ’ P o v r a t n a p r o j e k c i j a ’ ) 30 31 p p . s h o w () (a) Izvirna (b) Sinogram (c) Povratna projekcija Slika 12.7: Prerez CT slike s pripadajočim sinogramom in stožčasto povratno projekcijo. 3. V modulu funkcije ustvarimo funkcijo za filtriranje sinograma filterSinogram. 1 def f i l t e r S i n o g r a m ( s i n o g r a m , f i l t = ’ h a m m i n g ’ ) : 2 if i s i n s t a n c e ( filt , str ) : 3 f i l t = h p f i l t e r . c r e a t e ( f i l t ) 4 o S i n o g r a m = n p . z e r o s ( s i n o g r a m . s h a p e , d t y p e = n p . f l o a t ) 5 for i in r a n g e ( s i n o g r a m . s h a p e [ 0 ] ) : 6 o S i n o g r a m [ i ] = c o n v o l v e ( s i n o g r a m [ i ] , filt , ’ s a m e ’ ) 7 8 r e t u r n o S i n o g r a m Filtriramo sinograme in izvedemo povratno projekcijo za testno sliko in prečni prerez CT slike. 1 f i l t = h p f i l t e r . c r e a t e ( ’ h a m m i n g ’ ) 2 3 # filtriramo sinograme 179 Rekonstrukcija slik s povratno projekcijo 12.2 Rešitve in odgovori na vprašanja 4 I t S P F = f u n k c i j e . f i l t e r S i n o g r a m ( ItSP , f i l t ) 5 I t S S F = f u n k c i j e . f i l t e r S i n o g r a m ( ItSS , f i l t ) 6 7 I c t S P F = f u n k c i j e . f i l t e r S i n o g r a m ( IctSP , f i l t ) 8 I c t S S F = f u n k c i j e . f i l t e r S i n o g r a m ( IctSS , f i l t ) 9 10 i n d s = n p . a r a n g e ( 3 6 0 ) 11 # rekonstrukcija s filtriranimi sinogrami 12 I t F B p P = f u n k c i j e . i m P a r a l l e l B e a m B a c k p r o j e c t 2 D ( 13 fi [ i n d s ] , I t S P F [ inds , :] , xt , yt , dP , psP ) 14 I t F B p S = f u n k c i j e . i m F a n B e a m B a c k p r o j e c t 2 D ( 15 fi [ i n d s ] , I t S S F [ inds , :] , xt , yt , dS , psS ) 16 17 I c t F B p P = f u n k c i j e . i m P a r a l l e l B e a m B a c k p r o j e c t 2 D ( 18 fi [ i n d s ] , I c t S P F [ inds , :] , xct , yct , dP , psP ) 19 I c t F B p S = f u n k c i j e . i m F a n B e a m B a c k p r o j e c t 2 D ( 20 fi [ i n d s ] , I c t S S F [ inds , :] , xct , yct , dS , psS ) 21 22 # testna slika 23 p p . f i g u r e () 24 p p . s u p t i t l e ( 25 ’ P r i m e r j a v a p o v r a t n i h p r o j e k c i j na p o d l a g i ’ 26 ’ f i l t r i r a n i h in n e f i l t r i r a n i h s i n o g r a m o v - ’ 27 ’ p r a v o k o t n a p r o j e k c i j a ’ ) 28 29 p p . s u b p l o t (1 , 3 , 1) 30 p p . i m s h o w ( It , c m a p = ’ g r a y ’ ) 31 p p . t i t l e ( ’ I z v i r n a ’ ) 32 33 p p . s u b p l o t (1 , 3 , 2) 34 p p . i m s h o w ( ItBpP , c m a p = ’ g r a y ’ ) 35 p p . t i t l e ( ’ N e f i l t r i r a n a VP ’ ) 36 37 p p . s u b p l o t (1 , 3 ,3) 38 p p . i m s h o w ( ItFBpP , c m a p = ’ g r a y ’ ) 39 p p . t i t l e ( ’ F i l t r i r a n a VP ’ ) 40 41 p p . f i g u r e () 42 p p . s u p t i t l e ( 43 ’ P r i m e r j a v a p o v r a t n i h p r o j e k c i j na p o d l a g i ’ 44 ’ f i l t r i r a n i h in n e f i l t r i r a n i h s i n o g r a m o v - ’ 45 ’ sto ž č a s t a p r o j e k c i j a ’ ) 46 47 p p . s u b p l o t (1 , 3 , 1) 48 p p . i m s h o w ( It , c m a p = ’ g r a y ’ ) 49 p p . t i t l e ( ’ I z v i r n a ’ ) 50 51 p p . s u b p l o t (1 , 3 , 2) 52 p p . i m s h o w ( ItBpS , c m a p = ’ g r a y ’ ) 180 Rekonstrukcija slik s povratno projekcijo 12.2 Rešitve in odgovori na vprašanja 53 p p . t i t l e ( ’ N e f i l t r i r a n a VP ’ ) 54 55 p p . s u b p l o t (1 , 3 , 3) 56 p p . i m s h o w ( ItFBpS , c m a p = ’ g r a y ’ ) 57 p p . t i t l e ( ’ F i l t r i r a n a VP ’ ) 58 59 # CT rezina 60 p p . f i g u r e () 61 p p . s u p t i t l e ( 62 ’ P r i m e r j a v a p o v r a t n i h p r o j e k c i j na p o d l a g i ’ 63 ’ f i l t r i r a n i h in n e f i l t r i r a n i h s i n o g r a m o v - ’ 64 ’ p r a v o k o t n a p r o j e k c i j a ’ ) 65 66 p p . s u b p l o t (1 , 3 , 1) 67 p p . i m s h o w ( Ict , c m a p = ’ g r a y ’ ) 68 p p . t i t l e ( ’ I z v i r n a ’ ) 69 70 p p . s u b p l o t (1 , 3 , 2) 71 p p . i m s h o w ( IctBpP , c m a p = ’ g r a y ’ ) 72 p p . t i t l e ( ’ N e f i l t r i r a n a VP ’ ) 73 74 p p . s u b p l o t (1 , 3 , 3) 75 p p . i m s h o w ( IctFBpP , c m a p = ’ g r a y ’ ) 76 p p . t i t l e ( ’ F i l t r i r a n a VP ’ ) 77 78 p p . f i g u r e () 79 p p . s u p t i t l e ( 80 ’ P r i m e r j a v a p o v r a t n i h p r o j e k c i j na p o d l a g i ’ 81 ’ f i l t r i r a n i h in n e f i l t r i r a n i h s i n o g r a m o v - ’ 82 ’ sto ž č a s t a p r o j e k c i j a ’ ) 83 84 p p . s u b p l o t (1 , 3 , 1) 85 p p . i m s h o w ( Ict , c m a p = ’ g r a y ’ ) 86 p p . t i t l e ( ’ I z v i r n a ’ ) 87 88 p p . s u b p l o t (1 , 3 , 2) 89 p p . i m s h o w ( IctBpS , c m a p = ’ g r a y ’ ) 90 p p . t i t l e ( ’ N e f i l t r i r a n a VP ’ ) 91 92 p p . s u b p l o t (1 , 3 , 3) 93 p p . i m s h o w ( IctFBpS , c m a p = ’ g r a y ’ ) 94 p p . t i t l e ( ’ F i l t r i r a n a VP ’ ) 95 96 p p . s h o w () (a) Primerjava med nefiltriranimi in filtriranimi sinogrami, dobljenimi s pravokotno (slika 12.8) in stožčasto projekcijo (slika 12.9). (b) Slika 12.10 prikazuje primerjavo povratnih projekcij na podlagi nefiltriranih in filtri-181 Rekonstrukcija slik s povratno projekcijo 12.2 Rešitve in odgovori na vprašanja (a) Izvirna (b) Nefiltriran (c) Filtriran (d) Izvirna (e) Nefiltriran (f) Filtriran Slika 12.8: Primerjava med nefiltriranimi in filtriranimi sinogrami, dobljenimi s pravokotno projekcijo. (a) Izvirna (b) Nefiltriran (c) Filtriran (d) Izvirna (e) Nefiltriran (f) Filtriran Slika 12.9: Primerjava med nefiltriranimi in filtriranimi sinogrami, dobljenimi s stožčasto projekcijo. ranih sinogramov, dobljenih s pravokotno projekcijo, slika 12.11 pa še primerjavo za stožčasto projekcijo. 4. Ovrednotimo še vpliv števila projekcij na kakovost povratne projekcije (slika 12.12) in časovno zahtevnost izračunov (tabela 12.1 in slika 12.13). 182 Rekonstrukcija slik s povratno projekcijo 12.2 Rešitve in odgovori na vprašanja (a) Izvirna (b) Nefiltrirana PP (c) Filtrirana PP (d) Izvirna (e) Nefiltrirana PP (f) Filtrirana PP Slika 12.10: Primerjava povratnih projekcij (PP) za nefiltrirane in filtrirane sinograme, dobljene s pravokotno projekcijo. (a) Izvirna (b) Nefiltrirana PP (c) Filtrirana PP (d) Izvirna (e) Nefiltrirana PP (f) Filtrirana PP Slika 12.11: Primerjava povratnih projekcij (PP) za nefiltrirane in filtrirane sinograme, dobljene s stožčasto projekcijo. 1 r = [1 , 2 , 4 , 8] 2 I c t F b p F i = [] 3 I c t P b p F i = [] 4 5 p p . f i g u r e () 183 Rekonstrukcija slik s povratno projekcijo 12.2 Rešitve in odgovori na vprašanja 6 p p . s u p t i t l e ( 7 ’ V p l i v š t e v i l a p r o j e k c i j na ’ 8 ’ k a k o v o s t p o v r a t n e p r o j e k c i j e . ’ ) 9 10 p p . s u b p l o t (1 , len ( r ) + 1 , 1) 11 p p . i m s h o w ( Ict , c m a p = ’ g r a y ’ ) 12 p p . t i t l e ( ’ I z v i r n a ’ ) 13 14 TSo = [] 15 T S f b = [] 16 for i in r a n g e ( len ( r ) ) : 17 i n d s = n p . a r a n g e (0 , 360 , r [ i ]) 18 19 t s t a r t = t i m e . p e r f _ c o u n t e r () 20 tmp = f u n k c i j e . i m P a r a l l e l B e a m B a c k p r o j e c t 2 D ( 21 fi [ i n d s ] , I c t S P [ inds , :] , xct , yct , dP , psP ) 22 I c t P b p F i . a p p e n d ( tmp ) 23 T S o . a p p e n d ( t i m e . p e r f _ c o u n t e r () - t s t a r t ) 24 p r i n t ( ’ P r a v o k o t n a p o v r a t n a p r o j e k c i j a s k o r a k o m v z o r č e n j a {} ’ 25 ’ i z r a č u n a n a v {: .0f } ms ’ . f o r m a t ( r [ i ] , TSo [ - 1 ] * 1 0 0 0 ) ) 26 27 t s t a r t = t i m e . p e r f _ c o u n t e r () 28 tmp = f u n k c i j e . i m F a n B e a m B a c k p r o j e c t 2 D ( 29 fi [ i n d s ] , I c t S S F [ inds , :] , xct , yct , dS , psS ) 30 I c t F b p F i . a p p e n d ( tmp ) 31 T S f b . a p p e n d ( t i m e . p e r f _ c o u n t e r () - t s t a r t ) 32 p r i n t ( ’ Sto ž č a s t a p o v r a t n a p r o j e k c i j a s k o r a k o m v z o r č e n j a {} ’ 33 ’ i z r a č u n a n a v {: .0f } ms ’ . f o r m a t ( r [ i ] , T S f b [ - 1 ] * 1 0 0 0 ) ) 34 35 p p . s u b p l o t (1 , len ( r ) + 1 , i + 2) 36 p p . i m s h o w ( I c t F b p F i [ -1] , c m a p = ’ g r a y ’ ) 37 p p . t i t l e ( ’ K o r a k {} s t o p i n j ’ . f o r m a t ( r [ i ]) ) 38 39 p p . s h o w () (a) ∆ ϕ = 1◦ (b) ∆ ϕ = 2◦ (c) ∆ ϕ = 4◦ (d) ∆ ϕ = 8◦ Slika 12.12: Vpliv števila projekcij na kakovost povratne projekcije kot funkcija koraka vzorčenja ∆ ϕ. 184 Rekonstrukcija slik s povratno projekcijo 12.2 Rešitve in odgovori na vprašanja Tabela 12.1: Vpliv števila projekcij na čas potreben za izračun povratne projekcije. Korak vzorčenja ∆ ϕ (◦) Projekcija 1 2 4 8 Pravokotna 0.47 s 0.24 s 0.13 s 0.07 s Stožčasta 0.56 s 0.30 s 0.14 s 0.07 s 1.0 čas pravokotna stožčasta 0.5 rmalizirani No 0.0 2 4 6 8 Korak vzorčenja (◦) Slika 12.13: Vpliv koraka vzorčenja na časovno učinkovitost izračuna stožčastih in pravokotnih povratnih projekcij. 185 Rekonstrukcija slik s povratno projekcijo 12.2 Rešitve in odgovori na vprašanja 186 Dodatek A Modul interp Modul interp z računsko učinkovito izvedbo interpolacijo, ki temelji na funkciji map_coordinates knjižnice scipy.ndimage. 1 # -*- coding: utf-8 -*- 2 f r o m s c i p y . n d i m a g e i m p o r t m a p _ c o o r d i n a t e s 3 i m p o r t n u m p y as np 4 5 def i n t e r p 1 ( xi , x , f , o r d e r =1 , ** k w a r g s ) : 6 ’ ’ ’ 7 I n t e r p o l a c i j a 1 D s i g n a l o v , d e f i n i r a n i h na e n a k o m e r n o r a z p o r e j e n i 8 mre ž i to č k. 9 10 P a r a m e t r i 11 - - - - - - - - - 12 xi : n u m p y . n d a r r a y 13 To č ke v k a t e r i h je p o t r e b n o i z r a č u n a t i ( i n t e r p o l i r a t i ) 14 f u n k c i j s k e v r e d n o s t i . 15 x : n u m p y . n d a r r a y 16 E n a k o m e r n o r a z p o r e j e n e v z o r č ne to č ke v k a t e r i h je f u n k c i j s k a 17 v r e d n o s t f z n a n a . 18 f : n u m p y . n d a r r a y 19 F u n k c i j s k e v r e d n o s t i v v z o r č nih to č kah x. V e l i k o s t p o d a t k o v n e g a 20 p o l j a f m o r a u s t r e z a t i ( x.size ,) . 21 o r d e r : int 22 Red i n t e r p o l a c i j e . 0 - n a j b l i ž ji sosed , 1 - l i n e a r n a ... 23 k w a r g s : d i c t 24 P r e o s t a l i p o i m e n s k o p o d a n i p a r a m e t r i se p o s r e d u j e j o f u n k c i j i 25 m a p _ c o o r d i n a t e s . 26 27 V r n e 28 - - - - 29 fxi : n u m p y . n d a r r a y 30 F u n k c i j s k e v r e d n o s t i v to č kah f [ xi ] . 31 32 P r i m e r 187 Modul interp 33 - - - - - - 34 > > > i m p o r t n u m p y as np 35 > > > f r o m m a t p l o t l i b i m p o r t p y p l o t as pp 36 > > > 37 > > > x = n p . l i n s p a c e (0 , np.pi , 5) 38 > > > x _ r e f = n p . l i n s p a c e ( x [0] , x [ -1] , 1 0 0 0 ) 39 > > > f = n p . c o s ( x ) 40 > > > 41 > > > xi = n p . l i n s p a c e (0 , np.pi , 50) 42 > > > f i _ l i n = i n t e r p 1 ( xi , x , f ) 43 > > > f i _ q u a d = i n t e r p 1 ( xi , x , f , 2) 44 > > > 45 > > > p p . f i g u r e () 46 > > > p p . p l o t ( x_ref , n p . c o s ( x _ r e f ) , ’ - k ’ , l a b e l = ’ cos ( x ) ’) 47 > > > p p . p l o t ( x , f , ’ or ’ , l a b e l = ’ v z o r č ne to č ke ’ , m a r k e r s i z e =6) 48 > > > p p . p l o t ( xi , fi_lin , ’ xg ’ , l a b e l = ’ l i n e a r n a ’ , m a r k e r s i z e =6) 49 > > > p p . p l o t ( xi , fi_quad , ’ xb ’ , l a b e l = ’ k v a d r a t i č na ’ , m a r k e r s i z e =6) 50 > > > p p . l e g e n d () 51 ’ ’ ’ 52 if x is not N o n e : 53 x = n p . a s a r r a y ( x ) . f l a t t e n () 54 if x . s i z e != f . s i z e : 55 r a i s e I n d e x E r r o r ( 56 ’ Dol ž ini v e k t o r j e v " x " in " f " m o r a t a b i t i e n a k i ! ’ ) 57 i n d x = ( xi - x [ 0 ] ) *(( x . s i z e - 1) /( x [ -1] - x [ 0 ] ) ) 58 e l s e : 59 i n d x = xi 60 61 r e t u r n m a p _ c o o r d i n a t e s ( n p . a s a r r a y ( f ) , n p . a s a r r a y ([ i n d x ]) , 62 o r d e r = order , ** k w a r g s ) 63 64 def i n t e r p 2 ( xi , yi , x , y , f , o r d e r =1 , ** k w a r g s ) : 65 ’ ’ ’ 66 I n t e r p o l a c i j a 2 D funkcij , d e f i n i r a n i h na e n a k o m e r n o r a z p o r e j e n i 67 mre ž i to č k. 68 P r e d p o s t a v i m o , da p r v a r a z s e ž n o s t f p r i p a d a y k o o r d i n a t n i osi , 69 d r u g a r a z s e ž n o s t pa x k o o r d i n a t n i osi , in s i c e r kot f [ y , x ] . 70 71 P a r a m e t r i 72 - - - - - - - - - 73 xi : n u m p y . n d a r r a y 74 X k o m p o n e n t e to č k v k a t e r i h je p o t r e b n o i z r a č u n a t i ( i n t e r p o l i r a t i ) 75 f u n k c i j s k e v r e d n o s t i . 76 yi : p o d a t k o v n o p o l j e 77 Y k o m p o n e n t e to č k v k a t e r i h je p o t r e b n o i z r a č u n a t i ( i n t e r p o l i r a t i ) 78 f u n k c i j s k e v r e d n o s t i . 79 x : n u m p y . n d a r r a y 80 E n a k o m e r n o r a z p o r e j e n e v z o r č ne to č ke v z d o l ž x k o o r d i n a t n e o s i . 81 y : n u m p y . n d a r r a y 188 Modul interp 82 E n a k o m e r n o r a z p o r e j e n e v z o r č ne to č ke v z d o l ž y k o o r d i n a t n e o s i . 83 f : n u m p y . n d a r r a y 84 F u n k c i j s k e v r e d n o s t i na 2 D mre ž i v z o r č nih to č kah , ki jo n a p e n j a t a 85 v e k t o r j a x in y. V e l i k o s t p o d a t k o v n e g a p o l j a f 86 m o r a u s t r e z a t i ( y.size , x . s i z e ) . 87 o r d e r : int 88 Red i n t e r p o l a c i j e . 0 - n a j b l i ž ji sosed , 1 - l i n e a r n a ... 89 k w a r g s : d i c t 90 P r e o s t a l i p o i m e n s k o p o d a n i p a r a m e t r i se p o s r e d u j e j o f u n k c i j i 91 m a p _ c o o r d i n a t e s . 92 93 V r n e 94 - - - - 95 f x y i : n u m p y . n d a r r a y 96 F u n k c i j s k e v r e d n o s t i v to č kah f [ yi , xi ] . 97 98 P r i m e r 99 - - - - - - 100 > > > i m p o r t n u m p y as np 101 > > > f r o m m a t p l o t l i b i m p o r t p y p l o t as pp 102 > > > f r o m m p l _ t o o l k i t s . m p l o t 3 d i m p o r t A x e s 3 D 103 > > > 104 > > > x = n p . l i n s p a c e ( -1 , 1 , 10) 105 > > > y = n p . l i n s p a c e ( -1 , 1 , 10) 106 > > > Y , X = n p . m e s h g r i d ( y , x , i n d e x i n g = ’ ij ’) 107 > > > f = 1 .0 /( X **2 + Y **2 + 1) 108 > > > 109 > > > xi = n p . l i n s p a c e (0 , 1 , 30) 110 > > > yi = n p . l i n s p a c e (0 , 1 , 30) 111 > > > Yi , Xi = n p . m e s h g r i d ( yi , xi , i n d e x i n g = ’ ij ’) 112 > > > fi = i n t e r p 2 ( Xi , Yi , x , y , f ) 113 > > > 114 > > > fig = p p . f i g u r e () 115 > > > ax = f i g . a d d _ s u b p l o t (111 , p r o j e c t i o n = ’3 d ’) 116 > > > a x . p l o t _ w i r e f r a m e ( X , Y , f , c o l o r = ’ r ’ , l a b e l = ’ v z o r č ne ’) 117 > > > a x . p l o t _ w i r e f r a m e ( Xi , Yi , fi , c o l o r = ’ g ’ , l a b e l = ’ i n t e r p o l i r a n e ’) 118 > > > a x . l e g e n d () 119 ’ ’ ’ 120 121 f = n p . a s a r r a y ( f ) 122 xi , yi = n p . a s a r r a y ( xi ) , n p . a s a r r a y ( yi ) 123 124 if x is not N o n e : 125 x = n p . a s a r r a y ( x ) 126 if x . s i z e != f . s h a p e [ 1 ] : 127 r a i s e I n d e x E r r o r ( 128 ’ Dol ž ina v e k t o r j a " x " se m o r a u j e m a t i ’ 129 ’ s š t e v i l o m s t o l p c e v " f "! ’ ) 130 i n d x = ( xi - x [ 0 ] ) *(( x . s i z e - 1) /( x [ -1] - x [ 0 ] ) ) 189 Modul interp 131 e l s e : 132 i n d x = xi 133 134 if y is not N o n e : 135 y = n p . a s a r r a y ( y ) 136 if y . s i z e != f . s h a p e [ 0 ] : 137 r a i s e I n d e x E r r o r ( 138 ’ Dol ž ina v e k t o r j a " y " se m o r a u j e m a t i ’ 139 ’ s š t e v i l o m v r s t i c " f "! ’ ) 140 i n d y = ( yi - y [ 0 ] ) *(( y . s i z e - 1) /( y [ -1] - y [ 0 ] ) ) 141 e l s e : 142 i n d y = yi 143 144 r e t u r n m a p _ c o o r d i n a t e s ( f , n p . a s a r r a y ([ indy , i n d x ]) , 145 o r d e r = order , ** k w a r g s ) 146 147 def i n t e r p 3 ( xi , yi , zi , x , y , z , f , o r d e r =1 , ** k w a r g s ) : 148 ’ ’ ’ 149 I n t e r p o l a c i j a 3 D funkcij , d e f i n i r a n i h na e n a k o m e r n o r a z p o r e j e n i 150 mre ž i to č k. 151 P r e d p o s t a v i m o , da p r v a r a z s e ž n o s t f p r i p a d a z k o o r d i n a t n i osi , 152 d r u g a r a z s e ž n o s t y k o o r d i n a t n i osi , t r e t j a r a z s e ž n o s t pa 153 x k o o r d i n a t n i osi , in s i c e r kot f [ z , y , x ] . 154 155 P a r a m e t r i 156 - - - - - - - - - - - 157 xi : n u m p y . n d a r r a y 158 X k o m p o n e n t e to č k v k a t e r i h je p o t r e b n o i z r a č u n a t i ( i n t e r p o l i r a t i ) 159 f u n k c i j s k e v r e d n o s t i . 160 yi : n u m p y . n d a r r a y 161 Y k o m p o n e n t e to č k v k a t e r i h je p o t r e b n o i z r a č u n a t i ( i n t e r p o l i r a t i ) 162 f u n k c i j s k e v r e d n o s t i . 163 zi : n u m p y . n d a r r a y 164 Z k o m p o n e n t e to č k v k a t e r i h je p o t r e b n o i z r a č u n a t i ( i n t e r p o l i r a t i ) 165 f u n k c i j s k e v r e d n o s t i . 166 x : n u m p y . n d a r r a y 167 E n a k o m e r n o r a z p o r e j e n e v z o r č ne to č ke v z d o l ž x o s i . 168 y : n u m p y . n d a r r a y 169 E n a k o m e r n o r a z p o r e j e n e v z o r č ne to č ke v z d o l ž y o s i . 170 z : n u m p y . n d a r r a y 171 E n a k o m e r n o r a z p o r e j e n e v z o r č ne to č ke v z d o l ž z o s i . 172 f : n u m p y . n d a r r a y 173 F u n k c i j s k e v r e d n o s t i na 3 D mre ž i v z o r č nih to č kah , ki jo n a p e n j a j o 174 v e k t o r j i x , y in z. V e l i k o s t p o d a t k o v n e g a p o l j a f 175 m o r a u s t r e z a t i ( z.size , y.size , x . s i z e ) . 176 o r d e r : int 177 Red i n t e r p o l a c i j e . 0 - n a j b l i ž ji sosed , 1 - l i n e a r n a ... 178 k w a r g s : d i c t 179 P r e o s t a l i p o i m e n s k o p o d a n i p a r a m e t r i se p o s r e d u j e j o 190 Modul interp 180 f u n k c i j i m a p _ c o o r d i n a t e s . 181 182 V r n e 183 - - - - 184 f x y z i : n u m p y . n d a r r a y 185 F u n k c i j s k e v r e d n o s t i v to č kah f [ zi , yi , xi ] . 186 187 P r i m e r 188 - - - - - - 189 > > > i m p o r t n u m p y as np 190 > > > > 191 > > > x = n p . l i n s p a c e ( -1 , 1 , 10) 192 > > > y = n p . l i n s p a c e ( -1 , 1 , 10) 193 > > > z = n p . l i n s p a c e ( -1 , 1 , 10) 194 > > > Z , Y , X = n p . m e s h g r i d ( z , y , x , i n d e x i n g = ’ ij ’) 195 > > > f = 1 .0 /( X **2 + Y **2 + Z **2 + 1) 196 > > > 197 > > > xi = n p . l i n s p a c e (0 , 1 , 30) 198 > > > yi = n p . l i n s p a c e (0 , 1 , 30) 199 > > > zi = n p . l i n s p a c e (0 , 1 , 30) 200 > > > Zi , Yi , Xi = n p . m e s h g r i d ( zi , yi , xi , i n d e x i n g = ’ ij ’) 201 > > > 202 > > > fi = i n t e r p 3 ( Xi , Yi , Zi , x , y , z , f ) 203 ’ ’ ’ 204 f = n p . a s a r r a y ( f ) 205 xi , yi = n p . a s a r r a y ( xi ) , n p . a s a r r a y ( yi ) 206 207 if x is not N o n e : 208 x = n p . a s a r r a y ( x ) 209 if x . s i z e != f . s h a p e [ 2 ] : 210 r a i s e I n d e x E r r o r ( 211 ’ Dol ž ina v e k t o r j a " x " se m o r a u j e m a t i ’ 212 ’ s š t e v i l o m s t o l p c e v " f "! ’ ) 213 i n d x = ( xi - x [ 0 ] ) *(( x . s i z e - 1) /( x [ -1] - x [ 0 ] ) ) 214 e l s e : 215 i n d x = xi 216 217 if y is not N o n e : 218 y = n p . a s a r r a y ( y ) 219 if y . s i z e != f . s h a p e [ 1 ] : 220 r a i s e I n d e x E r r o r ( 221 ’ Dol ž ina v e k t o r j a " y " se m o r a u j e m a t i ’ 222 ’ š t e v i l o m v r s t i c f ! ’ ) 223 i n d y = ( yi - y [ 0 ] ) *(( y . s i z e - 1) /( y [ -1] - y [ 0 ] ) ) 224 e l s e : 225 i n d y = yi 226 227 if z is not N o n e : 228 z = n p . a s a r r a y ( z ) 191 Modul interp 229 if z . s i z e != f . s h a p e [ 0 ] : 230 r a i s e I n d e x E r r o r ( 231 ’ Dol ž ina v e k t o r j a " z " se m o r a u j e m a t i ’ 232 ’ s š t e v i l o m p r e r e z o v " f "! ’ ) 233 i n d z = ( zi - z [ 0 ] ) *(( z . s i z e - 1) /( z [ -1] - z [ 0 ] ) ) 234 e l s e : 235 i n d y = zi 236 237 r e t u r n m a p _ c o o r d i n a t e s ( f , n p . a s a r r a y ([ indz , indy , i n d x ]) , 238 o r d e r = order , ** k w a r g s ) 239 240 def i n t e r p n ( ti , t , f , o r d e r =1 , ** k w a r g s ) : 241 ’ ’ ’ 242 I n t e r p o l a c i j a p o l j u b n o r a z s e ž nih funkcij , d e f i n i r a n i h na e n a k o m e r n o 243 r a z p o r e j e n i mre ž i to č k. 244 245 P a r a m e t r i 246 - - - - - - - - - 247 ti : n u m p y . n d a r r a y 248 S e z n a m k o m p o n e n t to č k v k a t e r i h je p o t r e b n o i z r a č u n a t i 249 ( i n t e r p o l i r a t i ) f u n k c i j s k e v r e d n o s t i . 250 t : n u m p y . n d a r r a y 251 S e z n a m v e k t o r j e v e n a k o m e r n o r a z p o r e j e n i h v z o r č nni to č k v z d o l ž v s e h 252 k o o r d i n a t n i h osi ( r a z s e ž n o s t i ) . 253 f : n u m p y . n d a r r a y 254 F u n k c i j s k e v r e d n o s t i na ND mre ž i v z o r ž nih to č kah , ki jo n a p e n j a j o 255 v e k t o r j i v t. V e l i k o s t p o d a t k o v n e g a p o l j a f m o r a 256 u s t r e z a t i ( t [0] .size , t [1] .size , ... , t [ -1] . s i z e ) . 257 o r d e r : int 258 Red i n t e r p o l a c i j e . 0 - n a j b l i ž ji sosed , 1 - l i n e a r n a ... 259 k w a r g s : d i c t 260 P r e o s t a l i p o i m e n s k o p o d a n i p a r a m e t r i se p o s r e d u j e j o f u n k c i j i 261 m a p _ c o o r d i n a t e s . 262 263 V r n e 264 - - - - 265 fti : n u m p y . n d a r r a y 266 F u n k c i j s k e v r e d n o s t i v to č kah f [ t [0] , t [1] , ... , t [ -1]] . 267 268 P r i m e r 269 - - - - - - 270 > > > i m p o r t n u m p y as np 271 > > > f r o m m a t p l o t l i b i m p o r t p y p l o t as pp 272 > > > f r o m m p l _ t o o l k i t s . m p l o t 3 d i m p o r t A x e s 3 D 273 > > > 274 > > > x = n p . l i n s p a c e ( -1 , 1 , 15) 275 > > > y = n p . l i n s p a c e ( -1 , 1 , 10) 276 > > > Y , X = n p . m e s h g r i d ( y , x , i n d e x i n g = ’ ij ’) 277 > > > f = 1 .0 /( X **2 + Y **2 + 1) 192 Modul interp 278 > > > 279 > > > xi = n p . l i n s p a c e (0 , 1 , 30) 280 > > > yi = n p . l i n s p a c e (0 , 1 , 30) 281 > > > Yi , Xi = n p . m e s h g r i d ( yi , xi , i n d e x i n g = ’ ij ’) 282 > > > fi = i n t e r p n ([ Yi , Xi ] , [ y , x ] , f ) 283 > > > 284 > > > fig = p p . f i g u r e () 285 > > > ax = f i g . a d d _ s u b p l o t (111 , p r o j e c t i o n = ’3 d ’) 286 > > > a x . p l o t _ w i r e f r a m e ( X , Y , f , c o l o r = ’ r ’ , l a b e l = ’ v z o r č ne ’) 287 > > > a x . p l o t _ w i r e f r a m e ( Xi , Yi , fi , c o l o r = ’ g ’ , l a b e l = ’ i n t e r p o l i r a n e ’) 288 > > > a x . l e g e n d () 289 ’ ’ ’ 290 291 f = n p . a s a r r a y ( f ) 292 293 if t is not N o n e : 294 N = len ( t ) # space dimensionality 295 if N != len ( ti ) : 296 r a i s e I n d e x E r r o r ( 297 ’ Š t e v i l o e l e m e n t o v " ti " in " t " se m o r a b i t i e n a k o ! ’ ) 298 299 t i n d = [] 300 for i in r a n g e ( N ) : 301 if t [ i ] is not N o n e : 302 tmp = t [ i ] . f l a t t e n () 303 t i n d . a p p e n d (( ti [ i ] - tmp [ 0 ] ) * 304 (( t m p . s i z e - 1) /( tmp [ -1] - tmp [ 0 ] ) ) ) 305 e l s e : 306 t i n d . a p p e n d ( ti [ i ]) 307 e l s e : 308 t i n d = ti 309 310 r e t u r n m a p _ c o o r d i n a t e s ( f , n p . a s a r r a y ( t i n d ) , o r d e r = order , ** k w a r g s ) 193 Modul interp 194 Dodatek B Modul hpfilter Modul hpfilter s funkcijo create, ki ustvari konvolucijsko jedro visokoprepustnega filtra. 1 # -*- coding: utf-8 -*- 2 i m p o r t n u m p y as np 3 4 def c r e a t e ( k i n d = ’ h a m m i n g ’ , f s t o p =0 .1 ) : 5 ’ ’ ’ 6 F u n k c i j a u s t v a r i k o n v o l u c i j s k o j e d r o v i s o k o p r e p u s t n e g a f i l t r a . 7 8 P a r a m e t r i 9 - - - - - - - - - 10 k i n d : str 11 Tip v i s o k o p r e p u s t n e g a filtra , in s i c e r " r a m p " , " shepp - l o g a n " , 12 " c o s i n e " , " h a m m i n g " ali " h a n n " . 13 f s t o p : f l o a t 14 D e l e ž f r e k v e n č n e g a p o d r o č ja pod N y q u i s t o v o mejo , ki ga 15 o d r e ž e f i l t e r ( od 0 do 1) . 16 17 V r n e 18 - - - - 19 k e r n e l : v e k t o r 20 K o n v o l u c i j s k o j e d r o v i s o k o p r e p u s t n e g a f i l t r a . 21 ’ ’ ’ 22 len = 64 23 d = 1 - f s t o p 24 o r d e r = max (64 , 2** n p . c e i l ( n p . l o g 2 (2* len ) ) ) 25 26 f i l t = 2 .0 * n p . a r a n g e (0 , o r d e r *0 .5 ) / o r d e r 27 w = 2 .0 * n p . p i * n p . a r a n g e (0 , f i l t . s i z e ) / o r d e r 28 29 if k i n d == ’ r a m p ’ : 30 p a s s 31 e l i f k i n d == ’ shepp - l o g a n ’ : 32 f i l t [ 1 : ] *= n p . s i n ( w [ 1 : ] / ( 2 .0 * d ) ) /( w [ 1 : ] / ( 2 .0 * d ) ) 33 e l i f k i n d == ’ c o s i n e ’ : 195 Modul hpfilter 34 f i l t [ 1 : ] *= n p . c o s ( w [ 1 : ] / ( 2 .0 * d ) ) 35 e l i f k i n d == ’ h a m m i n g ’ : 36 f i l t [ 1 : ] *= 0 .54 + 0 .46 * n p . c o s ( w [ 1 : ] / d ) 37 e l i f k i n d == ’ h a n n ’ : 38 f i l t [ 1 : ] *= (1 .0 + n p . c o s ( w [ 1 : ] / d ) ) /2 .0 39 e l i f k i n d == ’ n o n e ’ : 40 f i l t . f i l l (1 .0 ) 41 e l s e : 42 r a i s e V a l u e E r r o r ( 43 ’ V r e d n o s t p a r a m e t r a " k i n d " je l a h k o ’ 44 ’ " r a m p " , " shepp - l o g a n " , " h a m m i n g " ali " h a n n "! ’ ) 45 46 f i l t [ w > n p . p i * d ] = 0 47 f i l t = n p . h s t a c k ([ filt , f i l t [ -2 :0 : -1 ]] ) 48 49 f i l t e r = ( n p . f f t . i f f t ( f i l t ) ) 50 f i l t e r C u t o f f = 0 .95 51 f i l t e r A b s = n p . a b s ( f i l t e r ) / n p . a b s ( f i l t e r ) . s u m () 52 f i l t e r S u m = f i l t e r A b s [0] 53 for i in r a n g e ( int ( n p . f l o o r ( f i l t e r A b s . s i z e *0 .5 ) ) ) : 54 f i l t e r S u m += f i l t e r A b s [ i + 1] + f i l t e r A b s [ -1 - i ] 55 if f i l t e r S u m >= f i l t e r C u t o f f : 56 b r e a k 57 58 k e r n e l = n p . h s t a c k ([ f i l t e r [ -1 - i :] , f i l t e r [: i + 1 + 1 ] ] ) 59 60 r e t u r n n p . r e a l ( k e r n e l ) 196 Literatura [1] M. Bürmen, Uvod v programski jezik Python. Ljubljana: Založba FE, 1st ed., 2016. [2] P. J. Deitel and H. M. Deitel, Intro to Python for Computer Science and Data Science: Le-arning to Program with AI, Big Data and The Cloud. United Kingdom: Pearson Education, 2019. [3] J. D. Murray and W. VanRyper, Encyclopedia of Graphics File Formats. Boston, USA: O’Reilly Media, 2nd ed., 1996. [4] G. D. Boreman, Modulation Transfer Function in Optical and Electro-Optical Systems. 1000 20th Street, Bellingham, WA 98227-0010 USA: SPIE, July 2001. [5] D. Malacara, Color Vision and Colorimetry: Theory and Applications, vol. PM204. Bellingham, USA: SPIE Press, 2 ed., 2011. [6] G. Wyszecki and W. S. Stiles, Color Science: Concepts and Methods, Quantitative Data and Formulae. New York: John Wiley & Sons, Inc., 2nd ed., 2000. Library Catalog: www.wiley.com. [7] B. Likar, Biomedicinska slikovna informatika in diagnostika. Založba FE in FRI, 1st ed., 2008. [8] J. V. Hajnal, D. L. G. Hill, and D. L. G. Hill, Medical Image Registration. CRC Press, June 2001. [9] O. M. Dorgham, S. D. Laycock, and M. H. Fisher, “GPU Accelerated Generation of Digitally Reconstructed Radiographs for 2-D/3-D Image Registration,” Ieee Transactions on Biomedical Engineering, vol. 59, pp. 2594–2603, Sept. 2012. Place: Piscataway Publisher: Ieee-Inst Electrical Electronics Engineers Inc WOS:000307895000024. [10] J. Hsieh, Computed Tomography: Principles, Design, Artifacts, and Recent Advances. SPIE Press, 2nd ed., 2015. [11] J. L. Prince and J. Links, Medical Imaging Signals and Systems. Prentice Hall, 2nd ed., 2014. [12] P. Suetens, Fundamentals of Medical Imaging. Cambridge University Press, 2nd ed., 2009. 197 LITERATURA LITERATURA [13] “BrainWeb: Simulated Brain Database.” https://brainweb.bic.mni.mcgill.ca/ brainweb/. 198 Document Outline Uvod v programski jezik Python Naloge in vprašanja Rešitve in odgovori na vprašanja Interpolacija in decimacija slik Interpolacija slik Decimacija slik Naloge in vprašanja Rešitve in odgovori na vprašanja Parametri in kakovost slik Naloge in vprašanja Rešitve in odgovori na vprašanja Filtriranje slik Naloge in vprašanja Rešitve in odgovori na vprašanja Prikazovanje in preslikovanje slik Naloge in vprašanja Rešitve in odgovori na vprašanja Kalibracija in obnova sivinskih vrednosti Naloge in vprašanja Rešitve in odgovori na vprašanja Geometrijske preslikave slik Naloge in vprašanja Rešitve in odgovori na vprašanja Geometrijska kalibracija slik Toga poravnava Afina poravnava Projektivna poravnava Odprava radialnih distorzij Naloge in vprašanja Rešitve in odgovori na vprašanja Geometrijska poravnava slik s postopkom optimizacije Naloge in vprašanja Rešitve in odgovori na vprašanja Projekcije 2D slik Naloge in vprašanja Rešitve in odgovori na vprašanja Projekcije 3D slik Naloge in vprašanja Rešitve in odgovori na vprašanja Rekonstrukcija slik s povratno projekcijo Naloge in vprašanja Rešitve in odgovori na vprašanja Modul interp Modul hpfilter