De resolutie wijzigen door het beeld te interpoleren. Interpolatie nodig? Voorbeeld van beeldrotatie

Vergelijking van RAISR met andere geavanceerde beeldverbeteringstechnieken. Voor meer voorbeelden, zie de begeleidende materialen bij het wetenschappelijke artikel.

Het opschalen van afbeeldingen, dat wil zeggen het creëren van een foto met een hoge resolutie van één enkele foto met een lage resolutie, is een zeer goed bestudeerde techniek. wetenschappelijk probleem. Het is belangrijk voor veel toepassingen: het inzoomen op foto's en tekst, het projecteren van video groot scherm enz. Zelfs in films slagen rechercheurs er soms in om het kenteken van een auto in het frame van een bewakingscamera te zien, waardoor de foto tot het uiterste wordt 'ingezoomd'. En niet alleen het autonummer. Alles wordt hier beperkt door de verbeeldingskracht en het geweten van de regisseur en scenarioschrijver. Ze kunnen nog dichter op de foto inzoomen en de weerspiegeling van de overtreder zien in de achteruitkijkspiegel of zelfs in de gepolijste metalen kop van de bout waarmee de kentekenplaat vastzit. Het publiek vindt dit leuk.

In de praktijk de mogelijkheden soortgelijke programma's veel bescheidener. Op 29 oktober 2016 werd bijvoorbeeld het Neural Enhance-programma op GitHub geplaatst, dat de resolutie van foto's verhoogt met behulp van een neuraal netwerk. Het programma kwam onmiddellijk in de lijst met de populairste repository's van de week.


Een voorbeeld van Neural Enhance in actie


Een ander voorbeeld van het Neural Enhance-programma, dat werd gepubliceerd in vrije toegang op GitHub

Medewerkers van Google Research werken ook in deze richting - op de officiële blog van het bedrijf spraken ze gisteren over een methode om de resolutie te verhogen, die ze RAISR (Rapid and Accurate Image Super-Resolution) noemden.

Historisch gezien heeft beeldinterpolatie gebruik gemaakt van eenvoudige interpolators die tussenwaarden voor nieuwe pixels vinden op basis van een bekende reeks pixelwaarden in de originele afbeelding. Daar werden ze gebruikt verschillende methoden om gemiddelden te berekenen: interpolatie van de dichtstbijzijnde buur, bilineaire interpolatie, kubieke methode, bicubische methode, enz. Het is allemaal vrij eenvoudig wiskundige formules. Ze werden veel gebruikt in verschillende toepassingen vanwege zijn eenvoud en pretentieloosheid. Ze passen zich helemaal niet aan de inhoud van het beeld aan, wat vaak leidt tot het verschijnen van onaangename artefacten - te wazige fragmenten, karakteristieke aliasing-vervormingen.

De afgelopen decennia zijn er veel geavanceerdere interpolatieprogramma's en -methoden ontwikkeld die expliciet rekening houden met de kenmerken van het bronbeeld. Ze kunnen fragmenten van het originele beeld gebruiken en schalen, schaarsheid opvullen en Gaussiaanse mengsels toepassen. Nieuwe methoden hebben het mogelijk gemaakt om de kwaliteit van de interpolatie (digitale restauratie van originelen) aanzienlijk te verbeteren door de complexiteit van de berekeningen te vergroten.

Google-medewerkers gebruikten een methode machinaal leren op externe monsters. Deze methode heeft grote populariteit verworven in afgelopen jaren en wordt beschreven in veel wetenschappelijke artikelen. Het basisprincipe is om de inhoud van een afbeelding te ‘voorspellen’ hoge resolutie volgens de verkleinde kopie. Voor een dergelijke training wordt gebruik gemaakt van de standaard modelgebaseerde leermethode.

Tijdens de RAISR-training werd gebruik gemaakt van een database van gelijktijdig gegenereerde beeldparen in hoge en lage kwaliteit. Voor standaard 2x interpolatie werden paren kleine beeldfragmenten gebruikt, dat wil zeggen fragmenten van 3x3 en 6x6 pixels. Het RAISR-trainings- en bedieningsalgoritme wordt weergegeven in het diagram.

In de volgende afbeelding ziet u de vier globale filters die tijdens de trainingsfase waren toegestaan. Dienovereenkomstig leerde het programma ze het meest effectief te gebruiken, afhankelijk van de inhoud van dit specifieke fragment van meerdere pixels.

Elk filtertype werkt op een ander pixeltype: P1 tot P4, in overeenstemming met de pixeltypen die worden gebruikt door het bilineaire interpolatiealgoritme.

In sommige opzichten is de RAISR-methode voor machinaal leren vergelijkbaar met het trainen van neurale netwerken. Maar in feite is het een aanpassing van verschillende standaardinterpolatiefilters voor elk afzonderlijk klein fragment van het originele beeld. Dat wil zeggen, het is dezelfde oude "lineaire interpolatie", maar dan als op steroïden - zonder de inherente artefacten en met aanpassing aan de inhoud van het beeld.

Uit vergelijkend onderzoek is gebleken dat een dergelijk algoritme in veel gevallen zelfs beter werkt dan moderne methoden geavanceerde interpolatie op basis van neurale netwerken (SRCNN in illustraties).

Bovendien is deze op hashing gebaseerde methode veel minder hulpbronnenintensief en in de praktijk acceptabeler dan het trainen en gebruiken van een neuraal netwerk. Het prestatieverschil is zo groot (10-100 keer) dat dit programma zelfs op gewone mobiele apparaten veilig kan worden uitgevoerd, en dat het in realtime zal werken. Niets houdt u tegen om dit filter in te voeren moderne toepassingen beeldinterpolatie op smartphones, waaronder de Android-camera-app, die interpolatie uitvoert tijdens digitaal zoomen. Het is heel goed mogelijk dat Google dit als eerste gaat doen. Door ten minste, is dit een voorbeeld van het meest wijdverbreide gebruik van interpolatie op miljoenen apparaten.


Links: origineel in lage resolutie. Gecentreerd: het resultaat van een standaard bicubische interpolator. Rechts: RAISR-uitvoer

Foto's zullen onmiddellijk verbeteren voor alle Android-gebruikers.

Een ander interessant en belangrijk voordeel van RAISR is trouwens dat dit programma tijdens het trainingsproces kan worden getraind om karakteristieke compressieartefacten, inclusief JPEG, te elimineren. Op bijvoorbeeld mobiel apparaat foto's kunnen in gecomprimeerde vorm met artefacten worden opgeslagen en zonder artefacten op het scherm worden weergegeven. Of het algoritme kan worden toegepast op Google Photo Hosting om automatisch gebruikersfoto's te verbeteren, waardoor JPEG-artefacten worden geëlimineerd die bijna overal aanwezig zijn.


