Introducere pentru a CERNE( Scale Invariant Feature Transform)
CERNE reprezintă la Scară-Invariant Feature Transform și a fost prezentat pentru prima dată în 2004, de către D. Lowe, de la Universitatea din British Columbia. SIFT este invarianța la scara și rotația imaginii. Acest algoritm este brevetat, astfel încât acest algoritm este inclus în modulul non-free în OpenCV.
avantajele majore ale sift sunt
- localitate: caracteristicile sunt locale, atât de robuste pentru ocluzie și dezordine (fără segmentare prealabilă)
- distinctivitate: caracteristicile individuale pot fi potrivite pentru o bază de date mare de obiecte
- Cantitate: multe caracteristici pot fi generate chiar și pentru obiecte mici
- eficiență: aproape de performanță în timp real
- extensibilitate: poate fi extins cu ușurință la o gamă largă de diferite tipuri de caracteristici, cu fiecare adăugare robustețe
aceasta face parte dintr-o detectare și potrivire a caracteristicilor din seria 7. Alte articole incluse
- Introducere în detectarea și potrivirea caracteristicilor
- Introducere în Harris Corner Detector
- Introducere în SURF (caracteristici robuste accelerate)
- Introducere în FAST (caracteristici din testul segmentului accelerat)
- introducere în BRIEF (caracteristici elementare independente robuste binare)
- Introducere în ORB (scurt orientat rapid și rotit)
SIFT este un algoritm destul de implicat. Există în principal patru pași implicați în algoritmul SIFT. Le vom vedea unul câte unul.
- scară-spațiu de vârf de selecție: Locație potențială pentru găsirea de caracteristici.
- Keypoint localizare: localizarea cu precizie caracteristica keypoints.
- orientare atribuire: atribuirea orientare la keypoints.
- descriptor Keypoint: descriind keypoints ca un vector dimensional ridicat.
- Keypoint potrivire
scară-spațiu de selecție vârf
obiecte din lumea reală sunt semnificative doar la o anumită scară. S-ar putea să vedeți un cub de zahăr perfect pe o masă. Dar dacă privim întreaga cale Lactee, atunci pur și simplu nu există. Această natură multi-scară a obiectelor este destul de comună în natură. Și un spațiu la scară încearcă să reproducă acest concept pe imagini digitale.
spațiul de scală al unei imagini este o funcție L(x,y,XV) care este produsă din convoluția unui kernel gaussian(estompare) la diferite scări cu imaginea de intrare. Scară-spațiul este separat în octave, iar numărul de octave și scară depinde de dimensiunea imaginii originale. Deci, generăm mai multe octave ale imaginii originale. Dimensiunea imaginii fiecărei octave este jumătate din cea anterioară.
estompare
într-o octavă, imaginile sunt încețoșate progresiv folosind operatorul Gaussian Blur. Matematic, „estomparea” este denumită convoluția operatorului Gaussian și a imaginii. Gaussian blur are o anumită expresie sau” operator ” care se aplică fiecărui pixel. Ceea ce rezultă este imaginea neclară.
găsirea keypoints
până acum, am generat un spațiu scară și folosit spațiul scară pentru a calcula diferența de gaussians. Acestea sunt apoi folosite pentru a calcula aproximările Laplaciene ale gaussiene care sunt invariante la scară.
un pixel dintr-o imagine este comparat cu cei 8 vecini ai săi, precum și 9 pixeli în scara următoare și 9 pixeli în scalele anterioare. În acest fel, se efectuează un total de 26 de verificări. Dacă este o extrema locală, este un potențial keypoint. Aceasta înseamnă practic că keypoint este cel mai bine reprezentat în această scară.
Keypoint Localization
Key0points generate în etapa anterioară produc o mulțime de keypoints. Unele dintre ele se află de-a lungul unei margini sau nu au suficient contrast. În ambele cazuri, acestea nu sunt la fel de utile ca caracteristicile. Așa că scăpăm de ei. Abordarea este similară cu cea utilizată în detectorul Harris Corner pentru eliminarea caracteristicilor edge. Pentru caracteristicile cu contrast redus, verificăm pur și simplu intensitățile acestora.
au folosit expansiunea seriei Taylor a spațiului la scară pentru a obține o locație mai precisă a extrema, iar dacă intensitatea la această extrema este mai mică decât o valoare de prag (0,03 conform lucrării), aceasta este respinsă. Câinele are un răspuns mai mare pentru margini, astfel încât marginile trebuie, de asemenea, eliminate. Au folosit o matrice hessiană 2×2 (H) pentru a calcula curbura principală.
orientare atribuire
acum avem keypoints legitime. Au fost testate pentru a fi stabile. Știm deja scara la care a fost detectată keypoint (este aceeași cu scara imaginii neclare). Deci avem invarianță la scară. Următorul lucru este să atribuiți o orientare fiecărui keypoint pentru a-l face invarianță de rotație.
un cartier este luat în jurul locației Keypoint în funcție de scară, iar magnitudinea și direcția gradientului sunt calculate în acea regiune. Se creează o histogramă de orientare cu 36 de coșuri care acoperă 360 de grade. Să presupunem că direcția gradientului la un anumit punct (în „regiunea de colectare a orientării”) este de 18.759 grade, apoi va intra în coșul de 10-19 grade. Iar „cantitatea” care se adaugă la Coș este proporțională cu magnitudinea gradientului din acel moment. După ce ați făcut acest lucru pentru toți pixelii din jurul punctului de tastatură, histograma va avea un vârf la un moment dat.
cel mai înalt vârf din histogramă este luat și orice vârf peste 80% din acesta este, de asemenea, considerat pentru a calcula orientarea. Se creează keypoints cu aceeași locație și scară, dar direcții diferite. Contribuie la stabilitatea potrivirii.
descriptorul punctului de tastatură
În acest moment, fiecare punct de tastatură are o locație, o scară, o orientare. Următorul este de a calcula un descriptor pentru regiunea de imagine locală despre fiecare keypoint care este extrem de distinctiv și invariant posibil la variații, cum ar fi schimbările de punct de vedere și iluminare.
pentru a face acest lucru, este luată o fereastră 16×16 în jurul punctului de tastatură. Este împărțit în 16 sub-blocuri de dimensiuni 4×4.
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. Acest vector caracteristică introduce câteva complicații. Trebuie să scăpăm de ele înainte de a finaliza amprenta.
- dependența de rotație vectorul caracteristică utilizează orientări gradient. În mod clar, dacă rotiți imaginea, totul se schimbă. Toate orientările gradientului se schimbă, de asemenea. Pentru a obține independența de rotație, rotația keypoint este scăzută din fiecare orientare. Astfel, fiecare orientare gradient este relativ la orientarea keypoint lui.
- dependența de iluminare dacă pragăm numerele care sunt mari, putem obține independența iluminării. Deci, orice număr (din 128) mai mare de 0,2 este schimbat la 0,2. Acest vector caracteristică rezultat este normalizat din nou. Și acum aveți un vector independent de iluminare!
Keypoint Matching
Keypoints între două imagini sunt potrivite prin identificarea celor mai apropiați vecini. Dar, în unele cazuri, al doilea cel mai apropiat meci poate fi foarte aproape de primul. Se poate întâmpla din cauza zgomotului sau din alte motive. În acest caz, se ia raportul dintre distanța cea mai apropiată și distanța cea mai apropiată. Dacă este mai mare de 0,8, acestea sunt respinse. Se elimină în jur de 90% din meciuri false în timp ce aruncă doar 5% meciuri corecte, ca pe hârtie.
implementare
am reușit să implementez sift folosind OpenCV(3.4). Iată cum am făcut-o:
GitHub link pentru codul: https://github.com/deepanshut041/feature-detection/tree/master/sift