· Hakan Çelik · OpenCV / Özellik Tespiti · 3 dk okuma

SIFT'e Giriş (Ölçek Değişmez Özellik Dönüşümü)

SIFT algoritmasının kavramlarını öğrenin. Ölçek uzayı aşırı nokta tespiti, anahtar nokta konumlandırma, yönelim atama ve SIFT anahtar noktalarını OpenCV ile bulmayı anlattım.
OpenCV Serisi 36/64
  1. 1. Boya Fırçası Olarak Fare
  2. 2. Canny Kenar Algılama
  3. 3. Görüntü Geçişleri
  4. 4. Görüntü Piramitleri
  5. 5. Görüntülerde Aritmetik İşlemler
  6. 6. Görüntülerle İlgili Temel İşlemler
  7. 7. Görüntünün Geometrik Dönüşümleri
  8. 8. Görüntüyü Yumuşatma - ( Smoothing Images )
  9. 9. Histogramlar
  10. 10. Konturler ( Contours )
  11. 11. Morfolojik Dönüşümler
  12. 12. Opencv Nedir Ve Kurulumu
  13. 13. Opencv Resim Işlemleri
  14. 14. Opencv Video Işlemleri
  15. 15. Opencv'de Çizim Fonksiyonları
  16. 16. Performans Ölçüm Ve Geliştirme Teknikleri
  17. 17. Renk Alanlarını Değiştirme
  18. 18. Renk Paleti Olarak Parça Çubuğu ( Trackbar )
  19. 19. Resim Eşikleme
  20. 20. Şablon Eşleştirme
  21. 21. Hough Doğru Dönüşümü
  22. 22. Hough Daire Dönüşümü
  23. 23. Fourier Dönüşümü
  24. 24. Histogram Eşitleme
  25. 25. 2B Histogramlar
  26. 26. Histogram Geri Projeksiyonu
  27. 27. Kontur Özellikleri
  28. 28. Kontur Nitelikleri
  29. 29. Konturlerle Daha Fazla İşlev
  30. 30. Kontur Hiyerarşisi
  31. 31. GrabCut ile Etkileşimli Ön Plan Çıkarma
  32. 32. Watershed Algoritması ile Görüntü Segmentasyonu
  33. 33. Özellikleri Anlamak
  34. 34. Harris Köşe Tespiti
  35. 35. Shi-Tomasi Köşe Dedektörü ve İzlenecek İyi Özellikler
  36. 36. SIFT'e Giriş (Ölçek Değişmez Özellik Dönüşümü)
  37. 37. SURF'e Giriş (Hızlandırılmış Sağlam Özellikler)
  38. 38. Köşe Tespiti için FAST Algoritması
  39. 39. BRIEF — İkili Sağlam Bağımsız Temel Özellikler
  40. 40. ORB (Yönlü FAST ve Döndürülmüş BRIEF)
  41. 41. Özellik Eşleştirme
  42. 42. Özellik Eşleştirme + Nesneleri Bulmak için Homografi
  43. 43. Meanshift ve Camshift ile Nesne Takibi
  44. 44. Optik Akış
  45. 45. Arka Plan Çıkarma
  46. 46. Kamera Kalibrasyonu
  47. 47. Poz Tahmini
  48. 48. Epipolar Geometri
  49. 49. Stereo Görüntülerden Derinlik Haritası
  50. 50. k-En Yakın Komşuyu Anlamak
  51. 51. kNN ile El Yazısı OCR
  52. 52. SVM'yi Anlamak
  53. 53. SVM ile El Yazısı OCR
  54. 54. K-Ortalamalar Kümeleme'yi Anlamak
  55. 55. OpenCV'de K-Ortalamalar Kümeleme
  56. 56. Görüntü Gürültü Giderme
  57. 57. Görüntü Onarımı (Inpainting)
  58. 58. Yüksek Dinamik Aralık (HDR) Görüntüleme
  59. 59. Haar Cascade ile Yüz Tespiti
  60. 60. pip ile OpenCV Kurulumu
  61. 61. Ubuntu'da OpenCV-Python Kurulumu
  62. 62. Fedora'da OpenCV-Python Kurulumu
  63. 63. Windows'ta OpenCV-Python Kurulumu
  64. 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.

SIFT ölçek değişmezliği

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:

SIFT DoG

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:

SIFT yerel aşırı noktalar

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)

SIFT anahtar noktaları

Tanımlayıcıları hesaplamak için iki yöntem vardır:

  1. Zaten anahtar noktaları bulduysanız, sift.compute() çağrıyorsunuz: kp, des = sift.compute(gray, kp)
  2. 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.


Kaynak: OpenCV Python Tutorials — Orijinal Döküman

Back to Blog

Related Posts

View All Posts »
OpenCV-Python Bağlayıcıları Nasıl Çalışır?

OpenCV-Python Bağlayıcıları Nasıl Çalışır?

OpenCV · 3 dk

OpenCV-Python bağlayıcılarının nasıl oluşturulduğunu öğrenin. C++ modüllerinin Python'a nasıl aktarıldığını, CV_EXPORTS_W, CV_WRAP gibi makroları ve gen2.py üreteci ile hdr_parser.py başlık ayrıştırıcısını anlattım.

Haar Cascade ile Yüz Tespiti

Haar Cascade ile Yüz Tespiti

OpenCV · 3 dk

OpenCV'de Haar Cascade sınıflandırıcılarını kullanarak yüz ve göz tespiti yapın. cv.CascadeClassifier ile gerçek zamanlı nesne tespitinin temellerini anlattım.

Görüntü Onarımı (Inpainting)

Görüntü Onarımı (Inpainting)

OpenCV · 2 dk

Eski fotoğraflardaki hasarları, çizikleri ve lekeleri OpenCV'nin cv.inpaint() fonksiyonu ile nasıl onaracağınızı öğrenin. Telea ve Navier-Stokes algoritmalarını anlattım.