Medicinska Bilder, TSBB3 Lab: Mätvärden på Medicinska Bilder Maria Magnusson, 22 Senaste updatering: september 27 Avdelningen för Datorseende, Institutionen för Systemteknik Linköpings Universitet Introduktion I denna laboration ska vi göra olika mätningar på bilder. Laborationen behövs som förkunskap till den senare laboration om SPECT. 2 Förberedelser inför laborationen Läs igenom hela laborationshandledningen noggrant. Valda delar av senaste föreläsningen ger den teori som behövs. Lös förberedelseuppgifterna i lab-handledningen innan laborationstillfället! De är markerade med en pekande hand. 3 Laborationen 3. Start Börja med att logga in och starta MATLAB. De program som vi ska använda ligger på /site/edu/cvl/medicinskabilder/noise. Kopiera dessa filer till din hem-katalog och kör programmet NOISE.m. En fyrdelad test-bild med fyra områden med värdena, 7, 4 och visas till vänster, se Fig.. Matlab-koden för detta program är:
% Image size 2 % ========== 3 N = 28; 4 5 % Compose test image 6 % ================== 7 im = zeros(n,n); 8 im(:n/2,:n/2) = ; 9 im(n/2+:n,:n/2) = 4; im(:n/2,n/2+:n) = 7; im(n/2+:n,n/2+:n) = ; 2 3 figure() 4 colormap(jet) 5 subplot(2,2,), imagesc(im, [ ]) 6 axis image, colorbar 7 title( a) original image ) a) original image 2 4 8 2 4 8 Figur : a) Testbild. 5 Öppna programmet NOISE.m i en editor och lägg nu till gaussiskt brus med medelvärde mean= och standardavvikelse std= : gnoiseim = im + * randn(n,n); Medelvärdet kan beräknas i en 5 5-omgivning runt varje pixel. Enklast gör man detta genom att falta original-bilden med ett 5 5-filter fyllt med ettor och dividera med antalet ettor: kernelsize = 5; kernel = ones(kernelsize,kernelsize)/(kernelsize^2); gaver = conv2(gnoiseim, kernel, same ); Lägg till också detta i koden och visa resultatet i en bild till höger. Det ska se ut som i Fig. 2. Lyckades ni? 2
a) original image b) local mean 2 4 8 2 4 8 5 2 4 8 2 4 8 5 Figur 2: a) Testbild med pålagt gaussiskt brus. b) Lokalt medelvärde. 3.2 Mätvärden på bild med gaussiskt brus Uppskatta (stickprovs-)standardavvikelsen av originalbilden och visa den under originalbilden. Använd lika stora omgivningar som för beräkning av medelvärden. Vilka kommandon ger du? Nedan finns en tabell med värden i originalbilden. Enligt Matlab-koden ovan är medelvärdena, 7, 4, i de fyra områdena och standardavvikelsen på det pålagda gaussiska bruset. Komplettera tabellen nedan ungefärligt genom att klicka i bilderna. Område övre vänster övre höger nedre vänster nedre höger värde 7 4 ett uppskattat medelvärde standardavvikelse en uppskattad standardavvikelse förväntat CV-värde ett uppskattat CV-värde Fyll i raden förväntat CV-värde i tabellen ovan. 3
Uppskatta CV-värdet av originalbilden och visa den snett under originalbilden. Använd lika stora omgivningar som för beräkning av medelvärden. Komplettera tabellen ovan genom att klicka i bilderna. Hur lika bör de uppskattade värdena i de två tabellerna ovan vara de korrekta värdena? Välj mellan "exakt lika, ungefär lika och behöver inte vara lika. 3.3 Mätvärden på bild med poissonbrus Poissonbrus är ju som bekant viktigt i medicinska sammanhang. Nu ska vi göra om mätningarna i avsnitt 3.2 på poissonbrus istället för gaussiskt brus. Vilka värden ska gälla för standardavvikelsen i de de fyra områdena med medelvärde, 7, 4,? Kopiera filen NOISE.m till NOISEpoisson.m. Ersätt det gaussiska bruset med poissonbrus i NOISEpoisson.m. Den approximativa metoden för att skapa poissonbrus beskrevs på föreläsningen: Skapa först approximativt poissonbrus med hjälp av gaussiskt brus. Lokalisera därefter pixlar med negativa värden. I dessa pixlar: kasta tärningen igen tills ett positivt värde erhålls. Kodskelett för Poissonbrus finns i filen Poisson.m som ser ut så här: % Add Poisson noise 2 % ================== 3 pnoiseim = im + XXX; % Add Poisson noise to the image. Replace XXX! 4 [y,x] = find(pnoiseim<); % Locate positions of negative values 5 for k = :size(y,) % Redo the calculation for these positions 6 posval = ; 7 while (posval==) % Compute ONE new noise value. 8 val = im(y(k),x(k)) + YYY; % Replace YYY! 9 if (val>) posval = ; end end pnoiseim(y(k),x(k)) = val; 2 end De två översta bilderna ska se ut som i Fig. 3. Vad ersätter ni XXX med och vad ersätter ni YYY med? Beräkna nu CV-värdena på samma sätt som i avsnitt 3.2 och fyll i tabellen nedan. 4
Område övre vänster övre höger nedre vänster nedre höger värde 7 4 standardavvikelse förväntat CV-värde ett uppskattat CV-värde a) original image b) local mean 2 4 8 2 4 8 5 2 4 8 2 4 8 5 Figur 3: a) Testbild med pålagt poissonbrus. b) Lokalt medelvärde. 3.4 Krympning och etikettering Matlab-koden för programmet CVL.m visas nedan. Då det exekveras visas en binär bild med bokstäverna CVL till vänster och till höger visas resultatet av krympning (erosion) av två lager pixlar, se Fig. 4. load CVLim 2 3 SE = [ ; 4 ; 5 ; 6 ; 7 ]; 8 9 CVLerode = imerode(cvlim, SE); figure(), colormap(gray) 2 subplot(2,2,), imagesc(cvlim, [ ]) 3 axis image, colorbar 4 title( original image ) 5 subplot(2,2,2), imagesc(cvlerode, [ ]) 6 axis image, colorbar 7 title( eroded image ) I en senare lab om SPECT ska vi göra denna operation i 3D. Kommandot imerode fungerar tyvärr inte för 3D. Istället får man gå direkt på definitionen med faltning. Börja med att göra en faltning mellan CVLim och SE: 5
CVLexpand = convn(cvlim, SE, same ); Visa bilden i färgtabellen jet i kontrastområdet [ 25]. Använd också colorbar. Studera bilden och beskriv hur den ser ut. Ge sedan ett kommandot som innehåller ==. Se ledningen nedan. Resultatet ska bli exakt samma bild som vi fick för imerode. Ledning: En användning av == visas nedan. Antag att du har en matris i inimage som där du vill söka efter värdet 5. Exekvera: outimagelogical = (inimage == 5); outimage = double(outimagelogical); I outimage hamnar då en matris som har värdet där inimage hade värdet 5. Klassen (class) på outimagelogical är logical medan klassen på outimage är double. 2 4 8 original image 2 4 8.5 2 4 8 eroded image 2 4 8.5 Figur 4: a) Binär bild. b) Efter krympning (erosion) av två lager pixlar. Vi ska nu etikettera bilden. Använd nedanstående Matlabkommandon då de fungerar även för 3D. Resultatet visas i Fig. 5. temp = bwconncomp(cvlerode); CVLlabel = labelmatrix(temp); Bokstaven C (se Fig. 6a) fås enkelt ur den etiketterade bilden i Fig. 5, genom att utnyttja == igen. Ge kommandot! 6
2 4 8 labelled image 2 4 8 3 2 Figur 5: Etiketterad bild. 2 4 8 only C 2 4 8.5 2 4 8 noisy C 2 4 8 5 Figur 6: a) En binär bild av bokstaven C. b) En brusig bild av bokstaven C. 3.5 CV-beräkning innanför ett område Slutligen ska vi beräkna CV-värdet i en brusig boktav C, see Fig. 6b. Skapa Fig. 6b genom att kombinera Fig. 2a med Fig. 6a. Ge kommandot för att skapa innehållet i Fig. 6b nedan! noisyc = Använd nu din gamla kod för att beräkna medelvärde, standardavvikelse och CV på noisyc. Resultatet bör se ut som i Fig. 7. Varför blir resultatet så dåligt jämfört med när vi räknade ut medelvärde, standardavvikelse och CV på de fyra stora rutorna? Använd istället nedanstående kod för CV-beräkning. Den fungerar även på mindre objekt. Spara koden och kommandot som är svar på sista frågan. De ska senare användas för CV-beräkning på lungor på SPECT-labben! 7
kernelsize = 5; kernelnodiv = ones(kernelsize,kernelsize); Div = conv2(onlyc, kernelnodiv, same ); gavernew = conv2(noisyc, kernelnodiv, same )./Div; g2avernew = conv2(noisyc.^2, kernelnodiv, same )./Div; fact = Div./(Div-); gsdnew = real(sqrt((g2avernew-gavernew.^2).* fact)); CV = gsdnew./(gavernew+eps); a) original image b) local mean 2 4 8 2 5 2 4 8 2 5 2 4 8 c) standard deviation 2 5 2 4 8 d) CV, ugly 2.5 Figur 7: Misslyckat försök att beräkna medelvärde, standardavvikelse och CV innanför det brusiga C:et. Visa medelvärde (gavernew), standardavvikelse (gsdnew) och CV som bilder. Kontrollera att de liknar Fig. 8. Vad är det korrekta medelvärdet och standardavvikelsen och stämmer det med dina bilder? Till sist ska vi fixa till CV-bilden så att enbart CV-värden innanför C:et syns så som i Fig. 9. Ge kommandot! CVwithinC = 8
a) original image b) local mean 2 4 8 2 5 2 4 8 2 5 2 4 8 c) standard deviation 2 5 2 4 8 d) CV, nice 2.5 Figur 8: Lyckat försök att beräkna medelvärde, standardavvikelse och CV för det brusiga C:et. 2 4 8 CV within C 2.5 Figur 9: CV innanför det brusiga C:et. 9