Links: origineel met lage resolutie en typische JPEG-aliasingartefacten. Rechts ziet u de uitgifte van RAISR

Google Research-medewerkers zullen binnenkort worden gepubliceerd in het tijdschrift IEEE Transactions on Computational Imaging. (Opmerking: hoofdauteur wetenschappelijk werk was tijdens de voorbereiding van het artikel stagiair bij Google Research, maar werkt nu bij het Israëlische technologieonderzoeksinstituut Technion).

Om de grootte van een afbeelding te vergroten of verkleinen, gebruikt Photoshop de interpolatiemethode. Wanneer u bijvoorbeeld een afbeelding vergroot, creëert Photoshop extra pixels op basis van de waarden van aangrenzende pixels. Grofweg gezegd: als de ene pixel zwart is en de andere wit, berekent Photoshop het gemiddelde en maakt een nieuwe pixel grijs. Sommige soorten interpolatie zijn snel en van slechte kwaliteit, andere zijn complexer, maar leveren goede resultaten op.

Laten we eerst naar het hoofdmenu gaan Afbeelding - Afbeeldingsgrootte of Alt+Ctrl+I.

Als u op de pijl naast de parameter klikt Afbeelding opnieuw samplen, dan verschijnen er verschillende interpolatieopties in het pop-upvenster:

  • Automatisch. Photoshop-applicatie selecteert een herbemonsteringsmethode op basis van het documenttype en het opschalen of verkleinen.
  • Details behouden (vergroting). Wanneer deze methode is geselecteerd, wordt de schuifregelaar Ruisonderdrukking beschikbaar om ruis weg te werken wanneer de afbeelding wordt geschaald.
  • Details behouden 2.0. Dit algoritme geeft een zeer interessant resultaat van beeldvergroting. Natuurlijk worden de details niet gedetailleerder, maar wat er wel is, neemt aanzienlijk toe zonder aan duidelijkheid in te boeten.
  • . Goede methode voor beeldvergroting op basis van bicubische interpolatie, speciaal ontworpen voor vloeiendere resultaten.
  • Bicubisch scherper (reductie). Een goede methode voor het verkleinen van de afbeeldingsgrootte op basis van bicubische interpolatie met verhoogde scherpte. Met deze methode kunt u de details van de opnieuw bemonsterde afbeelding behouden. Als Bicubische Down-interpolatie sommige delen van het beeld te scherp maakt, probeer dan Bicubische interpolatie.
  • Bicubisch (vloeiende hellingen). Een langzamere maar nauwkeurigere methode gebaseerd op het analyseren van de kleurwaarden van omringende pixels. Door complexere berekeningen te gebruiken, produceert bicubische interpolatie vloeiendere kleurovergangen dan interpolatie van aangrenzende pixels of bi-pixels. lineaire interpolatie.
  • Dichtstbijzijnde buur (harde randen). Een snelle maar minder nauwkeurige methode die de pixels van een afbeelding volgt. Deze methode behoudt scherpe randen en produceert een kleinere bestandsgrootte in illustraties met niet-afgevlakte randen. Deze methode kan echter gekartelde randen creëren die zichtbaar worden wanneer u de afbeelding vervormt of schaalt, of wanneer u veel selectiebewerkingen uitvoert.
  • Bilineair. Deze methode voegt nieuwe pixels toe door de gemiddelde kleurwaarde van omringende pixels te berekenen. Het levert resultaten van gemiddelde kwaliteit op.

Gebruiksvoorbeeld Bicubisch Soepeler (vergroting):

Er is een foto aanwezig, afmetingen 600 x 450 pixels, resolutie 72 dpi

We moeten het verhogen. Opent een venster Afbeeldingsgrootte en kies Bicubisch Soepeler (vergroting), meeteenheden zijn percentages.

De documentafmetingen worden onmiddellijk ingesteld op 100%. Vervolgens zullen we de afbeelding geleidelijk vergroten. Wijzig de waarde van 100% in 110%. Wanneer u de breedte wijzigt, past de hoogte zich automatisch aan.

Nu zijn de afmetingen al 660 x 495 pixels. Door deze stappen te herhalen kun je goede resultaten behalen. Natuurlijk zal het voor ons behoorlijk moeilijk zijn om de ideale helderheid te bereiken, aangezien de foto klein was en een lage resolutie had. Maar kijk eens naar de veranderingen die hebben plaatsgevonden in de pixels.

Hoe groot kunnen we foto's maken met interpolatie? Het hangt allemaal af van de kwaliteit van de foto, hoe deze is gemaakt en met welk doel u deze vergroot. Het beste antwoord: neem het en controleer het zelf.

Tot ziens in de volgende les!

De functie voor het wijzigen van de afbeeldingsgrootte van Emgu (een .net-wrapper voor OpenCV) kan een van de vier interpolatiemethoden gebruiken:

  • CV_INTER_NN (standaard)
  • CV_INTER_LINEAR
  • CV_INTER_CUBIC
  • CV_INTER_AREA

Ik heb een globaal begrip van lineaire interpolatie, maar kan alleen maar raden wat een kubus of gebied is. Ik vermoed dat NN staat voor naaste buur, maar ik kan het mis hebben.

De reden dat ik het formaat van de afbeelding wijzig is om het aantal pixels te verkleinen (ze zullen zich op een gegeven moment herhalen) terwijl ze toch representatief blijven. Ik vermeld dit omdat het mij lijkt dat interpolatie van cruciaal belang is voor dit doel juiste soort moet heel belangrijk zijn.

Mijn vraag is: wat zijn de voor- en nadelen van elke interpolatiemethode? Hoe verschillen ze en welke moet ik gebruiken?

4 antwoorden

De dichtstbijzijnde buur zal zo snel mogelijk zijn, maar u verliest aanzienlijke informatie bij het wijzigen van het formaat.

Lineaire interpolatie is minder snel, maar resulteert niet in enig verlies van informatie, tenzij u de afbeelding verkleint (wat u ook doet).

Kubieke interpolatie (waarschijnlijk eigenlijk "Bicubisch") gebruikt een van de vele mogelijke formules die meerdere aangrenzende pixels bevatten. Dit is veel beter voor het verkleinen van afbeeldingen, maar je bent nog steeds beperkt in hoeveel je kunt verkleinen zonder informatie te verliezen. Afhankelijk van het algoritme kunt u uw afbeeldingen met 50% of 75% verkleinen. Het belangrijkste aan deze aanpak is dat deze veel langzamer is.

