Bildbehandling
Denna sida beskriver hur bilderna i
labben lagras. Jag har lagt in en del Wikipedialänkar på sidan. Om du
vill veta allt i detalj får du läsa länkarna annars klarar du dig med
följande skissartade framställning.
Bilder kan lagras på många olika sätt, du har säkert sett ändelser som gif, jpeg (eller jpg) som betecknar olika lagringsformat. Följande Wikipedialänk listar ännu fler format. Bilder tar stor plats, så oftast vill man använda någon form av datakompression och då speciellt så kallad bildkompression. Man skiljer mellan lossless, där man inte gör sig av med någon information från ursprungsbilden (man försämrar inte bildkvaliten) och lossy där man "slänger" data på ett listigt sätt för att spara plats (vilket ger mer eller mindre försämrad kvalitet).
Matlabs mat-filer är också komprimerade. pie.mat-filen,
i lab1, kräver endast 5079906 bytes i lagringsutrymme. Det beror dels
på att elementen är heltal i intervallet [0, 9] (Matlab genomskådar
detta) och att data komprimeras. Hade vi haft godtyckliga 64-bitars
flyttal som element och ingen datakompression hade det krävts minst 8 ·
107 bytes, nästa sexton gånger så mycket. Ett annat exempel på datakompression är mp3-formatet som används för att spara ljud så att det tar lite plats.
Bilderna
i en digitalkamera lagras ofta i jpeg-format. Du kan ju räkna på hur
stor plats en komprimerad bild tar jämfört med vad en okomprimerad
borde ta. För att göra den beräkningen måste du veta hur många pixlar
du väljer att lagra bilderna med och hur många bytes varje pixel
(bildpunkt) kräver. Jag har en gammal 3.2 megapixel-kamera och lagrar
bilder i formatet 2048 x 1536. Varje pixel tar tre bytes (en för
vardera röd, grön och blå färg),
så en okomprimerad bild borde ta 3 x 2048 x 1536 bytes = 9 Mbyte, men
jpeg-bilderna tar (varierar beroende på motiv) cirka 0.7 Mbyte.
Anledningen till att det räcker med de tre färgerna, rött, grönt och blått, är att det finns tre slag av tappar i det mänskliga ögat som är känsliga för dessa färger.
Bilderna i labben lagras i ett okomprimerat bmp-format (bitmap), där bilderna har storleken 760 x 580. Varje pixel tar en byte. Formatet använder sig av indexerad färg
vilket innebär att varje bildpunkt är ett index in i en så kallad
färgtabell (eng. colour map eller colour lookup table, CLUT). Tänk dig en matris där varje rad är en RGB-trippel
(Röd-Grön-Blå) och där pixelvärdet är radindex i matrisen. Färgtabellen
är inkluderad i bildfilen, men den tar inte så stor plats (antalet
rader är ju begränsat av 2^8 = 256). En fil kräver alltså ett
lagringsutrymme av drygt 760 x 580 = 440800 bytes.
Matlab kan läsa bildfiler i många format (help imread) och för att läsa bmp-filerna i lappen skriver man (om namnet på filen är bildfil.bmp):
[I, M] = imread('bildfil.bmp');
I blir en 760 x 580-matris där matriselementen är av typen uint8 (unsigned 8-bit integer), så alla element i I
ligger i intervallet [0, 255]. Så för att få ett giltigt index får man
addera ett, noll är ju inte ett giltigt index. Detta ger upphov till
problem (se nedan). M är färgtabellen, en 256 x 3-matris där elementen är av typen double.
För att titta på bilden ger man kommandot:
imshow(I, M)
Glömmer man färgtabellen får man en gråskalebild.
I labben kommer du eventuellt att utföra beräkningar med elementen i I-matrisen (beror på hur du löser uppgiften). Eftersom elementen är av typen uint8 så kan detta leda till bekymmer vilket följande exempel visar.
>> x = uint8(255) % skapa en variabel x av typen uint8
x = 255
% Fick vi rätt typ? Jo då.
>> whos
Name
Size
Bytes Class Attributes
x
1x1
1 uint8
>> x = x + 1
x = 255 % kan inte bli större än 255
>> x = uint8(0)
x = 0
>> x = x - 1
x = 0 % och inte mindre än noll
Man använder uint8 för att spara plats, men för att kunna räkna med I-värdena kan man konvertera hela I-matrisen till double:
I = double(I);
Matrisen
tar nu åtta gånger så stor plats. I labben kan man dock klara sig utan
denna konvertering, men du skall vara medveten om problemet.
Här är en del av en typisk bild:
I
labben vill vi hitta och räkna de gröna plustecknen som finns i
bilderna. Jag påstår, och du får använda detta utan att kontrollera att
det stämmer, att den gröna färgen alltid återfinns i rad 129 i
färgtabellen, M.
>> M(129, :)
ans = 0 1 0 % 0 av röd och blå, max av grönt