Scale Invariant Feature Transform (SIFT)-Ölçekle Değişmeyen Özellik Dönüşümü
Bu yazımızda SIFT algoritmasından bahsedeceğiz.
Bir nesneyitahtasını belli bir açıyla döndürsek bile köşeleri yine bulabilir. Fakat ya resmi büyütürsek? O zaman da köşeleri tespit edebilir miyiz? Hayır. Bir köşeye uzaktan baktığımızda iki kenarın birbirine dik bir şekild girdiğini görebiliriz fakat o köşeye zoom yaptıkça, o köşenin bir kenar gibi olduğunu görebiliriz:
SIFT (Scale Invariant Feature Transform), bir görüntünün, aydınlatma, döndürme ve ölçeklendirmeye karşı değişmeyen bölgesel özelliklerini belirleyip tanımlayan bir algoritmadır.
Algoritmanın adımlarını inceleyelim:
1-Ölçek Alan Algılama
2- Anahtar Nokta Yerelleştirilmesi
3- Oryantasyon Belirleme
4-Anahtar Nokta Tanımlayıcıları
1- Ölçek Alan Algılama
Noktalarrı tespit etmek için aynı kareyi veya pencereyi kullanmayız. Küçük köşeler sorun yaratmaz ancak daha büyük köşeler için daha büyük karelere ihtiyacımız vardır. Bunun içinse scale-space filtering kullanırız. Ölçek alanı okunan bir görüntünün farklı ölçeklerde evrişimden üretilen bir L (x, y, σ) fonksiyonu ile bulunur.
Difference of Gaussian , iki farklı sigma ile bir görüntünün Gaussian blurring farkı olarak elde edilir, bunlara sigma ve ksigma diyelim. Bu işlem, Gaussian Piramidi’ndeki görüntünün farklı oktavları için yapılır. Aşağıdaki resimde gösterilmektedir:
2- Anahtar Nokta Yerelleştirilmesi
Anahtar noktalar bulunduktan sonra, daha doğru sonuçlar elde etmek için düzenlenmeleri gerekir . Ekstremanın daha doğru konumunu elde etmek için scale space kullanılır ve bu ekstremadaki yoğunluk bir eşik değerinden düşükse reddedilir. Bu eşik, OpenCV’de(kontrast eşiği) olarak adlandırılır. Bu adımda bu istenmeyen noktaların temizlenme işlemi yapılır.Eşik değerinden büyük olan noktalar alınmazlar. Bu eşik OpenCV de kontrast eşiği olarak adlandırılır.
3- Oryantasyon Belirleme
Artık Key Pointlerimizi ve hangi key pointin hangi ölçekte belirlendiğini de biliyoruz. Şimdi her key point için bir oryantasyon atayacağız.
Ölçeğe bağlı olarak Key Point etrafında bir alan alınır ve o bölgede gradyan büyüklüğü ve yönü hesaplanır. 360 dereceyi kapsayan 36 bölmeli bir oryantasyon histogramı oluşturulur. Histogramdaki en yüksek tepe alınır ve % 80'in üzerindeki herhangi bir tepe de oryantasyonu hesaplamak için kabul edilir. Aynı konum ve ölçekte, ancak farklı yönlere sahip key pointler oluşturur.
4-Anahtar Nokta Tanımlayıcıları
Anahtar nokta etrafında 16x16 bir alan alınır. 4x4 boyutunda 16 alt bloğa bölünmüştür. Her alt blok için 8 bölmeli oryantasyon histogramı oluşturulur. Yani toplam 128 parça değer mevcuttur. Keypoint descriptor oluşturmak için bir vektör olarak temsil edilir. Buna ek olarak, aydınlatma değişikliklerine, rotasyona vb. Karşı sağlamlık sağlamak için çeşitli önlemler alınır.
Şimdi OpenCV’de bulunan SIFT fonksiyonlarını inceleyelim.
Önvelikle gerekli kütüphaneler tanımlanır. Ardından SIFT nesnesi oluşturulur.
Sift.detect() fonksiyonu, görüntülerde keypoint bulur. OpenCV cv2.drawKeypoints(gray,None) adında bir fonksiyon sağlar ve bu , keypoint noktalarında küçük daireler çizer.
Eğer flag girmek isterseniz cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS
kullanarak keypointler boyutunda daireleri ve oryantasyonlarını görebilirsiniz.
Bu yazımızda Scale Invariant Feature Transform , SIFT algoritması üzerine konuştuk.
Referanslar: