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/
Bir yanıt yazın