Ik weet niet zeker wat "gebied" is - het zou eigenlijk "Bicubisch" kunnen zijn. Naar alle waarschijnlijkheid zal deze parameter geven beste resultaat(in termen van informatieverlies/uiterlijk), maar gaat ten koste van de langste verwerkingstijd.

De interpolatiemethode die u gebruikt, hangt af van wat u probeert te bereiken:

CV_INTER_LINEAR of CV_INTER_CUBIC past een laagdoorlaatfilter (medium) toe om een ​​afweging te maken tussen visuele kwaliteit en randverwijdering (laagdoorlaatfilters hebben de neiging randen te verwijderen om beeldaliasing te verminderen). Tussen deze twee zou ik je aanbevelen CV_INTER_CUBIC.

Methode CV_INTER_NN is eigenlijk de dichtstbijzijnde buur, het is de meest basismethode en je krijgt scherpere randen (er wordt geen laagdoorlaatfilter toegepast). Deze methode lijkt echter eenvoudigweg op het "schalen" van de afbeelding, zonder visuele verbetering.

Algoritmen: (beschrijvingen uit OpenCV-documentatie)

  • INTER_NEAREST - interpolatie van de dichtstbijzijnde buur
  • INTER_LINEAR - bilineaire interpolatie (standaard)
  • INTER_AREA - opnieuw bemonsteren met behulp van de pixelgebiedverhouding. Dit kan de voorkeursmethode zijn voor het decimeren van afbeeldingen, omdat het moiré-vrije resultaten oplevert. Maar wanneer de afbeelding wordt geschaald, is deze vergelijkbaar met de INTER_NEAREST-methode.
  • INTER_CUBIC - bicubische interpolatie over een omgeving van 4x4 pixels.
  • INTER_LANCZOS4 - Lanczos-interpolatie in de buurt van 8x8 pixels

Als je de snelheid wilt verhogen, gebruik dan de Nearest Neighbour-methode.

Weergave-eigenschappen instellen

In de applicatie Afbeelding verwerken Toolbox is het mogelijk om instellingen te configureren die bepaalde eigenschappen van de imshow- en imtool-beeldweergavefuncties besturen. Als u bijvoorbeeld toepassingsinstellingen gebruikt, kunt u de vergrotingsfactor opgeven die wordt toegepast bij het weergeven van afbeeldingen met behulp van de functies imtool en imshow.

Binnenin deze kwestie overwegen

  • Lijst met instellingen die door de applicatie worden ondersteund.
  • Beschrijft het proces voor het verkrijgen van de huidige instellingen met behulp van de iptgetpref-functie.
  • Beschrijft het proces van het instellen van de huidige instellingen met behulp van de iptsetpref-functie.

Applicatie instellingen

De Image Processing Toolbox ondersteunt verschillende instellingen die van invloed zijn op de manier waarop afbeeldingen worden weergegeven met behulp van de functies imshow en imtool. De tabel toont een lijst met instellingen en hun instellingen korte beschrijving. Om meer te krijgen gedetailleerde informatie Zie de beschrijving van de iptsetpref-functie voor applicatie-instellingen en hun waarden.

Applicatie instellingen Beschrijving
ImshowBorder Deze parameter kan twee waarden aannemen: "los" en "vast". Als de parameter ImshowBorder is ingesteld op "lose", wordt de afbeelding weergegeven door de imshow-functie, ingesprongen vanaf de rand van het figuurvenster. Hierdoor blijft er ruimte in het venster over voor extra opschriften. Standaard gebruikt. Als de parameter ImshowBorder is ingesteld op "tight", wordt de afbeelding weergegeven door de functie imshow, zodat deze het hele figuurvenster beslaat.
ImshowAxesVisible Deze parameter kan twee waarden aannemen: "aan" en "uit". Als de parameter ImshowAxesVisible de waarde "on" aanneemt, worden bij het weergeven van een afbeelding met de functie imshow de coördinaatassen bovendien weergegeven in het figuurvenster. Als de parameter ImshowAxesVisible de waarde "off" aanneemt, worden de coördinaatassen niet weergegeven. De parameterwaarde "uit" is standaard ingesteld.
ImshowInitialMagnification Regelt de vergrotingsfactor die door de imshow-functie wordt gebruikt bij het weergeven van een afbeelding.
ImtoolInitiëlevergroting Regelt de vergrotingsfactor in de toepassing Afbeeldingshulpmiddel, dat wordt gebruikt om afbeeldingen te schalen.

Waarden voor applicatie-instellingen ophalen

De iptgetpref-functie wordt gebruikt om de huidige waarden te bepalen. Laten we eens kijken naar een voorbeeld van het gebruik van de functie iptgetpref om de waarde van de eigenschap imtoolInitialMagnification te bepalen.

Iptgetpref("ImtoolInitialMagnification") ans = 100

Zie de beschrijving van de iptgetpref-functie voor meer gedetailleerde informatie.

Waarden van applicatie-eigenschappen instellen

De functie iptsetpref wordt gebruikt om de waarden van toepassingseigenschappen in te stellen. Laten we eens kijken naar een voorbeeld van het gebruik van de functie iptsetpref om weergave-eigenschappen in te stellen die ervoor zorgen dat de functie imshow het weergavevenster aanpast aan de hand van de grootte van de weergegeven afbeelding en de waarde van de eigenschap "ImshowBorder".

Iptsetpref("ImshowBorder", "strak");

Zie de beschrijving van de iptsetpref-functie voor meer gedetailleerde informatie.

Ruimtelijke transformaties

Laten we eens kijken naar de belangrijkste functies van ruimtelijke transformaties die zijn geïmplementeerd in de Image Processing Toolbox-toepassing.

Terminologie Beschrijving van de basistermen die worden gebruikt bij beeldverwerking
Interpolatie Ruimtelijke (of temporele) voorspelling van onbekende pixelwaarden tussen echte pixelwaarden.
Het formaat van een afbeelding wijzigen met de functie imresize.
Afbeeldingen roteren Gebruik de imrotatiefunctie om afbeeldingen te roteren.
Een afbeelding uitsnijden Gebruik de functie voor bijsnijden om een ​​rechthoekig gedeelte van een afbeelding bij te snijden.
Beschrijving van de belangrijkste eigenschappen van ruimtelijke transformaties in de applicatie.

Interpolatie

