Local binary pattern skimage

Les motifs binaires locaux ont été présentés en 1994 par Ojala et al. et sont construits comme suit :

Pour un pixel donné (rouge), les P pixels voisins (vert) se trouvant sur le cercle de rayon R sont sélectionnés puis soustraits au pixel central (Figure ci-dessous).



User:Xiawi - Wikimedia Commons  CC BY-SA 3.0
La fonction d’heaviside est appliquée  à cette différence. La valeur du motif binaire local est alors égale à :
    

Où g_p et g_c sont les valeurs respectives du pixel voisin et du pixel central. x_c et y_c sont les coordonnées du pixel central. P est le nombre de voisins passé en paramètre et R le rayon choisi. sigma représente la fonction d'heaviside.


User:Xiawi - Wikimedia Commons  CC BY-SA 3.0


Par exemple, sur la Figure \ref{fig:34} le pixel central vaut 123. L'algorithme commence par soustraire le pixel central à ses 8 voisins à distance de 1 dans le cas de cet exemple. Une matrice "différence" est alors créée. Cette dernière est transformée en matrice "signe" en remplaçant par 0 chaque valeur négative de la matrice "différence" et par 1 chaque valeur positive. En multipliant la matrice "poids", construite en affectant une puissance de 2 à chaque case de gauche à droite et de haut en bas, par la matrice "signe", la matrice "pondération" est produite. Le motif binaire local du pixel central est égal à la somme des éléments de la matrice "pondération".

Après calcul du motif binaire local de chaque pixel, une nouvelle image est créée, il s'agit de la transformée LBP. L'histogramme de l'image ainsi formée sera utilisé comme vecteur de caractéristiques. 



grass.jpeg

sand.jpeg

sky.jpeg

Code Skimage :

# Chargement des librairies nécessaire à l'exécution du code
from skimage.feature import local_binary_pattern
from skimage import data
import matplotlib.pyplot as plt
import numpy as np
import cv2
#Ouverture en niveau de gris des images à traiter
grass=cv2.imread ("grass.jpeg",0)
sky=cv2.imread ("sky.jpeg",0)
sand=cv2.imread ("sand.jpeg",0)
#Calcul de la transformée et de l'histogramme lbp de l'image grass
lbp_grass=local_binary_pattern(grass, 83'uniform')
n_bins = int(lbp_grass.max() + 1)
hist_lbp_grass,bins_grass=np.histogram(lbp_grass, density=True, bins=n_bins, range=(0, n_bins))
#Calcul de la transformée et de l'histogramme lbp de l'image sky
lbp_sky=local_binary_pattern(sky, 83'uniform')
n_bins = int(lbp_sky.max() + 1)
hist_lbp_sky,bins_sky=np.histogram(lbp_sky, density=True, bins=n_bins, range=(0, n_bins))
#Calcul de la transformée et de l'histogramme lbp de l'image sand
lbp_sand=local_binary_pattern(sand, 83'uniform')
n_bins = int(lbp_sand.max() + 1)
hist_lbp_sand,bins_sand=np.histogram(lbp_sand, density=True, bins=n_bins, range=(0, n_bins))

#Normalisation des tranfomées lbp des images afin de pouvoir les afficher
img_lbpgrass=cv2.normalize(np.array(lbp_grass), None0255, cv2.NORM_MINMAX, cv2.CV_8U)
img_lbpsand=cv2.normalize(np.array(lbp_sand), None0255, cv2.NORM_MINMAX, cv2.CV_8U)
img_lbpsky=cv2.normalize(np.array(lbp_sky), None0255, cv2.NORM_MINMAX, cv2.CV_8U)

#Affichage des transformées LBP
cv2.imshow("lbp grass", img_lbpgrass)
cv2.imshow("lbp sand", img_lbpsand)
cv2.imshow("lbp sky", img_lbpsky)

#Affichage des histogrammes LBP
plt.figure()
plt.hist(hist_lbp_grass)
plt.title("grass")
plt.figure()
plt.hist(hist_lbp_sky)
plt.title("sky")
plt.figure()
plt.hist(hist_lbp_sand)
plt.title("sand")
plt.show()


Résultat :



Écrivez quelque chose ...

 

.