10. ünite / 12
Öznitelik algılama ve eşleştirme: Harris, ORB, RANSAC
Köşe nedir, Harris yanıtı, anahtar nokta ve betimleyici, ikili betimleyici ve Hamming uzaklığı, oran testi, RANSAC.
Bu ünitenin sonunda
- Köşenin kenardan ve düz bölgeden farkını yapı tensörüyle açıklamak
- Anahtar nokta ile betimleyicinin farkını söylemek
- İkili betimleyicileri Hamming uzaklığı ve oran testiyle eşleştirmek
- RANSAC ile yanlış eşleşmelere rağmen dönüşümü bulmak
Ders notları
İki görüntüde aynı noktayı bulmak; panorama, nesne tanıma, görsel odometri ve SLAM'in temelidir. Düz bölgeler ve düz kenarlar bunun için kötüdür (kenar boyunca kayınca görüntü değişmez); köşeler her yönde değişir.
Harris
Bir penceredeki gradyanlardan yapı tensörü kurulur: M = Σ w·[Ix² IxIy; IxIy Iy²]. İki özdeğer de büyükse köşe, biri büyükse kenar, ikisi küçükse düz bölge vardır. Özdeğer hesaplamadan:
R büyük pozitifse köşe, negatifse kenar. Yerel en büyükler anahtar nokta olur.
Betimleyici ve eşleştirme
Anahtar nokta "nerede" sorusunu, betimleyici "neye benziyor" sorusunu yanıtlar. ORB, FAST köşelerini bulur, yamanın yoğunluk merkezinden bir yön hesaplar ve yamayı o yöne döndürüp 256 piksel çiftini karşılaştırır (BRIEF): 256 bitlik bir parmak izi. İki betimleyici arasındaki uzaklık farklı bit sayısıdır (Hamming), XOR ve bit sayımıyla çok hızlıdır. Belirsiz eşleşmeleri atmak için oran testi: en yakın komşu, ikinci en yakından açıkça yakın olmalı (d₁ < 0,75·d₂).
RANSAC
Eşleşmelerin bir kısmı yine de yanlıştır. RANSAC rastgele 4 eşleşme seçer, homografiyi çözer, kaç eşleşmenin bu modele uyduğunu sayar; en çok "iç nokta" toplayan modeli tutar. Yanlış eşleşmeler en küçük kareler gibi her şeyi bozmaz, yalnız dışarıda kalır.
Oyun alanı
Köşeler ve öznitelik eşleştirme
Harris yanıtı köşelerde büyüktür. Sağdaki görüntü soldakinin döndürülmüş ve ölçeklenmiş kopyası; her köşe için ikili (BRIEF benzeri) betimleyici çıkarılır, Hamming uzaklığı ve oran testiyle eşleştirilir.
Kendin dene
Öznitelik aracında sağdaki görüntü soldakinin döndürülmüş kopyası. Açıyı 0, 20 ve 45 derece yap; her birinde eşleşme sayısını ve RANSAC iç nokta oranını yaz. Oran testini 0,6'dan 0,95'e kaydır: eşleşme sayısı ve doğruluk nasıl değişti? Harris k değerini 0,04'ten 0,15'e çıkarınca köşe sayısına ne oldu?
Kod
import cv2
import numpy as np
img = cv2.imread('girdi.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
R = cv2.cornerHarris(np.float32(gray), 2, 3, 0.04) # blok 2, Sobel 3, k = 0,04
print('Harris köşe pikseli:', int((R > 0.01 * R.max()).sum()))
h, w = gray.shape
M = cv2.getRotationMatrix2D((w / 2, h / 2), 25, 0.8)
gray2 = cv2.warpAffine(gray, M, (w, h)) # döndürülmüş ve küçültülmüş kopya
orb = cv2.ORB_create(nfeatures=500)
k1, d1 = orb.detectAndCompute(gray, None) # d: 32 bayt = 256 bitlik ikili betimleyici
k2, d2 = orb.detectAndCompute(gray2, None)
print('nokta:', len(k1), len(k2))
good = []
if d1 is not None and d2 is not None and len(k2) >= 2:
bf = cv2.BFMatcher(cv2.NORM_HAMMING) # ikili betimleyicide Hamming uzaklığı
for pair in bf.knnMatch(d1, d2, k=2):
if len(pair) == 2 and pair[0].distance < 0.75 * pair[1].distance: # Lowe oran testi
good.append(pair[0])
print('iyi eşleşme:', len(good))
if len(good) >= 4:
src = np.float32([k1[m.queryIdx].pt for m in good])
dst = np.float32([k2[m.trainIdx].pt for m in good])
Hm, inl = cv2.findHomography(src, dst, cv2.RANSAC, 3.0) # aykırıları ayıkla
print('RANSAC inlier:', int(inl.sum()) if inl is not None else 0)
out = cv2.drawMatches(gray, k1, gray2, k2, good[:40], None, flags=2)
cv2.imwrite('cikti.png', out)Sık yapılan hatalar
- İkili betimleyicileri (ORB, BRIEF) Öklid uzaklığıyla eşleştirmek: NORM_HAMMING gerekir.
- Oran testini atlamak: tekrarlayan desenlerde (karo, pencere) yanlış eşleşmeler çoğalır.
- Dönüşümü RANSAC olmadan en küçük karelerle çözmek: tek bir yanlış eşleşme sonucu büyük ölçüde kaydırır.
- Dokusuz yüzeylerde (beyaz duvar) öznitelik beklemek: köşe yoksa eşleşme de yoktur.
Yazılım mühendisliği bağlantısı
RANSAC rastgeledir; aynı girdi farklı çalıştırmalarda farklı sonuç verebilir. Test edilebilirlik için tohumu sabitle.
- Rastgele sayı üretecini dışarıdan ver (bağımlılık enjeksiyonu); testte sabit tohum, üretimde gerçek rastgelelik.
- Sonucu tek bir sayı yerine dağılımla değerlendir: 100 çalıştırmada iç nokta oranının alt yüzdeliği.
Kendini sına
Harris yanıtı R büyük ve negatifse o bölge nedir?
ORB betimleyicileri hangi uzaklıkla karşılaştırılır?
Lowe oran testi neyi eler?
RANSAC neden yanlış eşleşmelere dayanıklıdır?