Zoals hierboven opgemerkt, is interpolatie een ruimtelijke (of temporele) voorspelling van de waarden van onbekende pixelwaarden tussen de werkelijke pixelwaarden. Een van de interpolatiemethoden wordt bijvoorbeeld gebruikt om het formaat van afbeeldingen te wijzigen. Tweedimensionale interpolatiemethoden worden ook gebruikt bij het roteren van afbeeldingen (imroteren-functie) en bij het analyseren van afbeeldingen met behulp van de improfile-functie.

Interpolatiemethoden

De Image Processing Toolbox-toepassing gebruikt drie ingebouwde interpolatie-algoritmen:

  • Dichtstbijzijnde interpolatie - gebruikt de waarde van de dichtstbijzijnde pixel.
  • Bilineaire interpolatie - er wordt gebruik gemaakt van interpolatie langs een bilineair oppervlak.
  • Bicubische interpolatie - er wordt gebruik gemaakt van interpolatie op een bicubisch oppervlak.

Afbeeldingstypen

In functies die interpolatie gebruiken, wordt de naam van de interpolatiemethode opgegeven als argument. Voor de meeste functies is dit interpolatie met behulp van de waarden van nabijgelegen pixels. Deze methode geeft aanvaardbare resultaten voor alle soorten afbeeldingen en is dat ook de enige methode, dat wordt gebruikt voor indexafbeeldingen. Voor luminantie- en RGB-afbeeldingen is het beter om bilineaire of bicubische interpolatie te gebruiken, omdat deze methoden in de meeste gevallen betere resultaten opleveren dan het gebruik van interpolatie op basis van de waarde van de dichtstbijzijnde pixels.

Bij RGB-beelden wordt de interpolatie afzonderlijk uitgevoerd voor de rode, groene en blauwe componenten. In principe is dit niet helemaal correct, omdat het leidt tot een schending van de kleurbalans.

Voor binaire afbeeldingen heeft interpolatie effect als het bewust wordt gedaan. Bij gebruik van bilineaire of bicubische interpolatie zullen de berekende pixelwaarden in de resulterende afbeelding niet altijd 0 of 1 zijn. Het verwerkingsresultaat is ook afhankelijk van het formaat van de bronafbeelding:

  • Als de bronafbeeldingsgegevens een dubbel formaat hebben, zal de resulterende afbeelding in grijstinten zijn en in dubbel formaat worden weergegeven. Het resulterende beeld zal dus niet binair zijn omdat het waarden tussen 0 en 1 bevat.
  • Als de bronafbeelding de indeling uint8 heeft, is de resulterende afbeelding binair en weergegeven in de indeling uint8. De interpolerende pixelwaarden worden afgerond op 0 en 1, en de resulterende afbeelding heeft de indeling uint8.

Wanneer interpolatie wordt gebruikt met de waarden van de dichtstbijzijnde pixels, zal het resultaat altijd binair zijn, aangezien de waarden van de geïnterpoleerde pixels uit de originele afbeelding worden gehaald.

Het formaat van een afbeelding wijzigen

De imresize-functie wordt gebruikt om het formaat van een afbeelding te wijzigen. Wanneer u de functie imresize gebruikt, moet u dat doen

  • Beschrijf de maat resulterend beeld.
  • Beschrijf de gekozen interpolatiemethode.
  • Beschrijf een beeldvoorbereidingsfilter.

Wanneer u de functie imresize gebruikt, kan de grootte van de resulterende afbeelding op twee manieren worden opgegeven:

  • via de beschrijving van de vergrotingsfactor.
  • via een beschrijving van de afmetingen van de resulterende afbeelding.

Gebruik van de vergrotingsfactor

Om een ​​afbeelding te vergroten, moet de vergrotingsfactor groter zijn dan 1. Om de afbeelding te verkleinen, moet de vergrotingsfactor tussen 0 en 1 liggen. Met de onderstaande opdracht wordt afbeelding I bijvoorbeeld 1,25 keer vergroot.

ik = imread("circuit.tif"); J = imresize(I,1,25); imshow(I) figuur, imshow(J)

Beschrijving van de grootte van de resulterende afbeelding

Het is mogelijk om de grootte van de resulterende afbeelding te beschrijven als een vector die twee getallen bevat: het aantal rijen en kolommen van de resulterende afbeelding. Laten we eens kijken naar een voorbeeld van het maken van een resulterende afbeelding Y met 100 rijen en 150 kolommen.

Y = formaat wijzigen(X,)

Opmerking. Als bij het beschrijven van de afmetingen van de resulterende afbeelding de aspectverhoudingen van de originele afbeelding niet behouden blijven, zal de resulterende afbeelding vervormd zijn.

Beschrijving van de interpolatiemethode

Standaard gebruikt de imresize-functie een interpolatiemethode op basis van de waarden van nabijgelegen pixels om de resulterende afbeelding te genereren. U kunt echter ook een andere interpolatiemethode opgeven. De tabel toont een lijst met opties die interpolatiemethoden specificeren in de functie imresize.

Laten we eens kijken naar een voorbeeld waarbij de functie imresize bilineaire interpolatie gebruikt.

Y = imresize(X,"bilineair")

Beeldvoorbereidingsfilters gebruiken

Als u het beeldformaat wijzigt, kunnen er artefacten in het beeld verschijnen, wat de kwaliteit beïnvloedt.

Wanneer afbeeldingen worden verkleind met behulp van bilineaire of bicubische interpolatie, gebruikt de functie voor het verkleinen van de grootte daarom automatisch een laagdoorlaatfilter om artefacten in het resulterende beeld te verminderen.

De functie imresize past mogelijk geen laagdoorlaatfilter toe als interpolatie wordt gebruikt. aangrenzende elementen. Naburige interpolatie wordt voornamelijk gebruikt voor indexafbeeldingen, en laagdoorlaatfiltering wordt niet gebruikt voor indexafbeeldingen.

U kunt ook uw eigen filter maken voor laagdoorlaatfiltering. Zie de beschrijving van de imresize-functie voor meer details.

Afbeeldingen roteren

De imrotate-functie wordt gebruikt om afbeeldingen te roteren. Wanneer u de imrotate-functie gebruikt, moet u twee hoofdargumenten opgeven:

  1. de afbeelding die moet worden geroteerd;
  2. rotatiehoek.

De rotatiehoek kan in graden worden beschreven. Als u een positieve waarde opgeeft, roteert de imrotatiefunctie de afbeelding tegen de klok in. Als u een negatieve waarde opgeeft, roteert de imrotatiefunctie de afbeelding met de klok mee. Beschouw een voorbeeld van het roteren van afbeelding I 35 graden tegen de klok in.

