· Hakan Çelik · OpenCV / Özellik Tespiti · 3 dk okuma
SIFT'e Giriş (Ölçek Değişmez Özellik Dönüşümü)

OpenCV Serisi 36/64
- 1. Boya Fırçası Olarak Fare
- 2. Canny Kenar Algılama
- 3. Görüntü Geçişleri
- 4. Görüntü Piramitleri
- 5. Görüntülerde Aritmetik İşlemler
- 6. Görüntülerle İlgili Temel İşlemler
- 7. Görüntünün Geometrik Dönüşümleri
- 8. Görüntüyü Yumuşatma - ( Smoothing Images )
- 9. Histogramlar
- 10. Konturler ( Contours )
- 11. Morfolojik Dönüşümler
- 12. Opencv Nedir Ve Kurulumu
- 13. Opencv Resim Işlemleri
- 14. Opencv Video Işlemleri
- 15. Opencv'de Çizim Fonksiyonları
- 16. Performans Ölçüm Ve Geliştirme Teknikleri
- 17. Renk Alanlarını Değiştirme
- 18. Renk Paleti Olarak Parça Çubuğu ( Trackbar )
- 19. Resim Eşikleme
- 20. Şablon Eşleştirme
- 21. Hough Doğru Dönüşümü
- 22. Hough Daire Dönüşümü
- 23. Fourier Dönüşümü
- 24. Histogram Eşitleme
- 25. 2B Histogramlar
- 26. Histogram Geri Projeksiyonu
- 27. Kontur Özellikleri
- 28. Kontur Nitelikleri
- 29. Konturlerle Daha Fazla İşlev
- 30. Kontur Hiyerarşisi
- 31. GrabCut ile Etkileşimli Ön Plan Çıkarma
- 32. Watershed Algoritması ile Görüntü Segmentasyonu
- 33. Özellikleri Anlamak
- 34. Harris Köşe Tespiti
- 35. Shi-Tomasi Köşe Dedektörü ve İzlenecek İyi Özellikler
- 36. SIFT'e Giriş (Ölçek Değişmez Özellik Dönüşümü)
- 37. SURF'e Giriş (Hızlandırılmış Sağlam Özellikler)
- 38. Köşe Tespiti için FAST Algoritması
- 39. BRIEF — İkili Sağlam Bağımsız Temel Özellikler
- 40. ORB (Yönlü FAST ve Döndürülmüş BRIEF)
- 41. Özellik Eşleştirme
- 42. Özellik Eşleştirme + Nesneleri Bulmak için Homografi
- 43. Meanshift ve Camshift ile Nesne Takibi
- 44. Optik Akış
- 45. Arka Plan Çıkarma
- 46. Kamera Kalibrasyonu
- 47. Poz Tahmini
- 48. Epipolar Geometri
- 49. Stereo Görüntülerden Derinlik Haritası
- 50. k-En Yakın Komşuyu Anlamak
- 51. kNN ile El Yazısı OCR
- 52. SVM'yi Anlamak
- 53. SVM ile El Yazısı OCR
- 54. K-Ortalamalar Kümeleme'yi Anlamak
- 55. OpenCV'de K-Ortalamalar Kümeleme
- 56. Görüntü Gürültü Giderme
- 57. Görüntü Onarımı (Inpainting)
- 58. Yüksek Dinamik Aralık (HDR) Görüntüleme
- 59. Haar Cascade ile Yüz Tespiti
- 60. pip ile OpenCV Kurulumu
- 61. Ubuntu'da OpenCV-Python Kurulumu
- 62. Fedora'da OpenCV-Python Kurulumu
- 63. Windows'ta OpenCV-Python Kurulumu
- 64. OpenCV-Python Bağlayıcıları Nasıl Çalışır?
SIFT’e Giriş (Ölçek Değişmez Özellik Dönüşümü)
Hedefler
Bu bölümde:
- SIFT algoritmasının kavramlarını öğreneceğiz
- SIFT Anahtar Noktalarını ve Tanımlayıcılarını bulmayı öğreneceğiz
Teori
Son birkaç bölümde Harris gibi birkaç köşe dedektörü gördük. Bunlar dönüşüm değişmezdir, yani görüntü döndürülmüş olsa bile aynı köşeleri bulabiliriz. Döndürülmüş görüntüde de köşeler köşe olarak kalır. Peki ölçekleme konusunda ne yapabiliriz? Görüntü ölçeklendirildiğinde köşe, köşe olmayabilir. Örneğin aşağıdaki basit görüntüye bakın. Küçük bir penceredeki küçük görüntüdeki bir köşe, aynı pencerede yakınlaştırıldığında düzdür. Bu nedenle Harris köşesi ölçek değişmez değildir.

