Bilateral Filter

Kategori: Computer Vision , 06 Şubat 2020 , JanFranco


Görüntüler arasındaki farkları daha iyi görebilmek için görüntüleri yeni sekmede açabilirsiniz.

OpenCV ile Python üzerinden nasıl blurring tekniklerini uygulayacağımızı görmüştük. Son iki yazımızda da Gaussian blur ve Median blur algoritmalarının detayına inmiştik. Bu yazımızda bilateral filtering algoritmasını anlatarak blurring tekniklerinin detay konularını şimdilik bitiyoruz.

Bilateral filter aslında Gaussian blurring'e oldukça benzemekte ancak ondan daha iyi sonuçlar veren (problemden probleme değişir) bir algoritmadır. Gaussian blurring gibi sadece gürültüyü gidermekle kalmaz aynı zamanda kenarları, edgeleri de korur. Gaussian blurringdeki gibi bir kernelimiz mevcut ve bu kernelin boyutunu argüman olarak veriyoruz. Kernel boyunun dışında iki parametremiz daha mevcut ancak bu parametreleri anlamak için formülleri görmemiz gerekli:

Bilateral Filter

Kernel oluşturulmada Gauss fonksiyonunun yanı sıra, mesafe ve piksel değer farkları da hesaba katılıyor. Bu hesaplamalar nedeniyle belirtmemiz gereken sigmaSpace ve sigmaColor parametreleri mevcut. Eğer formüldeki sigma r değerini artırırsak, algoritma kernel oluştururken gaussian blur tekniğinde olduğu gibi üretmeye başlar. sigma d değerini artırırsak daha fazla bulanıklık sağlamış oluruz. Bilateral filtering tekniğinin avantajlarından biri de gereksiz pikseller hesaba katılmıyor. Çünkü formülden de görüldüğü gibi iki ağırlık çarpılıyor. Eğer ağırlıklardan biri 0 olursa veya 0'a çok yaklaşırsa yani alakasız piksel ise hesaba katılmamış oluyor. Python üzerinden görmüştük. Tekrar görelim:


import cv2

img = cv2.imread('../data/rabbit.jpg')
cv2.imshow('img', img)
cv2.waitKey(0)
>>

Bilateral Filter


bilateral = cv2.bilateralFilter(img, 5, 75, 75)
cv2.imshow('bilateral', bilateral)
cv2.waitKey(0)
>>

Bilateral Filter


bilateral = cv2.bilateralFilter(img, 9, 75, 75)
cv2.imshow('bilateral', bilateral)
cv2.waitKey(0)
>>

Bilateral Filter


bilateral = cv2.bilateralFilter(img, 11, 75, 75)
cv2.imshow('bilateral', bilateral)
cv2.waitKey(0)
>>

Bilateral Filter


bilateral = cv2.bilateralFilter(img, 11, 75, 275)
cv2.imshow('bilateral - 75, 275', bilateral)
cv2.waitKey(0)
>>

Bilateral Filter


bilateral = cv2.bilateralFilter(img, 11, 275, 75)
cv2.imshow('bilateral - 275, 75', bilateral)
cv2.waitKey(0)
>>

Bilateral Filter

Görüldüğü gibi kernel boyutunu artırdıkça, daha çok pikseli hesaplamaya katarak bulanıklığı artırıyoruz. Bulanıklık artmasına rağmen kenarlar bozulmaya uğramıyor. Ayrıca kernel boyutunu sabit tutup sigmaColor değerini artırdıkça bulanıklığın daha çok arttığını görebiliyoruz. Formülde gördüğümüz gibi.


Sonraki Yazı: Face Detection with Haar Cascades
Yorumlar

Henüz bir yorum bulunmuyor.