J = imroteren(I,35);

Als optionele argumenten in de functie imrotate kunt u ook beschrijven

  1. interpolatiemethode;
  2. grootte van de resulterende afbeelding.

Beschrijving van de interpolatiemethode

Standaard gebruikt de imrotate-functie buurinterpolatie om de pixelwaarden van de resulterende afbeelding te bepalen. De gebruiker kan ook een andere interpolatiemethode gebruiken. De tabel bevat een lijst met ondersteunde interpolatiemethoden.

Laten we eens kijken naar een voorbeeld van het 35° tegen de klok in draaien van een afbeelding met behulp van bilineaire interpolatie.

ik = imread("circuit.tif"); J = imroteren(I,35,"bilineair"); imshow(I) figuur, imshow(J)

Beschrijving van de grootte van de resulterende afbeelding

Standaard creëert de imrotate-functie een resultaat dat groter is, zodat het in de originele afbeelding past, die onder de opgegeven hoek is geplaatst. Pixels die zich buiten de afbeelding bevinden, worden op 0 gezet en vormen de achtergrond van de resulterende afbeelding. Als u de optie "bijsnijden" opgeeft als argument in de imrotate-functie, wordt de resulterende afbeelding bijgesneden tot de grootte van de originele afbeelding. Zie de beschrijving van de imrotate-functie voor meer details.

Afbeeldingen uitknippen

De imcrop-functie wordt gebruikt om een ​​rechthoekig deel van een afbeelding te selecteren. Wanneer u de imcrop-functie gebruikt, moet u twee hoofdargumenten opgeven:

  1. Originele afbeelding;
  2. coördinaten van de rechthoek die het snijgebied bepaalt.

Er is ook een andere manier om de imcrop-functie te gebruiken. Het ligt in het feit dat het niet altijd nodig is om de rechthoek te specificeren die uit de afbeelding wordt gesneden. Deze rechthoek kan interactief worden gedefinieerd. In dit geval verandert de cursor van uiterlijk en heeft deze de vorm van een kruis. Door op de linkermuisknop te drukken, wordt de selectie van een hoek van de rechthoek aangegeven, en de locatie van de cursor op het moment dat de muisknop wordt losgelaten, geeft de selectie van een andere hoek aan. Op deze manier wordt er een rechthoek bovenop de afbeelding geplaatst, die het deel van de afbeelding definieert dat wordt uitgesneden.

Imshow circuit.tif I = imcrop; imshow(I);

Het uitvoeren van fundamentele ruimtelijke transformaties

De imtransform-functie wordt gebruikt om eenvoudige tweedimensionale ruimtelijke transformaties uit te voeren.

Wanneer u de functie imtransform gebruikt, moet u twee hoofdargumenten opgeven:

  • Originele afbeelding;
  • een ruimtelijke transformatiestructuur (TFORM) die het type transformaties definieert dat nodig is.

Beschrijving van het transformatietype

Bij het beschrijven van het type transformaties moet u de TFORM-structuur gebruiken. Er zijn twee manieren om TFORM te gebruiken:

  • de maketform-functie gebruiken;
  • met behulp van de cp2tform-functie.

Maketform gebruiken

Wanneer u de functie maketform gebruikt, moet u het gewenste type transformatie beschrijven. De tabel bevat een lijst met transformatietypen in alfabetische volgorde, die wordt ondersteund door de maketform-functie.

Conversietype Beschrijving
"affiene" Transformaties die verschuiving, roteren, schalen en andere soortgelijke functies voor beeldtransformatie omvatten. In dit geval blijven rechte lijnen recht, parallelle lijnen blijven evenwijdig en een rechthoek kan in een parallellogram veranderen.
"doos" Een speciaal geval van affiene transformaties, waarbij elke dimensie onafhankelijk wordt geschaald.
"composiet" De structuur van twee of meer transformaties.
"aangepast" Een transformatie die door de gebruiker wordt gedefinieerd en wordt aangeroepen met behulp van de functie imtransform.
"projectief" Bij dit type transformatie blijven rechte lijnen recht en komen parallelle lijnen op één punt samen. Dit punt kan zich zowel binnen als buiten de afbeelding bevinden.

Met behulp van cp2tform

Wanneer u de functie cp2tform gebruikt, wordt er een TFORM gemaakt wanneer transformaties zoals gegevensaanpassing moeten worden uitgevoerd, zoals polynoomtransformaties.

Opmerking. Bij gebruik van de imtransform-functie voert de TFORM-structuur tweedimensionale ruimtelijke transformaties uit. Als een afbeelding meer dan twee dimensies bevat, zoals een RGB-afbeelding, worden 2D-transformaties automatisch toegepast op alle 2D-componenten. De tformarray-functie wordt gebruikt om n-dimensionale transformaties te definiëren.

Conversies uitvoeren

Nadat u het type transformaties in de TFORM-structuur hebt gedefinieerd, kunt u deze uitvoeren door de functie imtransform aan te roepen.

Laten we eens kijken naar een voorbeeld van het gebruik van de imtransform-functie om projectieve transformaties uit te voeren op een afbeelding van een schaakbord.

I = schaakbord(20,1,1); figuur; imshow(I) T = maketform("projectief",,... ); R = makerresampler("kubisch", "circulair"); K = imtransform(I,T,R,"Grootte",,"XYSaal",1); figuur, imshow(K)

Verschillende opties in de imtransform-functie besturen verschillende aspecten van de transformatie. Zoals bijvoorbeeld blijkt uit de vorige transformatie, individuele installaties moet het aantal en de plaatsing van kopieën van de originele afbeelding op de resulterende afbeelding controleren. De grootte van de resulterende afbeelding wordt ook bepaald. De Image Processing Toolbox-applicatie heeft heel wat voorbeelden waarbij gebruik wordt gemaakt van de imtransform-functie en andere vergelijkbare functies, die optreden Verschillende types ruimtelijke transformaties.

Lineaire filtratie en filterontwerp

De toepassing Image Processing Toolbox bevat een aantal functies die tweedimensionale lineaire filtering van afbeeldingsgegevens ontwerpen en implementeren. Beschouw deze vragen in deze volgorde:

Laten we nog een aantal termen bekijken die ook in de toekomst zullen worden gebruikt bij het overwegen van het materiaal.

