• Local Binary Patterns Kullanarak Görüntü Tanımı

    Local Binary Patterns Kullanarak Görüntü Tanımı

    Yazarlar: Emrecan ÇELİK, Gökhan KARAAHMETOĞLU, Muzaffer Kadir YILMAZ Merhabalar, Bugün Local Binary Patterns’in (LBP) nasıl çalıştığına bakıp. Bir görüntüyü sınıflandırmaya analiz etmeye çalışacağız. LBP Nedir? LBP doku analizi operatorü, gri-seviyeden bağımsız bir doku ölçümü yöntemidir. Yerel ikili örüntüler, bilgisayar görüşünde sınıflandırma için kullanılan bir tür görsel tamamlayıcıdır. LBP görüntü analizi, doku analizi, yüz analizi ve…

Local Binary Patterns Kullanarak Görüntü Tanımı

Yazarlar: Emrecan ÇELİK, Gökhan KARAAHMETOĞLU, Muzaffer Kadir YILMAZ

Merhabalar,
Bugün Local Binary Patterns’in (LBP) nasıl çalıştığına bakıp. Bir görüntüyü sınıflandırmaya analiz etmeye çalışacağız.

LBP Nedir?

LBP doku analizi operatorü, gri-seviyeden bağımsız bir doku ölçümü yöntemidir. Yerel ikili örüntüler, bilgisayar görüşünde sınıflandırma için kullanılan bir tür görsel tamamlayıcıdır. LBP görüntü analizi, doku analizi, yüz analizi ve hareket analizi gibi alanlarda kullanılmaktadır.

LBP kullanılması oldukça kolay ve ucuz maliyetli olan bir doku operatörüdür. Her bir pikselin komşuluklarını esas almaktadır. Operatörün yaptığı iş, seçilen merkez noktanın önceden belirlenmiş yarıçap parametresine göre, yarıçap uzaklığındaki her bir komşusunun kıyasına dayanmaktadır.

LBP Operatörü Nasıl Çalışır?

Operatörün yaptığı işlemler sırasıyla:

  • Merkez piksel değeri ile tüm komşu değerleri arasındaki farkı alır.
  • Yapılan her fark işlemi için çıkan sayının değeri 0 değerinden büyükse 1, küçükse 0 olarak atama yapılır.
  • Sonrasında bu işlem ağırlık matrisi (2’nin üslerini içeren matris) ile konvolüsyon işlemine tabii tutulur.
  • Elde edilen sonuç merkez noktasının yeni değeri olur.

Yukarıdaki örnekte 1 piksel uzunluğunda olan (3×3 genişliğinde olan matris) LBP operatörü; sol üst, üst, sağ üst, sağ, sağ alt, alt, sol alt ve solundaki piksel değerlerini baz almaktadır. Merkez pikselin değeri 54’tür. Yapılan karşılaştırma sonrası (54’ten büyük değerler 1’e, küçük değerler 0’a atanmıştır) ikinci matris elde edilmiştir. Bu matris ağırlık matrisi ile çarpıldıktan sonra değerlerin her biri toplanmıştır. Toplama sonucu elde edilen değer, merkez noktanın yeni değeri olmaktadır.

Oluşturulan LBP değerlerinin tümü doku tanımlamada kullanılmaz. Tanımlamada kullanılan düzgün örüntüler, ikili LBP kodunda 0-1 yada 1-0 geçişi sayısı 2 ya da daha az olanlardır. Örneğin 0000000 ve 11111111 örüntüleri 0 geçişe, 01110000 ve 11001111 örüntüleri 2 geçişe sahip olduğundan düzgündür. Fakat 4 geçişli 11001000 ve 6 geçişli 01010011 örüntüleri düzgün değildir. Yapılan çalışmalarda düzgün örüntülerin araştırılan doku yüzeylerinde bazen %90’ın üzerinde, geniş bir çoğunluğa sahip olduğu görülmüştür.

