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
- Cantidad: Leer el entero \(T\) (número de vecindades a procesar).
- 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]. - 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. - Función umbral: Para cada vecino \(p\) con intensidad \(g_p\) y centro \(g_c\), calcule \(s(g_p - g_c)\), que vale
1si \(g_p \geq g_c\) y0en caso contrario. - Código LBP: Calcule \[ \mathrm{LBP} = \sum_{p=0}^{7} s(g_p - g_c)\, 2^p. \]
- 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í.
- Clasificación: Si el número de transiciones es \(\le 2\), clasifique como
UNIFORME; en caso contrario,NAO_UNIFORME. - 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. |
%%writefile EP07_04.py
# Código PythonOverwriting 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.