Ajusta B y observa cómo la matriz de orientaciones (independiente de la de magnitudes) se mapea
a los compartimentos mediante bin = floor(θ / (180/B)), y cómo las magnitudes se suman en cada bin.
bin = floor(θ / ancho)La función hog de scikit-image, empleada en el proyecto de clasificación de dígitos, divide la imagen en pequeñas células y, para cada una, construye un histograma de las orientaciones del gradiente ponderado por la magnitud — exactamente la etapa central descrita en la sección sobre el descriptor HOG del capítulo.
Se te ha encargado implementar este cálculo para una única célula, a partir de los valores de magnitud y orientación del gradiente ya calculados para cada píxel de la célula (prescindiendo del cálculo de las derivadas parciales).
Antes de este EP, cada píxel \((x,y)\) de la imagen pasa por:
\[ G_x = f(x+1,y)-f(x-1,y), \qquad G_y = f(x,y+1)-f(x,y-1) \]
\[ |\nabla f| = \sqrt{G_x^2+G_y^2}, \qquad \theta_{\text{signado}} = \operatorname{atan2}(G_y,G_x) \]
Como HOG ignora la polaridad del contraste, el ángulo se pliega al intervalo no signado:
\[ \theta = \theta_{\text{signado}} \bmod 180° \]
Repitiendo esto para todos los píxeles de una célula \(n\times n\), se obtienen las dos matrices de entrada de este ejercicio: magnitudes \(|\nabla f|\) y orientaciones \(\theta \in [0°,180°)\).
| Etapa | Papel |
|---|---|
| Magnitud del gradiente | Pondera la contribución de cada píxel — los bordes fuertes pesan más que el ruido débil |
| Orientación no signada | Hace que el descriptor sea invariante a la polaridad del contraste (claro→oscuro vs. oscuro→claro) |
| Histograma por célula | Resume la distribución local de bordes en un vector compacto |
| Normalización L2 | Reduce la sensibilidad del descriptor a variaciones globales de iluminación y contraste |
La concatenación de los histogramas normalizados de todas las células de la imagen — no implementada en este ejercicio — forma el vector de características HOG completo, utilizado como entrada del clasificador k-NN en el proyecto del capítulo.
Entrada:
Salida:
| Entrada | Salida | Observación |
|---|---|---|
| 2 2 1.0 2.0 3.0 4.0 10 100 170 20 |
5.00 5.00 0.7071 0.7071 |
Bin de ancho 90°: \([0,90)\) y \([90,180)\); magnitudes 1 y 4 caen en el bin 0, 2 y 3 en el bin 1. |
| 2 4 0.0 0.0 0.0 0.0 0 0 0 0 |
0.00 0.00 0.00 0.00 0.0000 0.0000 0.0000 0.0000 |
Célula homogénea: \(\epsilon\) evita división por cero. |
Ajusta B y observa cómo la matriz de orientaciones (independiente de la de magnitudes) se mapea
a los compartimentos mediante bin = floor(θ / (180/B)), y cómo las magnitudes se suman en cada bin.
bin = floor(θ / ancho)%%writefile EP07_05.py
# Código PythonOverwriting EP07_05.py
TestSuite("EP07_05.py").run()✔️ EP07_05.cases ya existe en casos/
📋 5 caso(s) cargado(s) de casos/EP07_05.cases
🔍 Probando Python: EP07_05.py
⚠️ EP07_05.py: archivo vacío (menos de 3 líneas). Pruebas omitidas.