Oefeningenles beeldverwerking -...

7
Oefeningenles beeldverwerking Histogram Wat is een histogram, hoe kunnen we een histogram opstellen? Welke afbeelding hoort bij welk histogram? Waarom? Oplossing Een histogram geeft voor elke grijswaarde het aantal pixels met die waarde weer. Voor een 256 kleuren afbeelding doe je dus : int hist[256]; for(int i=0;i < width; i++) for(int j=0;j < height; j++) hist[getpixelvalue(i,j)]++; In de linkse afbeelding is er niet echt 1 grijswaarde die primeert, de achtergrond is ook niet uitgesproken wit. We verwachten dus in het histogram verschillende piekjes, waaronder eentje voor de achtergrondkleur, eentje voor de kleur van de donkere camera in de achtergrond, … De linkse afbeelding correspondeert dus met het rechtse histogram. In de rechterafbeelding domineren duidelijk 2 kleuren. De zwarte camera

Transcript of Oefeningenles beeldverwerking -...

Oefeningenles beeldverwerking

Histogram Wat is een histogram, hoe kunnen we een histogram opstellen?

Welke afbeelding hoort bij welk histogram? Waarom?

Oplossing Een histogram geeft voor elke grijswaarde het aantal pixels met die waarde weer. Voor een 256 kleuren afbeelding doe je dus : int hist[256]; for(int i=0;i < width; i++) for(int j=0;j < height; j++) hist[getpixelvalue(i,j)]++; In de linkse afbeelding is er niet echt 1 grijswaarde die primeert, de achtergrond is ook niet uitgesproken wit. We verwachten dus in het histogram verschillende piekjes, waaronder eentje voor de achtergrondkleur, eentje voor de kleur van de donkere camera in de achtergrond, … De linkse afbeelding correspondeert dus met het rechtse histogram. In de rechterafbeelding domineren duidelijk 2 kleuren. De zwarte camera

resulteert in een piek links in het histogram, de rechter piek in het histogram correspondeert met de lichte achtergrond.

Thresholding Thresholding werkt als volgt : Veronderstel een threshold T en een pixelwaarde p. Dan berekenen we in het nieuwe beeld een pixelwaarde p als volgt : If p < T then p = 0 else p = 255 Dit kunnen we dus gebruiken om specifieke grijswaarden uit het beeld te verwijderen. Hieronder volgen een aantal thresholds voor de rechtste afbeelding hierboven voor respectievelijk T=20, T=80 en T=150. Het is dus duidelijk niet zo eenvoudig de juiste threshold te kiezen om de volledige camera en alleen de camera op die manier uit beeld te halen. Hoe kan je gebruik maken van het histogram om thresholds te bepalen? Kunnen we bij de linkse afbeelding ook zo tewerk gaan? Waarom wel / niet ?

Oplossing Voor de afbeelding met de camera is het histogram min of meer bruikbaar om de threshold te bepalen. In dat histogram zitten immers slechts 2 pieken, die heel erg duidelijk zijn. De ene piek correspondeert met de meest voorkomende achtergrondkleur, de andere piek correspondeert met de meest voorkomende camera kleur. Als we de threshold precies tussen beide pieken kiezen, dan is de kans het grootst dat alle camera pixels wel en alle achtergrond pixels niet geselecteerd worden. In dit geval ligt dat punt ergens tussen 130 en 140. De andere afbeelding bevat te veel piekjes in het histogram, maw de grijswaarden van de verschillende objecten liggen dichter – te dicht - bij elkaar.

Filters We gaan het effect van een aantal filters na in deze oefening. Wat is het basisprincipe van filters?

Wat doet elk van de bovenstaande filters? Waarom precies? Welke filter hoort bij welke afbeelding? Onderstaande afbeelding is alvast de originele.

1/9 1/9 1/9 1/9 1/9 1/9 1/9 1/9 1/9

1/16 2/16 1/16 2/16 4/16 2/16 1/16 2/16 1/16

1 1 1 0 0 0 -1 -1 -1

1 2 1 0 0 0 -1 -2 -1

0 1 0 1 -4 1 0 1 0

0 -1 0 -1 5 -1 0 -1 0

Oplossing. We beschouwen de convolutie van een kernel functie K met een afbeelding A. De resulterende afbeelding B = A * K wordt als volgt bepaald :

� �= =

−−=max

min

max

