Probleem met beeldfiltering. Algemene concepten van beeldfiltering

In het artikel wordt het gebruik van de convolutiematrix (twistmatrix of convolutiematrix) besproken, waarmee je filters zoals vervagen, verscherpen en vele andere op afbeeldingen kunt maken en toepassen.

Het artikel zal niet alleen interessant zijn voor webprogrammeurs, maar ook voor iedereen die er op de een of andere manier bij betrokken is softwarematige verwerking afbeeldingen, omdat functies voor het werken met de twist-matrix in vele talen beschikbaar zijn (php en flash zijn zeker bekend). Ook zal het artikel interessant zijn voor ontwerpers die gebruiken Adobe Photoshop, omdat het een bijbehorend filter heeft (Filter-Other-Custom).

Voorbeelden zullen verschijnen PHP-taal met behulp van de GD-bibliotheek. Theorie, praktijk, voorbeelden (let op, veel foto's!)

Theorie

Nee zeggen wiskundige taal, convolutie is de transformatie van de ene matrix met behulp van een andere, die wordt genoemd kern("kernel"). Bij het verwerken van afbeeldingen fungeren matrices van RGB-kanalen van pixels in rechthoekige coördinaten als de initiële.

De kern is meestal een 3x3-matrix, maar grotere zijn mogelijk (5x5, 7x7, enz.). De kern bevat mate van invloed ("waarde") de omringende waarden van een element naar het element zelf.

De transformatie vindt als volgt plaats. Elk element van de oorspronkelijke matrix wordt vermenigvuldigd met de centrale waarde van de kernelmatrix. Bovendien worden de omringende elementen vermenigvuldigd met de overeenkomstige waarden (bij een kernelgrootte van 3x3 zullen er 8 zijn), waarna de resultaten worden opgeteld en geaccepteerd als de geconverteerde waarde.

Hier is een eenvoudig grafisch voorbeeld:

De geconverteerde waarde is rood gemarkeerd, de reikwijdte van de kernelmatrix is ​​groen gemarkeerd.

Wat er gebeurde als gevolg van de transformatie. De waarden van alle omringende pixels, inclusief eigenwaarde is gelijk aan nul, behalve voor het bovenste gemiddelde, waar het gelijk is aan één. Het resultaat is dus:

(40*0)+(42*1)+(46*0)+(46*0)+(50*0)+(55*0)+(52*0)+(56*0)+(58*0) = 42

Zoals je kunt zien, deze transformatie verplaatst de afbeelding 1 pixel naar beneden.

Dus convolutie in in dit geval is een transformatie van een afbeelding, waardoor elke pixel van het resultaat wordt beïnvloed door de omgeving eromheen. De mate van invloed van dit gebied wordt gespecificeerd met behulp van een "kernel" of twistmatrix.

div- en offsetwaarden

Bij het verwerken van beelden kom je niet alleen met transformatie weg; je hebt ook normalisatie nodig. Wat moet ik doen als de resulterende waarde groter is dan 255 of kleiner dan 0? Dergelijke bloemen bestaan ​​niet. Bovendien is het vrij gebruikelijk om over de kleurgrenzen heen te gaan.

Om het resultaat te normaliseren, worden aanvullende variabelen gebruikt: div (deler) en offset (coëfficiënt). Ze werken heel eenvoudig: het resultaat van de transformatie wordt opgedeeld in een div en er wordt offset aan toegevoegd.

Het is niet moeilijk te raden dat standaard div = 1, offset = 0 is (div = 0 kan niet worden ingesteld!).

Bij transformatie wordt de div meestal genomen als de som van alle elementen van de twistmatrix. Met deze voorwaarde kunt u kleurvervormingen voorkomen als deze niet nodig zijn.

Als het getransformeerde gebied dezelfde kleur bevat, zal het resultaat de som zijn van de kernelelementen vermenigvuldigd met deze kleur. Om de kleur ongewijzigd te laten, moet u daarom het resultaat van de transformatie met hetzelfde bedrag delen.

Een eenvoudig voorbeeld: het ‘negatieve’ filter.

We nemen de volgende afbeelding als startafbeelding:

aan de hand van dit voorbeeld kunt u zien hoe grote en kleine tekst, afbeeldingen en lijnen veranderen. Laten we nu een twistmatrix maken om het negatieve effect te bereiken:

Volgens de matrix blijkt dat als resultaat van de transformatie alle kleuren een negatieve waarde zullen hebben. Om de kleuren negatief te maken, moet je offset = 256 instellen, zodat de kleuren van alle pixels worden afgetrokken van 256, wat een negatief beeld is:

Hoe het te doen in PHP

In de GD-bibliotheek in PHP is er een functie imageconvolutie, die 4 parameters bevat. De eerste is de afbeeldings-ID. De tweede is een matrix in de vorm van een array van 3 arrays met 3 variabelen. De derde en vierde zijn de div en offset.

Hier is de code die de afbeelding negatief maakt:

    $img = imagecreatefromjpeg("images/pattern.jpg" );

    $matrix = array (

    matrix (0, 0, 0),

    matrix (0, - 1, 0),

    matrix (0, 0, 0)

    afbeeldingconvolutie($img, $matrix, 1, 256);

    imagejpeg ($img, "images/pattern_negative.jpg", 100);

Het is de moeite waard om meteen een zeer onaangename eigenschap van GD te vermelden: bij het converteren met behulp van imageconvolution "stort het alfakanaal in". Deze bug is al lang geleden gemeld, maar voor zover ik weet is deze nooit opgelost. Dit is niet het geval bij flits; bovendien zijn er extra parameters die verantwoordelijk zijn voor het verwerken van de randen van afbeeldingen wanneer sommige pixels uitvallen. In PHP worden randen simpelweg niet verwerkt.

Vervagen, verscherpen, reliëf maken

Hier is een standaardset effectmatrices:

Houd er rekening mee dat voor onscherpte de coëfficiënt div = 9. Voor een dergelijke matrix leidt alleen deze coëfficiënt niet tot kleurvervorming. Het moet ook gezegd worden dat er verschillende opties voor onscherpte zijn, ze verschillen enigszins in de sterkte van het effect.

En hier zijn de resulterende afbeeldingen:

Verscherpen:

"Nette" effecten

Zoals je in het vorige voorbeeld met onscherpte kunt zien, wordt het effect over de afbeelding heen gelegd, maar vrij sterk. Is het mogelijk om de sterkte van het effect op het beeld te verminderen? Het blijkt dat het mogelijk is. Maar om dit te doen, is het noodzakelijk om niet de mate van invloed van omringende pixels te veranderen, zoals het op het eerste gezicht lijkt, maar het aantal beïnvloedende pixels:

Dan krijgen we effecten die er veel netter uitzien:

Lichtvervaging:

Licht scherp:

Licht reliëf:

Hier is het de moeite waard om de vraag te stellen: hoe kan de kracht van het effect worden vergroot? Helaas alleen door het meerdere keren over elkaar te leggen, want hoe je het ook bekijkt, er wordt nog steeds een gebied van 3x3 pixels verwerkt. Dit is uiteraard zeer arbeidsintensief; het bereiken van onscherpte op plekken met behulp van Gaussiaanse vervaging, je moet het filter soms 100-200 keer toepassen. Dit kost heel veel tijd en veel middelen.

Tot slot

Ik wil zeggen dat je zelf een interessant effect kunt creëren. Om dit te doen, experimenteert u gewoon met de twistmatrix.

De twistmatrix kan met succes worden toegepast wanneer:

  • bijvoorbeeld het maken van “kleine” afbeeldingen. het genereren van avatars en previews (lichtvervaging ziet er hier bijzonder goed uit).
  • om “schaduwen” te creëren (al was het maar met een alfakanaal :)
  • bij het maken van een CAPTHCA (tekst + sterke verscherping of reliëf)
  • enz. :-)

Een mooie schaduw creëren

    * Creëert een mooie schaduw

    * Aandacht! Dit is een resource-intensieve operatie!

    * @param res $image - bronafbeelding

    * @param int $shadow_width - schaduwdikte (1..10, hoger wordt niet aanbevolen)

    * @param int $shadow_deep - schaduwkleurdiepte (1..20, hoe hoger, hoe zwarter)

    * @param string $bg_color - achtergrondkleur in #7def34 formaat

    functie imageaddshadow (& $image , $shadow_width = 4 , $shadow_deep = 7 , $bg_color = false )

    $w = afbeeldingenx($afbeelding);

    $h = afbeeldingeny ($afbeelding) ;

    $iw = $w + 4 * $schaduw_breedte ;

    $ih = $h + 4 * $schaduwbreedte;

    $img = afbeeldingcreatetruecolor ($iw, $ih) ;

    $schaduw_diep = 255 - $schaduw_diep * 12;

    $shadow = afbeeldingcolorallocate($img, $shadow_deep, $shadow_deep, $shadow_deep) ;

    als (! $bg_color ) (

    // Wit is de standaardkleur

    $bg = afbeeldingkleurallocate($img, 255, 255, 255);

    anders(

    list ($r, $g, $b) = array_map ("hexdec" , str_split ( ltrim ($bg_color, "#" ) , 2 ) );

    $bg = afbeeldingkleurallocate ($img, $r + 1, $g + 1, $b + 1);

    // Vul het gebied met de achtergrondkleur

    afbeeldinggevulderechthoek($img, 0, 0, $iw, $ih, $bg);

    // Maak een schaduw

    afbeeldinggevulde rechthoek ($img,

    1 + $schaduwbreedte,

    1 + $schaduwbreedte,

Annotatie: Invoering. Lineaire filters: definitie, anti-aliasingfilters, contrastverhogende filters, verschilfilters. Niet-lineaire filters: voorbeelden van niet-lineaire filters, morfologische operatoren

8.1. Invoering

Laten we ons voorstellen dat we, als we met één oog naar een scène kijken, er een glasplaat naar toe brengen. Als deze plaat niet perfect transparant was, zal het waargenomen beeld veranderen. Afhankelijk van het glas waaruit het bord is gemaakt, kan de verandering zeer divers zijn. Als dit glas bijvoorbeeld gekleurd is, krijgt het beeld de juiste tint, maar als het glas troebel is, wordt het wazig.

Beeldfiltering is vergelijkbaar met het kijken naar de wereld door een glasplaat, hoewel je hiermee een veel grotere verscheidenheid aan effecten kunt bereiken dan met experimenten met verschillende platen. Beeldfiltering is een bewerking die resulteert in een afbeelding van dezelfde grootte, verkregen uit het origineel volgens bepaalde regels. Normaal gesproken wordt de intensiteit (kleur) van elke pixel in de resulterende afbeelding bepaald door de intensiteiten (kleuren) van pixels die zich in een bepaalde buurt ervan in de originele afbeelding bevinden.

Regels die filtering definiëren (ze worden genoemd filters), kan zeer divers zijn. In deze lezing zullen we kijken naar de eenvoudigste filters. Merk op dat volgens de voorgestelde definitie een handeling die bestaat uit de opeenvolgende toepassing van twee of meer filters ook een filter is. Zo kunnen we erover praten samengestelde filters, overeenkomend met combinaties van priemgetallen. Nadat we in deze lezing de basistypen filters hebben bestudeerd, zullen we in volgende lezingen ingaan op het gebruik van filters die daaruit zijn samengesteld om een ​​verscheidenheid aan problemen op te lossen. Beeldfiltering is een van de meest fundamentele bewerkingen van computervisie, patroonherkenning en beeldverwerking. In feite begint het werk van de overgrote meerderheid van de methoden met een soort filtering van bronafbeeldingen. De filters die in deze lezing worden besproken zijn daarom van extreem belang vanuit het oogpunt van hun gebruik in verschillende toepassingen.

8.2. Lijnfilters

Definitie

(8.1)

Het resultaat is afbeelding B. In definitie (8.1) hebben we de sommatielimieten weggelaten. Gewoonlijk is de filterkernel alleen in een bepaalde buurt N van het punt (0, 0) niet nul. Buiten deze omgeving is F(i, j) óf precies nul óf heel dichtbij, zodat deze kan worden verwaarloosd. De sommatie in (8.1) wordt uitgevoerd over , en de waarde van elke pixel B(x, y) wordt bepaald door de pixels van het beeld A die in het venster N liggen, gecentreerd op het punt (x, y) (we zullen dit aanduiden deze verzameling N(x, y)) . Een filterkernel gedefinieerd op een rechthoekige omgeving N kan worden gezien als een m bij n matrix waarbij de zijdelengtes oneven getallen zijn. Wanneer u de kernel specificeert met de matrix M kl, moet deze gecentreerd zijn:

(8.2)

De situatie waarin de pixel (x, y) zich in de buurt van de randen van het beeld bevindt, behoeft ook verdere verduidelijking. In dit geval kan A(x + i, y + j) in definitie (8.1) overeenkomen met een pixel A die buiten het beeld A ligt. Dit probleem kan op verschillende manieren worden opgelost.

  • Filter dergelijke pixels niet door afbeelding B aan de randen bij te snijden of ze bijvoorbeeld met zwart te verven.
  • Neem de corresponderende pixel niet op in de optelling, waarbij het gewicht F(i, j) gelijkmatig wordt verdeeld over andere pixels in de buurt N(x, y) .
  • Bepaal pixelwaarden buiten de beeldgrenzen met behulp van extrapolatie. Beschouw bijvoorbeeld de intensiteitswaarde nabij de grensconstante (voor pixel (-2, 5) hebben we A(-2, 5) = A(0, 5) ) of beschouw de intensiteitsgradiënt nabij de grensconstante ( A(-2, 5) = A(0, 5) + 2(A(0, 5) - A(1, 5))).
  • Definieer pixelwaarden buiten de beeldgrenzen met behulp van spiegelreflectie (A(-2, 5) = A(2, 5) ).

Bij de keuze voor een specifieke methode moet rekening worden gehouden met het specifieke filter en de kenmerken van een specifieke toepassing.

Nadat we de algemene definitie van lineaire filters hebben onderzocht, gaan we verder met voorbeelden.

Filteren met behulp van de imfilter-functie

Beeldfiltering, inclusief correlatie en convolutie, kan worden geïmplementeerd met behulp van de imfilterfunctie. Laten we een voorbeeld bekijken van het filteren van een afbeelding met behulp van een schuifopening met afmetingen van 5×5 en identieke gewichtscomponenten. Zo'n filter wordt een middelingsfilter genoemd.

I = imread("munten.png"); u = degenen(5,5) / 25 u = 0,0400 0,0400 0,0400 0,0400 0,0400 0,0400 0,0400 0,0400 0,0400 0,0400 0,0400 0,0400 0,0400 0,0400 0,0400 0,0 400 0,0400 0,0400 0,0400 0,0400 0,0400 0,0400 0,0400 0,0400 0,0400 I2 = imfilter(I,h); imshow(I); % Bronafbeeldingcijfer, imshow(I2); % Afbeelding na filteren

Gegevenstypen

Gegevenstypen in de imfilter-functie worden op dezelfde manier ingesteld als bij het gebruik van andere vergelijkbare rekenkundige functies. De resulterende afbeelding heeft hetzelfde gegevensformaat als de originele afbeelding. De imfilter-functie berekent de waarden van elke resulterende pixel in dubbele precisie-indeling met behulp van drijvende-kommaberekeningen. Als de resulterende waarden het bereik overschrijden dat voor een bepaald gegevenstype is gedefinieerd, kan de imfilter-functie ze afkappen tot het gewenste bereik. Het hangt af van het gegevenspresentatieformaat. Als de gegevens de notatie van gehele getallen hebben, rondt de imfilter-functie het fractionele deel af.

Daarom moet u bij het gebruik van de imfilter-functie rekening houden met het formaat van de afbeeldingsgegevens. Laten we eens kijken naar een voorbeeld waarbij de imfilter-functie resulteert in negatieve waarden. De brongegevens werden in dubbel formaat gepresenteerd.

A = magisch(5) A = 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 h = [-1 0 1] h = -1 0 1 imfilter(A ,h) ans = 24 -16 -16 14 -8 5 -16 9 9 -14 6 9 14 9 -20 12 9 9 -16 -21 18 14 -16 -16 -2

Merk op dat het resultaat ook wordt weergegeven door negatieve waarden. Als matrix A niet in dubbelformaat wordt weergegeven, maar in uint8-formaat, krijgen we het volgende resultaat:

A = uint8(magie(5)); imfilter(A,h) ans = 24 0 0 14 0 5 0 9 9 0 6 9 14 9 0 12 9 9 0 0 18 14 0 0 0

Zodra de brongegevens zijn weergegeven in het uint8-formaat, worden de resulterende gegevens ook weergegeven in het uint8-formaat en worden negatieve waarden afgekapt tot 0. De brongegevens kunnen dus worden geconverteerd naar andere formaten, bijvoorbeeld een geheel getal met teken , voordat u de imfilterfunctie enkel of dubbel gebruikt.

Correlatie- en convolutie-opties

De imfilter-functie kan filteren uitvoeren met behulp van correlatie of convolutie. De standaardwaarde is correlatie omdat de functies voor het genereren van filters correlatiekernels genereren.

Als u echter wilt filteren met behulp van convolutie, moet u de optie "conv" opgeven als optioneel argument in de imfilter-functie. Laten we eens kijken naar een voorbeeld.

A = magie(5); h = [-1 0 1] imfilter(A,h) % filtering met behulp van correlatie ans = 24 -16 -16 14 -8 5 -16 9 9 -14 6 9 14 9 -20 12 9 9 -16 -21 18 14 -16 -16 -2 imfilter(A,h,"conv") % filtering met convolutie ans = -24 16 16 -14 8 -5 16 -9 -9 14 -6 -9 -14 -9 20 -12 -9 -9 16 21 -18 -14 16 16 2

Optie voor opvulling van afbeeldingsrand

Bij het berekenen van de resulterende pixels aan de rand van de afbeelding zal een deel van het filtermasker buiten de grenzen van de afbeelding uitsteken, zoals weergegeven in de afbeelding.


Filtermaskerwaarden die verder gaan dan de afbeeldingsgrens

Wanneer een filtermasker de afbeeldingsgrens overschrijdt, vult de imfilterfunctie doorgaans de ontbrekende cellen met nulwaarden. Een voorbeeld van een dergelijke vulling wordt weergegeven in de onderstaande afbeelding.


Ontbrekende pixels opvullen met nulwaarden

Als u een afbeelding filtert door de ontbrekende pixels met nullen te vullen, heeft de resulterende afbeelding een donkere lijn aan de rand van de afbeelding. Dit wordt weergegeven op de afbeelding.

I = imread("acht.tif"); h = eenheden(5,5) / 25; I2 = imfilter(I,h); imshow(I), title("Originele afbeelding"); figuur, imshow(I2), title("Afbeelding na filteren");

Om artefacten te elimineren die worden veroorzaakt doordat ontbrekende elementen worden gevuld met nullen, gebruikt imfilter alternatieve methoden voor het invullen van ontbrekende elementen. Eén van deze methoden is om de ontbrekende pixels in te vullen met de waarden van de buitenste pixels van de afbeelding. Deze methode wordt gedemonstreerd in de onderstaande afbeelding.


Een masker vullen met de buitenste pixels van een afbeelding

Wanneer u filteren implementeert door ontbrekende elementen op te vullen met extreme elementen van de afbeelding, moet u bovendien de optie "repliceren" opgeven in de imfilterfunctie.

I3 = imfilter(I,h,"repliceren");

figuur, imshow(I3);

De imfilterfunctie ondersteunt ook andere methoden voor het opvullen van ontbrekende pixels bij het verwerken van randelementen van een afbeelding. Hiervoor zijn er opties zoals "circulair" en "symmetrisch". Zie de beschrijving van de imfilterfunctie voor meer details.

Multidimensionale filtering

De imfilterfunctie kan ook multidimensionale afbeeldingen verwerken. De verschillen tussen het filteren van tweedimensionale en driedimensionale afbeeldingen zijn dat bij het verwerken van driedimensionale afbeeldingen elke kleurlaag, die een tweedimensionaal beeld vertegenwoordigt en kan worden verwerkt door een tweedimensionaal filter, afzonderlijk wordt gefilterd.


MATLAB heeft verschillende tweedimensionale en multidimensionale filterfuncties. De filter2-functie voert tweedimensionale lineaire filtering uit, conv2 voert convolutie uit op tweedimensionale signalen, en convn voert convolutie uit op multidimensionale signalen. Bij het werken met elk van deze functies is het noodzakelijk dat de brongegevens in dubbel formaat worden gepresenteerd. Het resultaat wordt ook in dubbelformaat gepresenteerd. Deze functies gebruiken altijd nulvulling voor ontbrekende pixels wanneer ze aan de rand van de afbeelding werken en ondersteunen geen andere opvulmethoden.

In tegenstelling tot de genoemde functies vereist imfilter niet dat de brongegevens naar een dubbel formaat worden geconverteerd. De imfilterfunctie heeft ook verschillende opties om ontbrekende elementen aan de rand van de afbeelding in te vullen.

Gebruik van vooraf gedefinieerde filtertypen

De fspecial-functie heeft de mogelijkheid om verschillende soorten vooraf gedefinieerde filters te genereren, wat wordt weerspiegeld in de vorm van het masker. Nadat u een filter hebt gemaakt met de functie fspecial, kunt u dit toepassen op afbeeldingsgegevens met behulp van de functie imfilter. Laten we een voorbeeld bekijken van de implementatie van een filter van het fuzzy-maskeringstype voor het verwerken van een afbeelding in kleur. De fuzzy masking-methode wordt effectief gebruikt om de randen te verbeteren en de details van afbeeldingen te vergroten.

I = imread("moon.tif"); h = fspeciaal("onscherp") h = -0,1667 -0,6667 -0,1667 -0,6667 4,3333 -0,6667 -0,1667 -0,6667 -0,1667 I2 = imfilter(I,h); imshow(I), title("Originele afbeelding") figuur, imshow(I2), title("Verwerkte afbeelding")

Methoden voor frequentieconversie

Frequentieconversiemethoden maken gebruik van zowel eendimensionale als tweedimensionale eindige impulsresponsiefilters. Deze methoden gebruiken een transformatiematrix waarvan de elementen frequentietransformaties definiëren.

De ftrans2-toepassingsfunctie is ontworpen om op frequentie gebaseerde beeldverwerkingsmethoden te implementeren. Deze functie genereert een 2D lineair filtermasker met behulp van een frequentietransformatiemethode om een ​​1D eindige impulsresponsiefilter te transformeren. (Voor meer details, zie Jae S. Lim, Tweedimensionale signaal- en beeldverwerking, 1990.

Merk op dat frequentietransformatiemethoden zeer goede verwerkingsresultaten opleveren. Laten we eens kijken naar een voorbeeld.

B = remez(10,,); h = ftrans2(b);


= freqz(b,1,64,"geheel"); kleurenkaart(jet(64)) plot(w/pi-1,fftshift(abs(H))) figuur, freqz2(h,)

Eendimensionale frequentierespons (links) en de bijbehorende tweedimensionale frequentierespons (rechts)

Bij op frequentie gebaseerde methoden wordt een lineair filtermasker gevormd op basis van de gewenste amplitude-frequentierespons.

In de toepassing genereert de fsamp2-functie een lineair 2D-filtermasker op basis van de gewenste frequentierespons van het 2D-filter. Het gegenereerde masker is bedoeld om te worden doorgegeven aan de corresponderende functies (bijvoorbeeld filter2 of conv2), die tweedimensionale lineaire filtering uitvoeren. Laten we het bovenstaande bekijken aan de hand van een specifiek voorbeeld.

Hd = nullen(11,11); Hd(4:8,4:8) = 1;


= freqspace(11,"meshraster");

mesh(f1,f2,Hd), as([-1 1 -1 1 0 1.2]), kleurenkaart(jet(64)) h = fsamp2(Hd);

figuur, freqz2(h,), as([-1 1 -1 1 0 1.2])

Lokale (venster)methoden


Er zijn functies in de Image Processing Toolbox die lineaire filtermaskers genereren op basis van de gewenste amplitude-frequentierespons met behulp van een eendimensionaal of tweedimensionaal venster. Om een ​​nauwkeuriger resultaat te verkrijgen, wordt bij het vormen van een matrix van de gewenste amplitude-frequentierespons aanbevolen frequentiemonsters te gebruiken die worden geretourneerd door de freqspace-functie.

Laten we dit eens bekijken met een voorbeeld.

Hd = nullen(11,11); Hd(4:8,4:8) = 1;

= freqspace(11,"meshraster"); mesh(f1,f2,Hd), as([-1 1 -1 1 0 1.2]), kleurenkaart(jet(64)) h = fwind1(Hd,hamming(11)); figuur, freqz2(h,), as([-1 1 -1 1 0 1.2])

Gewenste 2D-frequentierespons (links) en werkelijke 2D-frequentierespons (rechts)


Het creëren van de gewenste amplitude-frequentierespons

De filterontwerpfuncties fsamp2, fwind2 en fwind2 creëren filters op basis van een matrix van gewenste frequentieresponswaarden. De bijbehorende gewenste frequentierespons kan worden gecreëerd met behulp van de freqspace-functie.

Laten we eens kijken naar een voorbeeld van het maken van een circulair laagdoorlaatfilter met een grenswaarde van 0,5. Gebruik hiervoor de volgende code:

Freqspace(25,"meshraster");

Hd = nullen(25,25); d = sqrt(f1.^2 + f2.^2)

Perfecte circulaire laagfrequente respons


Berekening van de filterfrequentierespons

De freqz2-functie berekent de frequentierespons van een 2D-filter. Als we voor een filter met een eindige impulsresponsie aannemen dat dit het geval is

H =;

overweeg dan de berekening en visualisatie van 64x64 frequentieresponspunten h.

Laten we eens kijken naar een voorbeeld van beeldonscherpte. We implementeren deze procedure met behulp van een tweedimensionaal laagdoorlaatfilter (LPF) met eindige impulsrespons (FIR), dat is gevormd uit een eendimensionaal laagdoorlaatfilter met behulp van de frequentieconversiemethode.

Sommige soorten transformaties in beeldverwerking

In de meeste gevallen wordt een beeld wiskundig weergegeven als een functie van twee ruimtelijke variabelen ƒ(x,y). Functiewaarde op een punt (x,y) gelijk is aan het intensiteitsniveau op dat punt.

  1. Fourier-transformatie;
  2. Discrete cosinustransformaties
  3. Radon-transformaties
  4. Projectietransformaties

We zullen ook enkele termen bekijken die voor verschillende soorten transformaties zullen worden gebruikt.

Termijn

Definitie

Discrete transformaties

Dit is een type transformatie waarbij de bron- en resultaatgegevens worden weergegeven als discrete waarden. Discrete transformaties die zijn geïmplementeerd in MATLAB en, in het bijzonder, in de Image Processing Toolbox, omvatten de discrete Fourier-transformatie en discrete cosinustransformaties.

Frequentie domein Een gebied waarin het beeld wordt weergegeven als een som van periodieke signalen met verschillende frequenties.
Ruimtelijk gebied Een gebied waarin het beeld wordt weergegeven als punten in de ruimte, die elk overeenkomen met een bepaalde intensiteitswaarde.
Conversie

Alternatieve wiskundige weergave van afbeeldingen. Fourier-transformaties vertegenwoordigen bijvoorbeeld een beeld als een som van complexe exponentiële variabelen van amplitude, frequentie en fase. Dit type transformatie wordt meestal gebruikt bij beeldanalyse, -verbetering en -compressie.

De verscheidenheid aan benaderingen voor beeldverbetering valt in twee categorieën: verwerkingsmethoden in het ruimtelijke domein (ruimtelijke methoden) en verwerkingsmethoden in het frequentiedomein (frequentiemethoden). Het ruimtelijke domein verwijst naar de verzameling pixels waaruit het beeld bestaat. De voorverwerkingsfunctie van het ruimtelijke domein wordt geschreven als

Waar F(X, j) – invoerafbeelding,

G(X, j) – uitvoer (verwerkt) beeld,

H– functie-operator F, gedefinieerd in een bepaald domein ( X, j).

Dit soort operaties behoren tot de algemene klasse bewerkingen op aangrenzende elementen. Deze operaties zijn de belangrijkste hulpmiddelen hiervoor beeldverwerking op laag niveau of beeldverwerking in het ruimtelijke domein.

De belangrijkste benadering voor het bepalen van de buurt van een punt ( X, j) is het gebruik van een vierkant of rechthoekig gebied van een deel van de afbeelding gecentreerd op het punt ( X, j). Het midden van dit deel van de afbeelding beweegt van pixel naar pixel, bijvoorbeeld vanuit de linkerbovenhoek. Tegelijkertijd te verkrijgen G(X, j) operator wordt voor elke positie toegepast ( X, j). Hoewel soms andere buurtvormen (zoals een cirkel) worden gebruikt, wordt vanwege het gemak van implementatie de voorkeur gegeven aan vierkante vormen.

Eén van de meest gebruikte ruimtelijke domeinmethoden is gebaseerd op het gebruik van filters (convolutiemaskers, sjablonen, vensters). Typisch is een filtermasker een klein (bijvoorbeeld dimensie 3*3) tweedimensionaal systeem, waarvan de coëfficiënten zo worden geselecteerd dat ze een gegeven beeldeigenschap detecteren (Fig. 1.5, a).

Rijst. 1.5: a – filtermasker; b – filtermaskercoëfficiënten

Als de waarden w 1 ,w 2 ,…,w 9 vertegenwoordigen coëfficiënten, pixelmaskers ( X, j) en zijn acht buren (Fig. 1.5, b), dan kan het algoritme worden weergegeven door de volgende bewerking uit te voeren op een buurt van 3*3 punten (X, j) :

De taak van beeldfiltering in brede zin wordt opgevat als elke beeldverwerkingsprocedure waarbij een rasterbeeld wordt geleverd als invoer voor de procedure en een rasterbeeld wordt gegenereerd als uitvoer. Vaker wordt “filteren” echter opgevat als het zogenaamde interferentie filteren. Het belangrijkste doel van ruisfiltering is om afbeeldingen zo te verwerken dat het resultaat beter geschikt is vanuit het oogpunt van een specifieke toepassing. Over het algemeen kunnen we onderscheid maken lineaire filters(verzachtende filters, contrastverhogende filters, verschilfilters) en niet-lineaire filters(mediaanfilter).

Hier volgt een korte beschrijving van de meest voorkomende filtermethoden.

Laagdoorlaatfilter– verzwakt hoogfrequente componenten en vergroot de rol van laagfrequente componenten. Wanneer frequentie op afbeeldingen wordt toegepast, weerspiegelt deze de hoeveelheid details in de afbeelding. Plotselinge veranderingen in helderheid, interferentie en ruis zijn voorbeelden van hoogfrequente elementen in een afbeelding. Beeldvereffening wordt geïmplementeerd met behulp van de volgende kernels:

,

,

.

Hoogdoorlaatfilter– verzwakt laagfrequente componenten in het beeld en versterkt de rol van hoogfrequente componenten. Hoogdoorlaatfilters worden gebruikt om details zoals contouren en randen te benadrukken of om een ​​afbeelding scherper te maken. Elke sprong in helderheid en elke contour vertegenwoordigt intense details geassocieerd met verhoogde frequenties. Isolatie van hoogfrequente componenten wordt uitgevoerd met behulp van de volgende kernels:

,

,

.

Roberts' cameraman. De Roberts-operator is een voorbeeld van een niet-lineair filter. Door elke pixel te transformeren met de Roberts cross-operator kan de afgeleide van de afbeelding worden weergegeven langs een diagonaal die niet nul is, en de combinatie van deze getransformeerde afbeeldingen kan ook worden gezien als een gradiënt van de bovenste twee pixels naar de onderste twee. De Roberts-operator wordt gebruikt voor de rekensnelheid, maar is inferieur aan alternatieven vanwege het aanzienlijke probleem van de gevoeligheid voor ruis. Het produceert fijnere lijnen dan andere methoden voor het benadrukken van randen.

Bij de verwerking zijn vier pixels betrokken, die zich als volgt bevinden (Fig. 1.6).

Rijst. 1.6. Pixels die betrokken zijn bij de verwerking door de Roberts-operator

Reactie van telefoniste Roberts:

De convolutiekernels zien er in dit geval als volgt uit:

,

.

De convolutie voor elke kernel wordt afzonderlijk berekend. Het antwoord van dit filter is de waarde

, (1.17)

Waar P En Q– reactie van kernen H 1 en H 2 .

Soms de hoeveelheid
.

Sobel-operator. De Sobel-operator wordt gebruikt in algoritmen voor randdetectie. Dit is een discrete differentiaaloperator die een geschatte waarde van de helderheidsgradiënt van een afbeelding berekent. Het resultaat van het toepassen van de Sobel-operator op elk punt in het beeld is de vector van de helderheidsgradiënt op dit punt of de norm ervan. De edge-verbeteringsmethode die de Sobel-operator gebruikt, houdt rekening met twee verschillende convolutiekernels:

Uit deze convoluties worden de grootte en richting van de randen berekend. De convolutie voor elke kernel wordt afzonderlijk berekend. Het antwoord van dit filter is de waarde

, (1.19)

Waar P En Q– reactie van kernen H 1 en H 2 .

Soms de hoeveelheid
.

Prewitts cameraman. De Prewitt-operator werkt op dezelfde manier als de Sobel-operator. De Prewitt-grensdetector is een geschikte methode voor het schatten van de grensgrootte en -oriëntatie. Terwijl de differentiële gradiëntdetector een tijdrovende berekening van oriëntatieschattingen vereist op basis van grootheden in de verticale en horizontale richting, geeft de Prewitt-randdetector de richting recht uit de kern aan met het maximale resultaat. De randverbeteringsmethode die de Prewitt-operator gebruikt, houdt rekening met twee verschillende convolutiekernels:

Het resultaat van de Prewitt-operator is

, (1.21)

Waar P En Q– reactie van kernen H 1 en H 2 .

Laplace-operator. De discrete Laplace-operator wordt vaak gebruikt bij beeldverwerking, zoals toepassingen voor randextractie of bewegingsschatting. De discrete Laplace-waarde wordt gedefinieerd als de som van de tweede afgeleiden en wordt berekend als de som van de verschillen in de buren van de centrale pixel. De Laplace-randverbeteringsmethode houdt rekening met een aantal verschillende convolutiekernels. Hier zijn er enkele:

Zoals u kunt zien, is de som van de matrixelementen nul, dus de filterrespons kan negatief zijn. In dit geval wordt de responswaarde modulo genomen. Als gevolg van de verwerking worden gebieden met een constante of lineair toenemende intensiteit zwart en worden gebieden met snel veranderende intensiteitswaarden helder gemarkeerd.

Hieronder staan ​​enkele ruimtelijke processen die niet onder de categorie convolutie vallen en die kunnen worden gebruikt om verschillende soorten ruis te elimineren.

Harmonisch gemiddelde filter. Harmonisch gemiddelde van de serie
berekend met de formule

. (1.23)

Tijdens het filterproces wordt de waarde van de huidige beeldpixel vervangen door
reeksen waarden voor negen pixels, inclusief de huidige en aangrenzende pixels.

Min– filteren. Tijdens het filterproces wordt de waarde van de huidige pixel vervangen door de minimumwaarde van aangrenzende pixels. Voor een kernel van dimensie 3 hebben we dus bijvoorbeeld:

Max– filteren. Tijdens het filterproces wordt de waarde van de huidige pixel vervangen door de maximale waarde van aangrenzende pixels (vergelijkbaar met het vorige filter).

Min- Max-filter. Tijdens het filterproces wordt de waarde van de huidige pixel in de afbeelding eerst vervangen door de minimumwaarde van aangrenzende pixels, en wanneer deze opnieuw wordt doorgegeven, door het maximum.

Mediaan filter. Gemiddelde filtering gebruikt de waarden van de elementen in het aangrenzende gebied om een ​​nieuwe waarde te bepalen. Het filter rangschikt de elementen van het aangrenzende gebied in gesorteerde volgorde en selecteert de gemiddelde waarde. Voor een kern met dimensie 3 zal de mediaanwaarde bijvoorbeeld de vijfde zijn:

Met behulp van ruimtelijke beeldverwerkingsmethoden kunt u een aantal interessante effecten bereiken. Laten we er een paar opsommen.

Embossing-effect. Met behulp van de convolutiebewerking kunt u een transformatie implementeren die het effect van reliëf op de afbeelding geeft.

(1.24)

Binaire "pseudo-halftoon" afbeelding. De originele afbeelding wordt verwerkt met behulp van een masker D2 of D4: als de pixelwaarde kleiner is dan de proportionele waarde van het overeenkomstige maskerelement, wordt deze op nul gezet, anders krijgt deze de waarde 255. Het masker wordt zonder overlapping op de afbeelding toegepast . Maskers D2 en D4:

,

.

Bij het gebruik van ruimtelijke processen kunnen de volgende vragen rijzen met betrekking tot de eigenaardigheden van pixelverwerking:

    Eliminatie van randeffecten;

    De responswaarde ligt buiten de limieten.

Voor de eerste vraag zijn de volgende oplossingen mogelijk:

    Sluit randpixels van een afbeelding uit van conversie

in dit geval zal het uitvoerbeeld kleiner zijn, of zullen de grenspixels bijvoorbeeld zwart worden geverfd;

    Neem de overeenkomstige pixel niet op in de optelling, waarbij het gewicht gelijkmatig wordt verdeeld over andere pixels in de buurt;

    Maak de originele afbeelding compleet (voltooi) door het vereiste aantal pixels langs de rand toe te voegen. Het aantal toe te voegen kolommen hangt meestal af van de grootte van de kernel. Er zijn hier twee opties:

    • Bepaal pixelwaarden buiten de beeldgrenzen met behulp van extrapolatie.

      Beschouw bijvoorbeeld de intensiteitswaarde nabij de grensconstante of beschouw de intensiteitsgradiënt nabij de grensconstante;

Definieer pixelwaarden buiten de beeldgrenzen met behulp van spiegelen.

    Om problemen op te lossen die verband houden met de waarde die de limieten overschrijdt, zijn de volgende acties mogelijk:

    Schaal de verkregen waarden voor positieve filterreacties;

Als de filterrespons negatief is, neem dan de absolute waarde (modulo) of verlaag deze tot nul.

    Ook in deze sectie is het de moeite waard om een ​​​​mogelijke "classificatie" van ruis in de afbeelding te geven:

    Zout- en peperruis - willekeurige witte en zwarte pixels;

    Impulsruis – willekeurige witte pixels;

Gaussiaanse ruis bestaat uit intensiteitsschommelingen die volgens een normale wet worden verdeeld.

Dit artikel gaat niet alleen over de meest voorkomende beeldverwerkingsfilters, maar beschrijft ook in duidelijke vorm de algoritmen voor hun werking. Het artikel is vooral bedoeld voor programmeurs die zich bezighouden met beeldverwerking.

Convolutiematrix

Er zijn veel filters die de convolutiematrix gebruiken; de belangrijkste zullen hieronder worden beschreven.
Een convolutiematrix is ​​een matrix van coëfficiënten die wordt “vermenigvuldigd” met de pixelwaarde van de afbeelding om het gewenste resultaat te produceren.

Hieronder vindt u de toepassing van de convolutiematrix:

div is de normalisatiecoëfficiënt zodat de gemiddelde intensiteit onveranderd blijft.

In het voorbeeld is de matrix 3x3, hoewel het formaat groter zou kunnen zijn.

Vervagingsfilter

Meestal wordt de matrix gevuld volgens de normale (Gaussiaanse wet). Hieronder ziet u een vervagingsmatrix van 5x5 gevuld met een Gaussiaanse verdeling.


De coëfficiënten zijn al genormaliseerd, dus de div voor deze matrix is ​​één.

De sterkte van de vervaging hangt af van de grootte van de matrix.


Het is de moeite waard om de randvoorwaarden te vermelden (dit probleem is relevant voor alle matrixfilters). De pixel linksboven heeft geen ‘buurman’ rechts ervan, daarom hebben we niets om de matrixcoëfficiënt mee te vermenigvuldigen.

Er zijn 2 oplossingen voor dit probleem:

1. Een filter alleen toepassen op het “venster” van de afbeelding, dat coördinaten heeft voor de linkerbovenhoek en voor de rechteronderhoek. kernelSize – matrixgrootte; breedte, hoogte – afbeeldingsgrootte.

Dit is niet de beste methode omdat het filter niet op de hele afbeelding wordt toegepast. De kwaliteit lijdt behoorlijk als de filtergrootte groot is.

2. De tweede methode vereist het creëren van een tussenbeeld. Het idee is om een ​​tijdelijke afbeelding te maken met afmetingen (breedte + 2 * kernelSize / 2, hoogte + 2 * kernelSize / 2). De invoerafbeelding wordt naar het midden van de afbeelding gekopieerd en de randen worden opgevuld met de buitenste pixels van de afbeelding. De vervaging wordt toegepast op de tussenliggende buffer en vervolgens wordt het resultaat daaruit geëxtraheerd.


Deze methode heeft geen tekortkomingen in kwaliteit, maar vereist onnodige berekeningen.

Het Gaussiaanse vervagingsfilter heeft een complexiteit van O(hi * wi * n *n), waarbij hi, wi de afbeeldingsafmetingen zijn, en n de grootte van de matrix (filterkernel). Dit algoritme kan worden geoptimaliseerd met een acceptabele kwaliteit.

De vierkante kern (matrix) kan worden vervangen door twee eendimensionale: horizontaal en verticaal. Voor kernelgrootte 5 zien ze er als volgt uit:

Het filter wordt in 2 passages toegepast: eerst horizontaal en vervolgens verticaal op het resultaat (of omgekeerd).

De complexiteit van dit algoritme is O(hi * wi * n) + O(hi * wi * n) = 2 * O(hi * wi * n), wat voor een kernelgrootte groter dan twee sneller is dan het traditionele kwadraat matrixmethode.

Scherptefilter

Gebruik de volgende matrix om de duidelijkheid te verbeteren:

Deze matrix vergroot het verschil in waarden aan de grenzen. Div voor deze matrix is ​​1.


GIMP heeft een Convolution Matrix-filter waarmee u eenvoudig de matrixtransformatie kunt vinden die u nodig heeft.

Meer gedetailleerde informatie over filters op basis van de convolutiematrix vindt u in het artikel “Grafische filters op basis van de convolutiematrix”.

Mediaan filter

Het mediaanfilter wordt doorgaans gebruikt om ruis te verminderen of een afbeelding "gladder te maken".

Het filter werkt met matrices van verschillende groottes, maar in tegenstelling tot de convolutiematrix heeft de grootte van de matrix alleen invloed op het aantal beschouwde pixels.

Het mediaanfilteralgoritme is als volgt:

Voor de huidige pixel worden de pixels die in de matrix "vallen" gesorteerd en wordt de gemiddelde waarde uit de gesorteerde array geselecteerd. Deze waarde is de uitvoer voor de huidige pixel.

Hieronder ziet u het werk van het mediaanfilter voor een kernelgrootte van drie.


De groei- en erosiefilters dienen om respectievelijk morfologische uitzetting of inkrimping te verkrijgen. Simpel gezegd betekent dit voor afbeeldingen het selecteren van de pixel met de maximale of minimale intensiteit uit de buurt.


Als gevolg van accretie worden heldere objecten groter, en erosie zorgt ervoor dat donkere objecten groter worden.

Het filter maakt gebruik van een invoerafbeelding en een binaire matrix. De binaire matrix bepaalt de vorm van de buurt. Typisch is de wijk cirkelvormig.

Het opbouwfilter kan worden gebruikt om highlights en heldere reflecties te versterken.

Conclusie

Het artikel beschreef enkele van de beeldverwerkingsfilters, beschreef hun algoritmen en applicatiefuncties.