Termijn Beschrijving
Convolutie Een bewerking op een lokale omgeving waarbij elke resulterende pixel een gewogen som is van de originele pixels. Het gewicht wordt bepaald door de convolutiekernel. Met behulp van de convolutiebewerking kunt u beeldverwerkingsmethoden implementeren, zoals het verzachten, verscherpen en verbeteren van de grenzen van afbeeldingsobjecten.
convolutie kern De gewichtsmatrix die wordt gebruikt bij het uitvoeren van de convolutie.
Correlatie Een bewerking op een lokale omgeving, waarbij elke resulterende pixel een gewogen som is van de pixels in de lokale omgeving. De gewichten worden bepaald door de correlatiekernel. Het concept van correlatie is zeer nauw verwant aan het concept van convolutie.
correlatie kern Om de correlatiefunctie te implementeren, wordt een gewichtsfunctie gebruikt. Correlatiekernels kunnen worden verkregen met behulp van de filterontwerpfunctie in de Image Processing Toolbox. De correlatiekernels zijn een convolutiekernel die 180 graden wordt gedraaid.
FIR-filter (Finite Impulse Response-filter, FIR-filter) De applicatie beschikt over een aantal functies voor het berekenen van de coëfficiënten van een digitaal FIR-filter, met name met behulp van de Remez-methode. De eigenaardigheid van hun gebruik is dat de brongegevens worden gespecificeerd in de vorm van de gewenste frequentierespons van willekeurige complexiteit.
frequentierespons ( frequentierespons of frequentierespons) Een wiskundige functie die kan worden gebruikt om de prestaties van een filter bij verschillende frequenties te evalueren.
buurtwerking (werking met behulp van de waarden van aangrenzende elementen) Een bewerking waarbij de waarde van elke pixel wordt berekend op basis van de waarden van omliggende pixels. Convolutie, morfologische verwerkingsmethoden en gemiddelde filtering zijn voorbeelden van bewerkingen waarbij aangrenzende pixels worden gebruikt.
venstermethode ( lokale methoden verwerken) Verwerkingsmethoden die rekening houden lokale kenmerken Afbeeldingen.

Lineaire filtering

Filtratie is een technologie voor het wijzigen of verbeteren van een afbeelding. Dat is er bijvoorbeeld een groot aantal van filters om bepaalde kenmerken van de afbeelding te verbeteren of te verwijderen. We kunnen praten over het benadrukken van grenzen, het markeren van gebieden op basis van bepaalde kenmerken (bijvoorbeeld kleur), enz.

Zoals eerder opgemerkt zijn er een aantal methoden waarbij de pixelwaarden van het verwerkte beeld worden berekend op basis van de waarden van omringende pixels. Het verschil tussen deze methoden is de manier waarop er rekening wordt gehouden met de waarden van aangrenzende pixels. Merk op dat we op basis van de waarden van aangrenzende pixels kunnen praten over de kenmerken van de lokale omgeving van de afbeelding.

Lineair filteren is een vorm van verwerking waarbij de pixelwaarden van het verwerkte beeld worden gevormd als resultaat van lineaire bewerkingen op de pixelwaarden van de omgeving van het originele beeld.

Omdat dit type filtering vrij vaak wordt gebruikt bij beeldverwerking, zullen we enkele kwesties van lineair filteren gedetailleerder bekijken, in het bijzonder

  • Filteren met behulp van convolutie en correlatie.
  • Voer filtering uit met behulp van de imfilterfunctie, enz.

Convolutie

Lineaire beeldfiltering kan worden geïmplementeerd met behulp van de zogenaamde convolutiebewerking. Wanneer deze bewerking wordt geïmplementeerd, worden de resulterende pixelwaarden berekend als een gewogen som van de pixels in de originele afbeelding. De gewichtsmatrix wordt een convolutiekernel genoemd en wordt ook wel een filter genoemd.

Laten we eens kijken naar een voorbeeld. Laat de afbeelding een reeks pixels zijn met waarden weergegeven als een matrix

EEN=

en de convolutiekernel wordt als volgt weergegeven

H=

Laten we een voorbeeld bekijken van het berekenen van de resulterende pixel met coördinaten (2,4). Om dit te doen, moet u deze stappen volgen:

  1. Draai de convolutiekernel 180 graden ten opzichte van het centrale element.
  2. Vermenigvuldig elke gewichtswaarde in de convolutiematrix met de overeenkomstige pixelwaarde in matrix A.
  3. Tel het resultaat van de vermenigvuldiging bij elkaar op.


Correlatie

De correlatieoperatie lijkt qua implementatie sterk op de convolutieoperatie. Bij het berekenen van de correlatie is de resulterende pixelwaarde een gewogen som van omringende pixels. Het verschil is dat de gewichtsmatrix vóór de berekeningen niet wordt geroteerd. Laten we een soortgelijk voorbeeld bekijken van het berekenen van de waarde van de resulterende pixel (2,4). De originele beeldmatrix en correlatiekernel zijn afkomstig uit het vorige voorbeeld. Om dit te doen, moet u de volgende stappen implementeren:

  1. We vermenigvuldigen elke gewichtswaarde met de overeenkomstige waarde van het matrixelement van de originele afbeelding.
  2. Laten we alle vermenigvuldigingsresultaten uit stap 1 samenvatten.

Als gevolg hiervan zal de pixelwaarde (2,4) gelijk zijn aan


Berekening van de waarde van de resulterende pixel (2,4)

Waarom ziet een afbeelding die is geschaald met bicubische interpolatie er anders uit dan Photoshop? Waarom past het ene programma het formaat snel aan en het andere niet, terwijl het resultaat hetzelfde is. Welke methode voor het wijzigen van de grootte is beter voor het vergroten en welke voor het verkleinen. Wat doen filters en waarin verschillen ze?

Over het algemeen was dit een inleiding op een ander artikel, maar het sleepte zich voort en resulteerde in een apart artikel.

Deze man zit tussen de madeliefjes om uw aandacht op het artikel te vestigen.

Voor een visuele vergelijking zal ik afbeeldingen gebruiken met dezelfde resolutie 1920x1280 (de een, de ander), die ik zal verkleinen tot de formaten 330x220, 1067x667 en 4800x3200. Onder de illustraties staat hoeveel milliseconden het duurde om het formaat aan te passen naar een bepaalde resolutie. De cijfers worden alleen gegeven om de complexiteit van het algoritme te begrijpen, dus de specifieke hardware of software waarop ze zijn verkregen is niet zo belangrijk.

Dichtstbijzijnde buurman