min

),().,(),(i

ii

j

jj

jyixAjiKyxB

De convolutie is een symmetrische en transitieve operator. Dit laatste betekent dat C = (A * K1) * K2 = A * (K1 * K2), ofwel dat het sequentieel toepassen van filters equivalent is aan het toepassen van één filter die de convolutie is van de twee filters.

Filters in de afbeeldingtabel

Filters in de kerneltabel

Average Neemt het gemiddelde over de negen pixels binnen het window. Het beeld is iets minder scherp, nauwelijks te zien. Kleine ruis in het beeld wordt evenwel weggewerkt.

Gaussian Averaging beschouwt alle pixels in het window als even belangrijk. De gaussian filter kent een groter gewicht toe aan pixels dichter bij de targetpixel volgens een

normaalverdeling σ2

2 2ji

Ce

+− met C = 0.25 en σ = 0.85

Prewitt Deze filter tracht randen te vinden in de afbeelding. We beschouwen de filter steeds in 1 dimensie, dus voor een afbeelding maken we een horizontale en een verticale filter. Randen hebben grote eerste afgeleiden. Zij A(x,y) een afbeelding.

),()1,(),(

),(),1(),(

yxAyxAy

yxA

yxAyxAx

yxA

−+=∂

−+=∂

Maar, in het punt A(x,y) is die afgeleide niet gedefiniëerd. Bovenstaande formules zijn geldig tussen ] [ y)A(x, , y)1,A(x + en ] [ y)A(x, , 1)yA(x, +

Prewitt Gaussian Laplacian Unsharp Masking Sobel Average

Average Gaussian Prewitt Sobel Laplacian Unsharp Masking

Anders gezegd, de afgeleide wordt steeds een beetje te veel naar rechts berekend. Om dit te vermijden nemen we als de afgeleide van A naar x in het punt A(x,y) ofwel het verschil tussen A(x+1,y) en A(x-1,y) ofwel het gemiddelde van

x

yxA

∂∂ ),(

en x

yxA

∂−∂ ),1(

.

Beide benaderingen resulteren in volgende expressies (op een constante factor na) :

De resulterende waarden kunnen zowel positief als negatief zijn. Het corresponderende beeld bevat de absolute waarden van het resultaat. Dit geldt ook voor de andere beelden die het resultaat voorstellen van het toepassen van een filter dat negatieve waarden kan opleveren.

Sobel De Sobel filter werkt analoog, maar kent een groter gewicht toe aan pixels dichter bij de targetpixel gelegen.

Laplacian De Laplacian veronderstelt dat een edge niet een erg grote eerste afgeleide heeft, maar dat er een sterke stijging is in de intensiteitsverandering. Daarvoor moeten we dus de tweede afgeleide beschouwen.

( ) ( )

[ ] [ ] [ ] [ ]),(4)1,()1,(),1(),1(

)1,(),(),()1,(),1(),(),(),1(

),()1,(),(),1(

),()1,(),(),1(

),(2

2

2

2

yxAyxAyxAyxAyxA

yxAyxAyxAyxAyxAyxAyxAyxA

y

yxA

y

yxA

x

yxA

x

yxA

yxAyxAy

yxAyxAxy

A

yx

A

x

y

A

x

AyxA

−−+++−++=−−−−++−−−−+

=∂

∂−∂

+∂+∂

∂−∂+∂

=−+∂∂+−+

∂∂=

∂∂

∂∂+

∂∂

∂∂

=∂∂+

∂∂=∇

Unsharp Masking Het versterken van de randen kunnen we bekomen door het beeld bekomen door de laplacian (negative edges) af te trekken van het originele beeld. R = A - ∇(A)

)1,()1,(),(

),1(),1(),(

−−+≈∂

−−+≈∂

yxAyxAy

yxA

yxAyxAx

yxA

Combinatie van filters De laplace filter is zeer gevoelig voor ruis in de afbeelding. Daarom wordt de laplacian filter vaak gecombineerd met de gaussian. De resulterende filter is een pak minder gevoelig voor ruis en heet de Marr-Hildreth filter. Reken deze filter uit.

Oplossing

������

������

−−−−

−=

���

���

−���

���

01210

10201

22822

10201

01210

161

010

141

010

*

121

242

121

161

We rekenen deze convolutie uit in stapjes. De tweede operand werd telkens gespiegeld en verschoven zodat het resultaat bekomen wordt door het vermenigvuldigen van overeenkomstige elementen van beide matrices en de producten op te tellen (zoals een scalair product). Merk op dat de spiegeling—afkomstig van de mintekens in de convolutieformule—hier geen effect heeft aangezien de filter(s) symmetrisch zijn.

������

������

−=>

������

������

������

������

8

00000

00100

01410

00100

00000

00000

01210

02420

01210

00000

OP

������

������

−=>

������

������

������

������

2

00000

00010

00141

00010

00000

00000

01210

02420

01210

00000

OP

���

���

−−−

−=

���

���

−−���

���

010

151

010

010

141

010

000

010

000

������

������

=>

������

������

������

������

2

00000

00001

00014

00001

00000

00000

01210

02420

01210

00000

OP

������

������

−=>

������

������

−������

������

2

00100

01410

00100

00000

00000

00000

01210

02420

01210

00000

OP

En zo voort … Een aantal filters hebben een duidelijke oriëntatie, zoals de Prewitt en Sobel filter. Kunnen we gebaseerd op die filter een filter maken die minder/niet oriëntatie gevoelig is?

Links zie je het resultaat na toepassing van de horizontale filter, in het midden van de verticale en rechts het resultaat na combinatie van beide filters.

Oplossing Het is niet mogelijk een filter te ontwerpen dat door louter convolutie met een beeld randen detecteert ongeacht hun oriëntatie. Indien het horizontale en verticale filter opgeteld worden, ontstaat een filter dat gevoelig is voor randen in één van de twee diagonaalrichtingen (welke hangt af van de combinatie van tekens in de filters, ga dit zelf na). Als we echter een niet-lineaire operatie toelaten, kunnen we zeer eenvoudig alle randen in een beeld detecteren. Als we eerst het horizontale en verticale filter apart toepassen en dan de absolute waarden van het resultaat optellen dan krijgen we een oriëntatie-ongevoelige randdetector, zoals te zien is in het derde beeld.