Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Artiklar / Titel på artikeln

Grundläggande bildbehandling

Postad 2005-02-22 av Johan Agorelius i sektionen ASP.NET, C#, Okategoriserat med 0 Kommentarer | Läst av: 4958, Betyg: 100%

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
  » Den digitala bilden
  » Bildbehandling
  » Filter
  » Svartvitt filter
  » Invertering
  » Öka kontrast
  » Förstärka och förvränga färger
  » Brus
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


Upp

0 Kommentarer

Skriv en kommentar på artikeln

Ditt betyg på artikeln



Kommentar:





Nyligen

  • 08:28 Butiksskyltar: Hur upplever utbude
  • 22:31 Slappna av
  • 19:55 kick-off med fokus på hälsa?
  • 19:53 kick-off med fokus på hälsa?
  • 16:24 Föreslå en skönhetsklinik online
  • 16:23 Föreslå en skönhetsklinik online
  • 18:42 Hvor finder man håndlavede lamper
  • 18:41 Hvor finder man håndlavede lamper

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 808
27 960
271 761
565
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies