Grundläggande bildbehandling
Förord
Skriva egna filter
Hur en bild representeras digitalt och hur man utför grundläggande bildbehandling. Jag kommer i den här grundkursen förklara hur en digital bild är uppbyggd generellt och hur man enkelt kan manipulera bilden med sin programkod och skriva egna filter. Jag kommer inte att använda något speciellt program språk, men mina exempel kommer att vara tagna ifrån matlab.Innehåll
»»
»
»
»
»
»
»
Relaterade artiklar
Den digitala bilden
Består som antagligen alla känner till av pixlar, eller bildpunkter. I en färgbild (rgb) består varje pixel av tre värden för respektive röd, grön och blå. Det betyder att vaje pixel har en viss mängd rött, en viss mängd grönt och en viss mängd blått i sig. Ofta sträcker sig dessa intensitets värden ifrån 0 till 255. En sådan bild innehåller 255^3 = 16 581 375 (ungefär 16 miljoner) färger. I en svartvit bild räcker det ett intensitetsvärde, en sådan bild har alltså 255 olika grånyanser.
Bildbehandling
Den digitala representationen av en rgb färgbild kan alltså sägas vara en h*v*3 matris, där h är bildens höjd, w bildens vidd. Nyckeln till att behandla en bild digitalt ligger alltså i att behandla dess pixelvärden i den här matrisen.Hur en bild läses in till en matris är olika för olika program språk, i t.ex. matlab räcker det med att skriva.
A = imread('Bild1’,'jpg');
Så befinner sig bildens pixelvärden i en h*v*3 matris i A.
För att nu kunna manipulera varje pixel skapar vi en loop som går igenom bildens alla pixlar och plockar ut respektive r,g och b värde för den aktuella pixeln.
I matlab kan detta göras på följande sätt:
for i = 1:1:w
for j = 1:1:h
r = double(A(i,j,1));
g = double(A(i,j,2));
b = double(A(i,j,3));
end
end
Nu finns varje pixels r,g och b värde som double variabler, färdiga att maniupleras
Är man t.ex. bara intresserad av en färgs intensitet kan man sätta de andra till noll, t.ex. låta r behålla sitt värde och sätta de andra till noll.
g = 0;
b = 0;
Detta får följande resultat:
Filter
Nu skall jag skriva några enkla bildfilter.
Svartvitt filter
För att få en färgbild svartvit måste varje pixel ha samma värde på r,g och b, eftersom då är intensiteten av alla färger likastor, och tar därmed ut varandra.
Detta kan enkelt göras genom följande:
v = (r+g+b) / 3;
r = v;
g = v;
b = v;
Där v sätts till ett medelvärde av de tre färgernas intensitets, och sedan sätts alla färgvärden till detta värde.
Invertering
För att invertera bilden, behöver man invertera varje pixel till dess komplementfärg, vilekt betyder att intensiteten för r,g och b värdena måste inverteras. Om t.ex. r = 10 i en pixel på originalbilden, så skall r = 255-10 = 245 i den inverterade bilden. Detta görs således enkelt genom:
r = 255 - r;
g = 255 - g;
b = 255 - b;
Öka kontrast
För att öka en bilds kontrast måste skillnaden i intensitet bli större mellan de olika pixlarna. Detta kan göras genom att helt enkelt minska intensiteten för pixlar med intensitet under ett visst nyckelvärde och omvänt öka intensiteten för de pixlar som ligger över detta värde. Hur mycket intensiteten skall minskas eller ökas avgör hur kraftig kontrasten blir. I exemplet nedan använder jag konstanten k = 70, och nyckelvärdet 127, eftersom 255/2 = 127,5 och heltal måste användas.
k = 70;
if r > 127
r = r + k;
else
r = r - k;
end
if g > 125
g = g + k;
else
g = g - k;
end
if b > 125
b = b + k;
else
b = b - k;
end
Om man vill dra det till det yttersta så sätter man alla pixlar som ligger under 127 till 0 och de över till 255. Då får man en bild som endast innehåller två intensiteter, i en svartvit bild antingen svart eller vitt.
if r > 127
r = 255;
else
r = 0;
end
if g > 125
g = 255;
else
g = 0;
end
if b > 125
b = 255;
else
b = 0;
end
Förstärka och förvränga färger
Om man vill förstärka färgerna i en bild och samtidigt få lite roliga effekter kan man leta ut den färg (r,g elelr b) i varje pixel som har högst intensitet och sedan låta den färgen vara helt dominerande i den pixeln, alltså sätta de andra färgerna till 0 och den aktuella färgen till 255.
if r > g
max = r;
g = 0;
r = 255;
else
max = g;
r = 0;
g = 255;
end
if b > max
r = 0;
g = 0;
b = 25;
end
Vill man istället blanda om färgerna I en bild så kan man låta r,g och b värden överta varandras värden, detta kan ofta ge ganska roliga effekter.
rr = r;
r = g;
g = b;
b = rr-30;
Brus
Att lägga till lite slumpmässigt brus i bilden kan ofta få bra effect, t.ex. om man vill fåbilden att se gammal ut etc.Vanligt brus kan fås genom att t.ex. slumpmässigt sätta vissa färgvärden i vissa pixlar till 0
if s > 33
r = 0;
elseif s > 66
g = 0;
else
b = 0;
end
I följande kodsnutt lägger jag på ett vertikalt brus genom att låta vissa pixlar helt enkelt byta plats vertikalt. I det här falet låter jag en slumpgenerator bestämma vilka pixlar detta skall gälla. Koden nedan är återigen ett exempel ifrån matlab.
grad = 10;
s = 100*rand(1);
if s > 80
r = double(A(j,j,1));
g = double(A(j,j,1));
b = double(A(j,j,1));
end
0 Kommentarer