LBP histogramı çıkarılırken düzgün örüntüler kullanıldığından, histogramda her bir düzgün örüntü için bir bölme bulunurken düzgün olmayan örüntülerin hepsi tek bir bölmede toplanmaktadır. Tüm örüntüler incelendiğinde 8 komşuluk için 256 farklı kod oluşmakta ve bunlarda sadece 58 tanesinin düzgün olduğu görülmektedir. Bunlar:

[‘00000000’, ‘00000001’, ‘00000010’, ‘00000011’, ‘00000100’, ‘00000110’, ‘00000111’, ‘00001000’, ‘00001100’, ‘00001110’, ‘00001111’, ‘00010000’, ‘00011000’, ‘00011100’, ‘00011110’, ‘00011111’, ‘00100000’, ‘00110000’, ‘00111000’, ‘00111100’, ‘00111110’, ‘00111111’, ‘01000000’, ‘01100000’, ‘01110000’, ‘01111000’, ‘01111100’, ‘01111110’, ‘01111111’, ‘10000000’, ‘10000001’, ‘10000011’, ‘10000111’, ‘10001111’, ‘10011111’, ‘10111111’, ‘11000000’, ‘11000001’, ‘11000011’, ‘11000111’, ‘11001111’, ‘11011111’, ‘11100000’, ‘11100001’, ‘11100011’, ‘11100111’, ‘11101111’, ‘11110000’, ‘11110001’, ‘11110011’, ‘11110111’, ‘11111000’, ‘11111001’, ‘11111011’, ‘11111100’, ‘11111101’, ‘11111110’, ‘11111111’]

Fotoğrafların histogramı çıkarılırken bu binary sayıların 10luk tabanda denk geldiği sayılar göz önünde bulundurulmalıdır.

LBP’yi Python ve OpenCV Kullanarak Gerçeklemek

import cv2 
import numpy as np 
from matplotlib import pyplot as plt 
   
def get_pixel(img, center, x, y): 
    new_value = 0
    try: 
        if img[x][y] >= center: 
            new_value = 1
    except: 
        pass   
    return new_value 
   
def lbp_calculated_pixel(img, x, y): 
    center = img[x][y] 
    val_ar = [] 
    # top_left 
    val_ar.append(get_pixel(img, center, x-1, y-1)) 
    # top 
    val_ar.append(get_pixel(img, center, x-1, y)) 
    # top_right 
    val_ar.append(get_pixel(img, center, x-1, y + 1)) 
    # right 
    val_ar.append(get_pixel(img, center, x, y + 1)) 
    # bottom_right 
    val_ar.append(get_pixel(img, center, x + 1, y + 1)) 
    # bottom 
    val_ar.append(get_pixel(img, center, x + 1, y)) 
    # bottom_left 
    val_ar.append(get_pixel(img, center, x + 1, y-1)) 
    # left 
    val_ar.append(get_pixel(img, center, x, y-1)) 
    power_val = [1, 2, 4, 8, 16, 32, 64, 128] 
    val = 0
    old_value = val_ar[0]
    change = 0
    for i in range(len(val_ar)): 
        if(old_value != val_ar[i]):
            old_value = val_ar[i]
            change +=1
        val += val_ar[i] * power_val[i] 
    if(change <= 2):
        return val
    return 255
   
img_bgr = cv2.imread('input/lena.jpg') 
   
height, width, _ = img_bgr.shape 
img_gray = cv2.cvtColor(img_bgr,cv2.COLOR_BGR2GRAY) 
cv2.imwrite('output/lena.jpg',img_gray)

img_lbp = np.zeros((height, width), 
                   np.uint8) 
   
for i in range(0, height): 
    for j in range(0, width): 
        img_lbp[i, j] = lbp_calculated_pixel(img_gray, i, j) 
  
plt.imshow(img_lbp, cmap ="gray") 
plt.show() 
   
print("LBP Program is finished")

LBP Oparorü uygulandıktan sonra Lena( lena <3 )

Kaynaklar:

https://www.researchgate.net/figure/Calculating-LBP-for-a-pixel_fig2_338713604

https://dergipark.org.tr/tr/download/article-file/388674

https://www.geeksforgeeks.org/create-local-binary-pattern-of-an-image-using-opencv-python/