2004 yılında British Columbia Üniversitesi’nden D.Lowe, anahtar noktaları çıkaran ve tanımlayıcılarını hesaplayan Distinctive Image Features from Scale-Invariant Keypoints adlı makalesinde SIFT (Scale Invariant Feature Transform) adlı yeni bir algoritma ortaya koydu.
SIFT algoritmasında dört ana adım vardır:
1. Ölçek Uzayı Aşırı Nokta Tespiti
Farklı ölçeklerdeki anahtar noktaları tespit edemeyeceğimiz açıktır. Bunun için ölçek uzayı filtrelemesi kullanılır. Görüntü için çeşitli σ değerleriyle Gauss’un Laplacian’ı hesaplanır. Yaklaşım olarak SIFT, LoG’un yaklaşımı olan iki farklı σ ile Gauss bulanıklaştırmasının farkını kullanır — Gauss Farkı (DoG). Bu işlem Gauss Piramidindeki görüntünün farklı oktavları için yapılır:

DoG bulunduktan sonra görüntüler ölçek ve uzay üzerinde yerel aşırı noktalar için aranır. Bir piksel, 8 komşusu ve 9 piksel sonraki ölçekte ve önceki ölçekteki 9 piksel ile karşılaştırılır:

2. Anahtar Nokta Konumlandırma
Potansiyel anahtar nokta konumları bulunduğunda, daha doğru sonuçlar elde etmek için rafine edilirler. Ölçek uzayının Taylor serisi açılımı kullanılır. Bu aşırı nokta yoğunluğu eşik değerinden düşükse (makalede 0.03) reddedilir. Düşük kontrastlı anahtar noktalar ve kenar anahtar noktaları elenir; kalan güçlü ilgi noktalarıdır.
3. Yönelim Atama
Görüntü döndürmesine değişmezlik elde etmek için her anahtar noktaya bir yönelim atanır. Anahtar nokta konumu etrafında ölçeğe bağlı bir komşuluk alınır ve o bölgedeki gradyan büyüklüğü ve yönü hesaplanır.
4. Anahtar Nokta Tanımlayıcısı
Anahtar nokta etrafındaki 16×16 komşuluk alınır. 4×4 boyutunda 16 alt bloğa bölünür. Her alt blok için 8 binalık yönelim histogramı oluşturulur. Böylece toplam 128 bin değeri elde edilir. Anahtar nokta tanımlayıcısı oluşturmak için bir vektör olarak temsil edilir.
5. Anahtar Nokta Eşleştirme
İki görüntü arasındaki anahtar noktalar en yakın komşuları belirlenerek eşleştirilir. En yakın mesafenin ikinci en yakın mesafeye oranı 0,8’den büyükse reddedilir. Bu, yanlış eşleşmelerin yaklaşık %90’ını ortadan kaldırır.
OpenCV’de SIFT
Artık OpenCV’deki SIFT işlevselliğini görelim. Bu özellikler önceden yalnızca opencv contrib’de mevcuttu, ancak 2020’de patent süresi doldu ve artık ana repoya dahil edildi:
import numpy as np
import cv2 as cv
img = cv.imread('home.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
sift = cv.SIFT_create()
kp = sift.detect(gray, None)
img = cv.drawKeypoints(gray, kp, img)
cv.imwrite('sift_keypoints.jpg', img)sift.detect() fonksiyonu görüntüdeki anahtar noktaları bulur. Her anahtar nokta, (x,y) koordinatları, boyutu, açısı, yanıtı gibi birçok özelliğe sahip özel bir yapıdır.
OpenCV ayrıca anahtar noktaların konumlarına küçük daireler çizen cv.drawKeyPoints() fonksiyonunu sağlar. cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS bayrağını geçerseniz anahtar noktanın boyutuyla bir daire çizer ve yönelimini de gösterir:
img = cv.drawKeypoints(gray, kp, img, flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv.imwrite('sift_keypoints.jpg', img)
Tanımlayıcıları hesaplamak için iki yöntem vardır:
- Zaten anahtar noktaları bulduysanız, sift.compute() çağrıyorsunuz:
kp, des = sift.compute(gray, kp) - Anahtar noktaları bulmadıysanız, doğrudan anahtar noktaları ve tanımlayıcıları tek adımda bulabilirsiniz: sift.detectAndCompute()
sift = cv.SIFT_create()
kp, des = sift.detectAndCompute(gray, None)Burada kp bir anahtar noktalar listesi, des ise (Anahtar Nokta Sayısı) × 128 şeklinde bir numpy dizisidir.
Hakan Çelik