Dit is de meest primitieve en snelle methode. Voor elke pixel van het uiteindelijke beeld wordt één pixel van het originele beeld geselecteerd die zich het dichtst bij zijn positie bevindt, rekening houdend met schaalvergroting. Deze methode produceert een gepixeld beeld wanneer wordt ingezoomd en een zeer korrelig beeld wanneer wordt uitgezoomd.

Over het algemeen kunnen de kwaliteit en prestaties van elke reductiemethode worden beoordeeld aan de hand van de verhouding tussen het aantal pixels dat betrokken is bij de vorming van het uiteindelijke beeld en het aantal pixels in het originele beeld. Hoe groter deze verhouding, hoe waarschijnlijker het is dat het algoritme beter en langzamer is. Een verhouding van één betekent dat ten minste elke pixel in de originele afbeelding heeft bijgedragen aan de uiteindelijke afbeelding. Maar voor geavanceerde methoden kunnen het er meer dan één zijn. Dus als we het beeld bijvoorbeeld drie keer aan elke kant verkleinen met behulp van de dichtstbijzijnde buurmethode, dan is deze verhouding gelijk aan 1/9. Die. met de meeste originele pixels wordt op geen enkele manier rekening gehouden.




1920×1280 → 330×220 = 0,12 ms
1920×1280 → 1067×667 = 1,86 ms

De theoretische werkingssnelheid hangt alleen af ​​van de grootte van het uiteindelijke beeld. In de praktijk dragen bij het verkleinen de cachemissers van de processor bij: hoe kleiner de schaal, des te minder gegevens worden gebruikt van elke regel die in de cache wordt geladen.

De methode wordt bewust uiterst zelden gebruikt voor reductie, omdat geeft zeer slechte kwaliteit, hoewel het handig kan zijn als het wordt vergroot. Vanwege de snelheid en het implementatiegemak is het opgenomen in alle bibliotheken en applicaties die met afbeeldingen werken.

Affiene transformaties

Affiene transformaties - algemene methode afbeeldingen te vervormen. Hiermee kunt u een afbeelding in één handeling roteren, uitrekken en spiegelen. Daarom is de beeldmodificatiefunctie in veel toepassingen en bibliotheken die de affiene transformatiemethode implementeren eenvoudigweg een wrapper die de coëfficiënten voor de transformatie berekent.

Het werkingsprincipe is dat voor elk punt in het uiteindelijke beeld een vaste reeks punten in het bronbeeld wordt genomen en geïnterpoleerd in overeenstemming met hun relatieve positie en het geselecteerde filter. Het aantal punten is ook afhankelijk van het filter. Voor bilineaire interpolatie worden 2x2 bronpixels gebruikt, voor bicubische interpolatie 4x4. Deze methode levert een vloeiend beeld op wanneer wordt ingezoomd, maar wanneer wordt uitgezoomd, lijkt het resultaat sterk op dat van het naaste buurbeeld. Kijk zelf maar: theoretisch, met een bicubisch filter en drievoudige reductie, is de verhouding tussen verwerkte pixels en originele pixels 4² / 3² = 1,78. In de praktijk is het resultaat veel slechter omdat In bestaande implementaties worden het filtervenster en de interpolatiefunctie niet geschaald volgens de beeldschaal, en worden pixels dichter bij de rand van het venster genomen met negatieve coëfficiënten (volgens de functie), d.w.z. geen nuttige bijdrage leveren aan het uiteindelijke beeld. Als gevolg hiervan verschilt een beeld verkleind met een bicubisch filter alleen van een beeld verkleind met een bilineair filter doordat het nog scherper is. Welnu, voor een bilineair filter en drievoudige reductie is de verhouding tussen verwerkte pixels en originele pixels 2² / 3² = 0,44, wat niet fundamenteel verschilt van de dichtstbijzijnde buur. In feite kunnen affiene transformaties niet worden gebruikt om de waarde met meer dan een factor 2 te verminderen. En zelfs als ze tot twee keer worden verkleind, geven ze merkbare laddereffecten voor de lijnen.

Theoretisch zouden er implementaties moeten zijn van affiene transformaties die het filtervenster en het filter zelf schalen in overeenstemming met de gespecificeerde vervormingen, maar in populaire open-sourcebibliotheken broncode Zo iemand heb ik nog nooit ontmoet.




1920×1280 → 330×220 = 6,13 ms
1920×1280 → 1067×667 = 17,7 ms
1920×1280 → 4800×3200 = 869 ms

De looptijd is merkbaar langer dan die van zijn naaste buur en hangt af van de grootte van het uiteindelijke beeld en de venstergrootte van het geselecteerde filter. Het is praktisch niet afhankelijk van cache-missers, omdat de originele pixels worden met minimaal twee tegelijk gebruikt.

Mijn bescheiden mening, dat het eenvoudig is om deze methode te gebruiken om afbeeldingen willekeurig te verkleinen is een bug, omdat het resultaat erg slecht is en vergelijkbaar is met het dichtstbijzijnde buurland, en deze methode vereist veel meer middelen. Deze methode heeft echter brede toepassing gevonden in programma's en bibliotheken. Het meest verrassende is dat deze methode in alle browsers wordt gebruikt voor de methode canvas drawImage() (illustratief voorbeeld), hoewel er nauwkeurigere methoden worden gebruikt om eenvoudig afbeeldingen in een element weer te geven (behalve IE, deze gebruikt in beide gevallen affiene transformaties ). Daarnaast wordt deze methode gebruikt in OpenCV, huidige versie Python-bibliotheek Pillow (ik hoop hier apart over te schrijven), in Paint.NET.

Bovendien is dit de methode die door videokaarten wordt gebruikt om 3D-scènes weer te geven. Maar het verschil is dat videokaarten van tevoren een reeks gereduceerde versies (mip-niveaus) voorbereiden voor elke textuur, en dat voor de uiteindelijke weergave een niveau met een dergelijke resolutie wordt geselecteerd, zodat de textuur niet meer dan twee keer wordt verkleind. Om een ​​scherpe sprong te elimineren bij het veranderen van het mip-niveau (wanneer een object met textuur nadert of weggaat), wordt bovendien lineaire interpolatie gebruikt tussen aangrenzende mip-niveaus (dit is al trilineaire filtering). Dus om elke pixel weer te geven driedimensionaal voorwerp moet interpoleren tussen 2³ ​​pixels. Dit geeft een resultaat dat acceptabel is voor een snel bewegend beeld in een tijd die lineair is ten opzichte van de uiteindelijke resolutie.

Supersampling

Met deze methode worden dezelfde mip-niveaus gemaakt, met behulp waarvan (om sterk te vereenvoudigen) anti-aliasing op volledig scherm werkt in games. De essentie ervan is om de originele afbeelding op te splitsen in een raster van uiteindelijke pixels en alle originele pixels per pixel van de uiteindelijke afbeelding op te tellen in overeenstemming met het gebied dat door de uiteindelijke pixel wordt bedekt. Wanneer u deze methode voor vergroting gebruikt, is er voor elke pixel in de uiteindelijke afbeelding precies één pixel in het origineel. Daarom is het resultaat voor augmentatie gelijk aan de dichtstbijzijnde buur.

Er zijn twee subtypen van deze methode: met afronding van pixelgrenzen naar het dichtstbijzijnde gehele aantal pixels en zonder. In het eerste geval wordt het algoritme ongeschikt om minder dan drie keer te schalen, omdat elke laatste pixel één originele pixel kan hebben, en de aangrenzende pixel er vier (2x2) kan hebben, wat tot onevenredigheden op lokaal niveau leidt. Tegelijkertijd kan het afrondingsalgoritme uiteraard worden gebruikt in gevallen waarin de grootte van de originele afbeelding een veelvoud is van de grootte van de uiteindelijke afbeelding, of de verkleiningsschaal vrij klein is (versies met een resolutie van 330x220 zijn bijna hetzelfde ). De verhouding van verwerkte pixels tot de originele pixels bij het afronden van grenzen is altijd gelijk aan één.




1920×1280 → 330×220 = 7 ms
1920×1280 → 1067×667 = 15 ms
1920×1280 → 4800×3200 = 22,5 ms

Ondersoorten zonder afronding geven uitstekende kwaliteit bij uitzoomen op welke schaal dan ook, en bij inzoomen geeft het een vreemd effect waarbij het grootste deel van de originele pixel in de uiteindelijke afbeelding er uniform uitziet, maar er een overgang zichtbaar is aan de randen. De verhouding van verwerkte pixels tot originele pixels zonder randafronding kan van één tot vier zijn, omdat elke originele pixel bijdraagt ​​aan één uiteindelijke pixel, of aan twee aangrenzende pixels, of aan vier aangrenzende pixels.




1920×1280 → 330×220 = 19 ms
1920×1280 → 1067×667 = 45 ms
1920×1280 → 4800×3200 = 112 ms

De prestaties van deze methode voor reductie zijn lager dan die van affiene transformaties, omdat alle pixels van het originele beeld betrokken zijn bij de berekening van het uiteindelijke beeld. De versie met afronding naar de dichtstbijzijnde grens is meestal meerdere malen sneller. Het is ook mogelijk om aparte versies te maken om in te schalen vaste hoeveelheid keer (bijvoorbeeld 2 keer afnemen), wat nog sneller zal zijn.

Deze methode wordt gebruikt in de functie gdImageCopyResampled() van de GD-bibliotheek, die deel uitmaakt van PHP, gevonden in OpenCV (INTER_AREA-vlag), Intel IPP, AMD Framewave. Libjpeg werkt volgens ongeveer hetzelfde principe, waarbij het afbeeldingen meerdere keren verkleind opent. Met dit laatste kunnen veel applicaties worden geopend JPEG-afbeeldingen het formaat meerdere keren vooraf aangepast zonder veel overhead (in de praktijk opent libjpeg kleinere afbeeldingen zelfs iets sneller dan afbeeldingen op volledige grootte), en gebruikt vervolgens andere methoden om het formaat aan te passen naar de exacte grootte. Bijvoorbeeld als u het formaat wilt wijzigen JPEG-resolutie Met een resolutie van 1920x1280 tot 330x220 kunt u de originele afbeelding openen met een resolutie van 480x320 en deze vervolgens verkleinen tot de gewenste 330x220.

Convolutie

Deze methode is vergelijkbaar met affiene transformaties in die zin dat er filters worden gebruikt, maar in plaats van een vast venster te hebben, heeft het een venster dat evenredig is aan de schaal. Als de filtervenstergrootte bijvoorbeeld 6 is en de afbeeldingsgrootte 2,5 keer wordt verkleind, dan nemen (2,5 * 6)² = 225 pixels deel aan de vorming van elke pixel van de uiteindelijke afbeelding, wat veel meer is dan in in het geval van supersampling (van 9 naar 16). Gelukkig kunnen convoluties in twee stappen worden geteld, eerst in de ene richting en vervolgens in de andere, dus de algoritmische complexiteit van het berekenen van elke pixel is niet 225, maar slechts (2,5 * 6) * 2 = 30. De bijdrage van elke originele pixel naar de laatste is als volgt: tijden bepaald door het filter. De verhouding tussen verwerkte pixels en originele pixels wordt volledig bepaald door de grootte van het filtervenster en is gelijk aan het kwadraat ervan. Die. voor een bilineair filter is deze verhouding 4, voor een bicubisch filter 16, voor Lanczos 36. Het algoritme werkt uitstekend voor zowel reductie als vergroting.




1920×1280 → 330×220 = 76 ms
1920×1280 → 1067×667 = 160 ms
1920×1280 → 4800×3200 = 1540 ms

De snelheid van deze methode hangt af van alle parameters: de grootte van de bronafbeelding, de grootte van de uiteindelijke afbeelding en de grootte van het filtervenster.

Dit is de methode die is geïmplementeerd in ImageMagick, GIMP en in de huidige versie van Pillow met de ANTIALIAS-vlag.

Een van de voordelen van deze methode is dat filters kunnen worden gespecificeerd als een aparte functie die op geen enkele manier gebonden is aan de implementatie van de methode. De functie van het filter zelf kan echter behoorlijk complex zijn zonder veel prestatieverlies, omdat de coëfficiënten voor alle pixels in één kolom en voor alle pixels in één rij slechts één keer worden berekend. Die. De filterfunctie zelf wordt alleen (m + n) * w keer aangeroepen, waarbij m en n de afmetingen van het uiteindelijke beeld zijn, en w de grootte van het filtervenster. En je kunt veel van deze functies vastpinnen, als er maar een wiskundige rechtvaardiging was. In ImageMagick zijn er bijvoorbeeld 15. Hier is hoe de meest populaire eruit zien:

Bilineair filter (bilineair of driehoekig in ImageMagick)


Bicubisch filter (bicubisch, catrom in ImageMagick)


Lanczos-filter

Het is opmerkelijk dat sommige filters zones met negatieve coëfficiënten hebben (zoals het bicubische filter of het Lanczos-filter). Dit is nodig om de overgangen in het uiteindelijke beeld de scherpte te geven die in het origineel aanwezig was.