PDI+VC · Ejercicio de Programación

EP07_04 — 🟠 Codificación Manual del Descriptor LBP

7.18.4 EP07_04 🟠 Codificación Manual del Descriptor LBP

La función local_binary_pattern de scikit-image, utilizada en el proyecto de clasificación de texturas, calcula automáticamente el código LBP de cada píxel de una imagen. Antes de utilizarla como una caja negra, se le ha encargado implementar manualmente el cálculo del código LBP clásico (\(P=8\), \(R=1\)) para el píxel central de una vecindad \(3\times3\), exactamente como se define en la ecuación del capítulo.

Además del código, el sistema de inspección de texturas también necesita saber si ese patrón es uniforme — un patrón es uniforme cuando el número de transiciones (\(0\to1\) o \(1\to0\)) al recorrer los 8 bits circularmente (volviendo del último bit al primero) es como máximo 2, propiedad explorada por la variante uniforme del LBP mencionada en el capítulo.

7.18.4.1 📋 Directrices de Implementación

  1. Cantidad: Leer el entero \(T\) (número de vecindades a procesar).
  2. Datos de cada vecindad: Para cada una de las \(T\) vecindades, leer una matriz \(3\times3\) de enteros (intensidades), proporcionada en 3 líneas de 3 valores cada una. El píxel central es la posición [1][1].
  3. Orden de los vecinos: Recorra los 8 vecinos en sentido horario, comenzando en la esquina superior izquierda, en el siguiente orden de posiciones [fila][columna]: [0][0], [0][1], [0][2], [1][2], [2][2], [2][1], [2][0], [1][0]. Este es el índice \(p = 0, 1, \ldots, 7\) de la ecuación del LBP.
  4. Función umbral: Para cada vecino \(p\) con intensidad \(g_p\) y centro \(g_c\), calcule \(s(g_p - g_c)\), que vale 1 si \(g_p \geq g_c\) y 0 en caso contrario.
  5. Código LBP: Calcule \[ \mathrm{LBP} = \sum_{p=0}^{7} s(g_p - g_c)\, 2^p. \]
  6. Transiciones: Considerando la secuencia circular de bits \(s_0, s_1, \ldots, s_7\) (en el orden del punto 3), cuente cuántos pares consecutivos adyacentes en la secuencia circular (incluyendo el par \(s_7, s_0\)) difieren entre sí.
  7. Clasificación: Si el número de transiciones es \(\le 2\), clasifique como UNIFORME; en caso contrario, NAO_UNIFORME.
  8. Salida: Para cada vecindad, en el orden de entrada, imprimir el código LBP (entero decimal, \(0\)–\(255\)), el número de transiciones y la clasificación.

7.18.4.2 📌 Restricciones Computacionales

  • Orden fija de los vecinos: el orden del punto 3 es obligatorio — invertirlo produce un código numéricamente diferente, incluso representando el mismo patrón visual.
  • Comparación no estricta: \(s(z) = 1\) cuando \(z \ge 0\) (el propio capítulo define la igualdad como incluida en el caso 1).
  • Conteo circular: no olvide el par que cierra el ciclo (\(s_7\) con \(s_0\)); ignorar ese par es un error común que clasifica incorrectamente patrones uniformes.

7.18.4.3 🧠 Fundamentación Teórica

Patrón (bits \(s_0\ldots s_7\)) Transiciones Interpretación
00000000 o 11111111 0 Región homogénea (mancha clara u oscura)
00001111 2 Borde simple entre dos regiones
01010101 8 Textura de contraste alternado — no uniforme

Los patrones uniformes se concentran en regiones de textura suave o bordes simples; los patrones no uniformes tienden a corresponder a ruido de alta frecuencia. Por eso, el histograma LBP uniforme, usado en el proyecto de clasificación de texturas, agrupa todos los patrones no uniformes en un único compartimento, reduciendo la dimensionalidad del descriptor.

7.18.4.4 📦 Especificación de Entrada y Salida (VPL)

Entrada:

  • Línea 1: Entero \(T\).
  • Para cada vecindad: 3 líneas con 3 enteros cada una (matriz \(3\times3\)).

Salida:

  • \(T\) líneas, en el formato LBP=<int> transicoes=<int> <UNIFORME|NAO_UNIFORME>.

7.18.4.5 📌 Ejemplos

Entrada Salida Observación
1
10 10 10
10 50 10
10 10 10
LBP=0 transicoes=0 UNIFORME El centro es el más claro; todos los vecinos generan bit 0.
1
90 90 90
10 50 10
90 90 90
LBP=119 transicoes=4 NAO_UNIFORME Vecinos claros y oscuros alternados en la vecindad.
🎮 Simulador EP07_04: Código LBP de una Vecindad 3×3 P = 8, R = 1
Haz clic en una celda de la vecindad para alternar entre claro y oscuro (el centro es fijo) y observa el código LBP resultante. La etiqueta p indica el índice de la ecuación.
–
Figura 7.24: Simulador EP07_04: Código LBP de una Vecindad 3×3
%%writefile EP07_04.py
# Código Python
Overwriting EP07_04.py
TestSuite("EP07_04.py").run()
✔️ EP07_04.cases ya existe en casos/
📋 5 caso(s) cargado(s) de casos/EP07_04.cases

🔍 Probando Python: EP07_04.py
⚠️ EP07_04.py: archivo vacío (menos de 3 líneas). Pruebas omitidas.