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).

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:

Liten 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
Back