Ajuste B e acompanhe como a matriz de orientações (independente da de magnitudes) é mapeada
para os compartimentos via bin = floor(θ / (180/B)), e como as magnitudes são somadas em cada bin.
bin = floor(θ / largura)A função hog do scikit-image, empregada no projeto de classificação de dígitos, divide a imagem em pequenas células e, para cada uma, constrói um histograma das orientações do gradiente ponderado pela magnitude — exatamente a etapa central descrita na seção sobre o descritor HOG do capítulo.
Você foi encarregado de implementar esse cálculo para uma única célula, a partir dos valores de magnitude e orientação do gradiente já calculados para cada pixel da célula (dispensando o cálculo das derivadas parciais).
Antes deste EP, cada pixel \((x,y)\) da imagem passa 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{sinal}} = \operatorname{atan2}(G_y,G_x) \]
Como o HOG ignora a polaridade do contraste, o ângulo é dobrado para o intervalo não sinalizado:
\[ \theta = \theta_{\text{sinal}} \bmod 180° \]
Repetindo isso para todos os pixels de uma célula \(n\times n\), obtêm-se as duas matrizes de entrada deste exercício: magnitudes \(|\nabla f|\) e orientações \(\theta \in [0°,180°)\).
| Etapa | Papel |
|---|---|
| Magnitude do gradiente | Pondera a contribuição de cada pixel — bordas fortes pesam mais que ruído fraco |
| Orientação não sinalizada | Torna o descritor invariante à polaridade do contraste (claro→escuro vs. escuro→claro) |
| Histograma por célula | Resume a distribuição local de bordas em um vetor compacto |
| Normalização L2 | Reduz a sensibilidade do descritor a variações globais de iluminação e contraste |
A concatenação dos histogramas normalizados de todas as células da imagem — não implementada neste exercício — forma o vetor de características HOG completo, utilizado como entrada do classificador k-NN no projeto do capítulo.
Entrada:
Saída:
| Entrada | Saída | Observação |
|---|---|---|
| 2 2 1.0 2.0 3.0 4.0 10 100 170 20 |
5.00 5.00 0.7071 0.7071 |
Bin de largura 90°: \([0,90)\) e \([90,180)\); magnitudes 1 e 4 caem no bin 0, 2 e 3 no 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 divisão por zero. |
Ajuste B e acompanhe como a matriz de orientações (independente da de magnitudes) é mapeada
para os compartimentos via bin = floor(θ / (180/B)), e como as magnitudes são somadas em cada bin.
bin = floor(θ / largura)%%writefile EP07_05.py
# Código PythonWriting EP07_05.py
TestSuite("EP07_05.py").run()✔️ EP07_05.cases já existe em casos/
📋 5 caso(s) carregado(s) de casos/EP07_05.cases
🔍 Testando Python: EP07_05.py
⚠️ EP07_05.py: Arquivo sem conteúdo (menos de 3 linhas). Testes ignorados.