Skip navigation

A SIFT detektor

Előismeret

A SIFT (Scale Invariant Feature Transform) az egyik leggyakrabban használt és hivatkozott jellemzőpont detektor. Ebben a leckében röviden áttekintjük a SIFT működését. A teljes algoritmus megértéséhez javasoljuk a Lowe eredeti cikkének tanulmányozását.

A SIFT detektor fontosabb lépései

  1. Konvolváljuk a szürkeárnyalatos képet egy σ paraméterű Gauss-függvénnyel különböző skálafaktor mellett. Képezzük ezeknek a simított képeknek a különbségét (Difference of Gaussians - DoG). A jellemzőpontok a skálatérben a DoG képeken egy 3×3×3 környezet maximumaiban lesznek.
  2. Küszöböljük az értékeket.
  3. Elimináljuk az élválaszokat (csak a sarokpontok érdekesek számunkra).
  4. A lokális orientációhoz határozzuk meg a domimáns gradiens irányt. Az így kapott skála és orientáció minden pont esetében meghatároz egy lokális koordináta-rendszert, tehát minden pont rendelkezik egy (x,y,σ,ϕ) koordinátával (ahol σ az skálaértéket, ϕ az orientációt jelöli).
  5. A jellemzőpont leírásához tekintsünk egy 16×16-os környezetet, amelyet tovább 4×4-es blokkokra osztunk.
  6. Számítsunk a blokkokban 8-irányú irányhisztogramot.
  7. Alkalmazzunk Gauss súlyozást a középpont körül, amelynek szórása 0.5σ (ahol σ a pont skálaértéke)
  8. Előáll egy 128 elemű jellemzővektor.

A SIFT detektor az OPenCV függvénykönyvtárban

A SIFT jellemződetektor az OpenCV-ben az xfeatures2d (amely az opencv_contrib függvénykönyvtáron belül van) csomagba került, mivel ipari és kereskedelmi felhasználása szabadalmi költséget von magaután. Oktatási és kutatási célra a használata ingyenes.

A jellemződetektor alábbi paramétereit állíthatjuk be:

  • nfeatures: hány jellemzőpontot szeretnénk megtartani (ha 0-t írunk, akkor nem korlátozzuk ezt a számot)
  • nOctaveLayers: a rétegek száma minden oktávhoz (Lowe algoritmusában 3)
  • constantThreshold: egy küszöbérték az alacsony kontraszttal rendelkező ter

Példaprogram

Az alábbi példa a következő lépésekből áll:

  1. A kép megnyitása.
  2. A kép szürkeárnyalatossá konvertálása.
  3. A jellemződetektor létrehozása.
  4. Jellemzőpontok detektálása.
  5. Leírók számítása a jellemzőpontokhoz.
  6. Jellemzőpontok kirajzolása.

import cv2
import numpy as np
from matplotlib import pyplot as plt

SOURCE_IMAGE='lisbon1.jpg'
OUTPUT_IMAGE='sift_lisbon1.jpg'

## kép beolvasása
img = cv2.imread(SOURCE_IMAGE);

## a képet szürkeárnyalatossá konvertáljuk
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

## jellemzőpontok detektálása
sift = cv2.xfeatures2d.SIFT_create()
keypoints = sift.detect(gray_img, None)

## kulcspont leírók számítása
keypoints, descriptors = sift.compute(gray_img, keypoints)

## kulcspontok kirajzolása
out_img = cv2.drawKeypoints(gray_img, keypoints, descriptors, color=(255, 0, 255), flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

cv2.imwrite(OUTPUT_IMAGE, out_img)

plt.imshow(out_img);
plt.title(OUTPUT_IMAGE)
plt.show()