Mar 16, 2019 · 7 min lezen
ZIFT staat voor Schaal-Invariant Feature Transform en werd voor het eerst gepresenteerd in 2004, door D. Lowe, Universiteit van British Columbia. Zift is invariantie aan beeldschaal en rotatie. Dit algoritme is gepatenteerd, dus dit algoritme is opgenomen in de niet-vrije module in OpenCV.
de Grote voordelen van SIFT zijn
Plaats: beschikt over een lokaal, een zo robuust te occlusie en rommel (geen voorafgaande segmentatie)
Bijzonderheden: individuele functies kunnen worden gekoppeld aan een grote database van objecten
Hoeveelheid: veel functies kunnen worden gegenereerd voor zelfs kleine objecten
– Efficiëntie: dicht bij real-time prestaties
uitbreidbaarheid: kan gemakkelijk worden uitgebreid tot een breed scala van verschillende functietypen, waarbij elk robuustheid
toevoegt.dit maakt deel uit van een 7-serie Functiedetectie en-Matching. Andere artikelen omvatten
Inleiding tot Feature detectie en Matching
Inleiding tot Harris Corner Detector
Inleiding tot SURF (Speeded-Up robuuste functies)
Inleiding tot FAST (functies van versnelde Segmenttest)
Inleiding tot BRIEF (binaire robuuste onafhankelijke elementaire functies)
Inleiding tot ORB (georiënteerd snel en geroteerd BRIEF)
zift is een behoorlijk betrokken algoritme. Er zijn voornamelijk vier stappen betrokken bij het zift algoritme. We zullen ze één voor één zien.
Schaal-ruimtepiekselectie: Potentiële locatie voor het vinden van functies.
Keypoint lokalisatie: nauwkeurig lokaliseren van de feature keypoints.
Oriëntatietoewijzing: oriëntatie toewijzen aan toetspunten.
Keypoint descriptor: de keypoints beschrijven als een hoge dimensionale vector.
Toetspunt dat overeenkomt met
Schaal-spatiepiekselectie
reële objecten zijn alleen zinvol op een bepaalde schaal. Misschien zie je een suikerklontje perfect op een tafel. Maar als je naar de hele Melkweg kijkt, dan bestaat die gewoon niet. Deze multi-schaal aard van objecten is vrij algemeen in de natuur. Een schaalruimte probeert dit concept te repliceren op digitale beelden.
een afbeelding is een functie L(X,Y,σ) die wordt geproduceerd uit de convolutie van een Gaussiaanse kernel(vervaging) op verschillende schalen met het invoerbeeld. Schaal-ruimte wordt gescheiden in octaven en het aantal octaven en schaal is afhankelijk van de grootte van de oorspronkelijke afbeelding. Dus we genereren meerdere octaven van de originele afbeelding. De afbeeldingsgrootte van elk octaaf is de helft van de vorige.
vervagen
binnen een octaaf worden afbeeldingen geleidelijk vervaagd met behulp van de Gaussiaanse vervaging-operator. Wiskundig wordt “vervaging” aangeduid als de convolutie van de Gaussiaanse operator en het beeld. Gaussiaanse vervaging heeft een bepaalde uitdrukking of “operator” die op elke pixel wordt toegepast. Wat resulteert is het wazig beeld.
wazig beeld g is de gaussiaanse vervagingsoperator en I is een afbeelding. Terwijl x, y de locatiecoördinaten zijn en σ de parameter “schaal” is. Zie het als de hoeveelheid waas. Groter de waarde, groter de waas.
Gaussian Blur operator
dog(verschil van de Gaussiaanse kernel)
nu gebruiken we die vage afbeeldingen om een andere set afbeeldingen te genereren, het verschil van gaussianen (hond). Deze hond beelden zijn geweldig voor het vinden van interessante toetspunten in de afbeelding. Het verschil van Gaussiaans wordt verkregen als het verschil van Gaussiaans vervagen van een afbeelding met twee verschillende σ, zij het σ en kσ. Dit proces wordt gedaan voor verschillende octaven van het beeld in de Gaussiaanse Piramide. Het wordt weergegeven in onderstaande afbeelding:
toetspunten vinden
tot nu toe hebben we een schaalruimte gegenereerd en de schaalruimte gebruikt om het verschil van gaussianen te berekenen. Deze worden vervolgens gebruikt om Laplacian van Gaussiaanse benaderingen te berekenen die schaalinvariant zijn.
Eén pixel in een afbeelding wordt vergeleken met zijn 8 buren evenals 9 pixels in de volgende schaal en 9 pixels in de vorige schalen. Op deze manier worden in totaal 26 controles uitgevoerd. Als het een lokaal extrema is, is het een potentieel toetspunt. Het betekent eigenlijk dat keypoint het best wordt weergegeven in die schaal.
Keypoint lokalisatie
Key0points gegenereerd in de vorige stap produceren veel keypoints. Sommige liggen langs een rand, of ze hebben niet genoeg contrast. In beide gevallen zijn ze niet zo nuttig als functies. Dus we ontdoen ons van hen. De aanpak is vergelijkbaar met die welke wordt gebruikt in de Harris hoek Detector Voor het verwijderen van rand functies. Voor functies met een laag contrast controleren we gewoon hun intensiteiten.
ze gebruikten Taylor-serie expansie van schaalruimte om een nauwkeurigere locatie van extrema te krijgen, en als de intensiteit bij dit extrema minder is dan een drempelwaarde (0,03 volgens het papier), wordt het afgewezen. Hond heeft een hogere respons voor randen, dus randen moeten ook worden verwijderd. Ze gebruikten een 2×2 Hessische matrix (H) om de hoofdkromming te berekenen.
Oriëntatie Opdracht
Nu hebben we legitieme keypoints. Ze zijn getest om stabiel te zijn. We kennen al de schaal waarop het toetspunt werd gedetecteerd (het is hetzelfde als de schaal van het wazig beeld). Dus we hebben schaalinvariantie. Het volgende ding is om een oriëntatie toe te wijzen aan elk toetspunt om het rotatie invariantie te maken.
een omgeving wordt rondom genomen het toetspunt locatie afhankelijk van de schaal, en de gradiënt magnitude en richting wordt berekend in dat gebied. Een oriëntatie histogram met 36 bakken die 360 graden. Laten we zeggen dat de gradiënt richting op een bepaald punt (in de “oriëntatie collectie gebied”) is 18,759 graden, dan zal het gaan in de 10-19-graden bin. En de “hoeveelheid” die wordt toegevoegd aan de bin is evenredig met de grootte van de gradiënt op dat punt. Zodra je dit hebt gedaan voor alle pixels rond het toetspunt, zal het histogram een piek hebben op een bepaald punt.
de hoogste piek in het histogram wordt genomen en elke piek boven 80% ervan wordt ook beschouwd om de oriëntatie te berekenen. Het maakt toetspunten met dezelfde locatie en schaal, maar verschillende richtingen. Het draagt bij aan de stabiliteit van matching.
Keypoint descriptor
Op dit punt heeft elk keypoint een locatie, schaal, oriëntatie. Vervolgens is het berekenen van een descriptor voor het lokale beeldgebied over elk toetspunt dat is zeer onderscheidend en invariant mogelijk om variaties zoals veranderingen in gezichtspunt en verlichting.
om dit te doen, wordt een 16×16 venster rond het toetspunt genomen. Het is verdeeld in 16 sub-blokken van 4×4 grootte.
For each sub-block, 8 bin orientation histogram is created.
So 4 X 4 descriptors over 16 X 16 sample array were used in practice. 4 X 4 X 8 directions give 128 bin values. It is represented as a feature vector to form keypoint descriptor. Deze functie vector introduceert een paar complicaties. We moeten van ze af voordat we de vingerafdruk afwerken.
Rotatieafhankelijkheid de functievector gebruikt gradiëntoriëntaties. Het is duidelijk dat als je de afbeelding roteert, alles verandert. Alle gradiëntoriëntaties veranderen ook. Om rotatie-onafhankelijkheid te bereiken, wordt de rotatie van het toetspunt afgetrokken van elke oriëntatie. Elke gradiëntoriëntatie is dus relatief ten opzichte van de oriëntatie van het toetspunt.
verlichtingsafhankelijkheid als we drempelgetallen die groot zijn, kunnen we verlichtingsonafhankelijkheid bereiken. Dus, elk nummer (van de 128) groter dan 0.2 wordt veranderd in 0.2. Deze resulterende eigenschap vector is weer genormaliseerd. En nu heb je een verlichting onafhankelijke functie vector!
Toetspunten die overeenkomen met
Toetspunten tussen twee afbeeldingen worden vergeleken door hun dichtstbijzijnde buren te identificeren. Maar in sommige gevallen, de tweede dichtste-match kan heel dicht bij de eerste. Het kan gebeuren als gevolg van lawaai of een andere redenen. In dat geval wordt de verhouding van de dichtstbijzijnde-afstand tot de tweede-dichtstbijzijnde afstand genomen. Als het hoger is dan 0,8, worden ze afgewezen. Het elimineert ongeveer 90% van de valse wedstrijden, terwijl teruggooi slechts 5% juiste wedstrijden, volgens het papier.
implementatie
i kon sift implementeren met OpenCV (3.4). Zo heb ik het gedaan:
Github link for the code: https://github.com/deepanshut041/feature-detection/tree/master/sift