import cv2
import numpy as np
from skimage.feature import local_binary_pattern
import matplotlib.pyplot as plt
# Paramètres LBP
radius = 1 # Distance des voisins
n_points = 8 * radius # Nombre de voisins autour du pixel central
def extract_lbp_features(image):
"""
Calcule le Local Binary Pattern (LBP) et retourne l'image LBP + l'histogramme
normalisé.
"""
lbp = local_binary_pattern(image, n_points, radius, method="uniform")
# Calcul de l'histogramme LBP
hist, _ = np.histogram(lbp.ravel(), bins=np.arange(0, n_points + 3), range=(0,
n_points + 2))
# Normalisation de l'histogramme
hist = hist.astype("float")
hist /= (hist.sum() + 1e-6) # Éviter la division par zéro
return lbp, hist
# Extraction des caractéristiques LBP pour toutes les images
lbp_images = []
lbp_histograms = []
for img in data:
lbp_img, hist = extract_lbp_features(img)
lbp_images.append(lbp_img)
lbp_histograms.append(hist)
# Conversion en numpy array
lbp_histograms = np.array(lbp_histograms)
# Affichage des images et de leurs LBP
fig, axes = plt.subplots(4, 6, figsize=(15, 10)) # 4 lignes, 6 colonnes
for i in range(len(data)):
# Image originale
axes[i // 3, (i % 3) * 2].imshow(data[i], cmap='gray')
axes[i // 3, (i % 3) * 2].set_title(f"Image {i+1} ({labels[i]})")
axes[i // 3, (i % 3) * 2].axis("off")
# Image LBP
axes[i // 3, (i % 3) * 2 + 1].imshow(lbp_images[i], cmap='gray')
axes[i // 3, (i % 3) * 2 + 1].set_title(f"LBP {i+1}")
axes[i // 3, (i % 3) * 2 + 1].axis("off")
plt.tight_layout()
plt.show()
# Affichage des histogrammes LBP
fig, axes = plt.subplots(3, 4, figsize=(12, 9)) # 3 lignes, 4 colonnes
for i in range(len(data)):
axes[i // 4, i % 4].bar(range(len(lbp_histograms[i])), lbp_histograms[i])
axes[i // 4, i % 4].set_title(f"Histogramme {i+1}")
axes[i // 4, i % 4].set_xlabel("Valeurs LBP")
axes[i // 4, i % 4].set_ylabel("Fréquence")
plt.tight_layout()
plt.show()