7.18.4 EP07_04 🟠 Codificação Manual do Descritor LBP
A função local_binary_pattern do scikit-image, utilizada no projeto de classificação de texturas, calcula automaticamente o código LBP de cada pixel de uma imagem. Antes de utilizá-la como uma caixa-preta, você foi encarregado de implementar manualmente o cálculo do código LBP clássico (\(P=8\), \(R=1\)) para o pixel central de uma vizinhança \(3\times3\), exatamente como definido na equação do capítulo.
Além do código, o sistema de inspeção de texturas também precisa saber se aquele padrão é uniforme — um padrão é uniforme quando o número de transições (\(0\to1\) ou \(1\to0\)) ao percorrer os 8 bits circularmente (voltando do último bit ao primeiro) é no máximo 2, propriedade explorada pela variante uniforme do LBP mencionada no capítulo.
7.18.4.1 📋 Diretrizes de Implementação
- Quantidade: Ler o inteiro \(T\) (número de vizinhanças a processar).
- Dados de cada vizinhança: Para cada uma das \(T\) vizinhanças, ler uma matriz \(3\times3\) de inteiros (intensidades), fornecida em 3 linhas de 3 valores cada. O pixel central é a posição
[1][1]. - Ordem dos vizinhos: Percorra os 8 vizinhos em sentido horário, iniciando no canto superior esquerdo, na seguinte ordem de posições
[linha][coluna]:[0][0],[0][1],[0][2],[1][2],[2][2],[2][1],[2][0],[1][0]. Esse é o índice \(p = 0, 1, \ldots, 7\) da equação do LBP. - Função limiar: Para cada vizinho \(p\) com intensidade \(g_p\) e centro \(g_c\), calcule \(s(g_p - g_c)\), que vale
1se \(g_p \geq g_c\) e0caso contrário. - Código LBP: Calcule \[ \mathrm{LBP} = \sum_{p=0}^{7} s(g_p - g_c)\, 2^p. \]
- Transições: Considerando a sequência circular de bits \(s_0, s_1, \ldots, s_7\) (na ordem do item 3), conte quantos pares consecutivos adjacentes na sequência circular (incluindo o par \(s_7, s_0\)) diferem entre si.
- Classificação: Se o número de transições for \(\le 2\), classifique como
UNIFORME; caso contrário,NAO_UNIFORME. - Saída: Para cada vizinhança, na ordem de entrada, imprimir o código LBP (inteiro decimal, \(0\)–\(255\)), o número de transições e a classificação.
7.18.4.2 📌 Restrições Computacionais
- Ordem fixa dos vizinhos: a ordem do item 3 é obrigatória — invertê-la produz um código numericamente diferente, mesmo representando o mesmo padrão visual.
- Comparação não estrita: \(s(z) = 1\) quando \(z \ge 0\) (o próprio capítulo define a igualdade como incluída no caso
1). - Contagem circular: não esqueça o par que fecha o ciclo (\(s_7\) com \(s_0\)); ignorar esse par é um erro comum que classifica incorretamente padrões uniformes.
7.18.4.3 🧠 Fundamentação Teórica
| Padrão (bits \(s_0\ldots s_7\)) | Transições | Interpretação |
|---|---|---|
00000000 ou 11111111 |
0 | Região homogênea (mancha clara ou escura) |
00001111 |
2 | Borda simples entre duas regiões |
01010101 |
8 | Textura de contraste alternado — não uniforme |
Padrões uniformes concentram-se em regiões de textura suave ou bordas simples; padrões não uniformes tendem a corresponder a ruído de alta frequência. Por isso, o histograma LBP uniforme, usado no projeto de classificação de texturas, agrupa todos os padrões não uniformes em um único compartimento, reduzindo a dimensionalidade do descritor.
7.18.4.4 📦 Especificação de Entrada e Saída (VPL)
Entrada:
- Linha 1: Inteiro \(T\).
- Para cada vizinhança: 3 linhas com 3 inteiros cada (matriz \(3\times3\)).
Saída:
- \(T\) linhas, no formato
LBP=<int> transicoes=<int> <UNIFORME|NAO_UNIFORME>.
7.18.4.5 📌 Exemplos
| Entrada | Saída | Observação |
|---|---|---|
| 1 10 10 10 10 50 10 10 10 10 |
LBP=0 transicoes=0 UNIFORME | Centro é o mais claro; todos os vizinhos geram bit 0. |
| 1 90 90 90 10 50 10 90 90 90 |
LBP=119 transicoes=4 NAO_UNIFORME | Vizinhos claros e escuros alternados na vizinhança. |
%%writefile EP07_04.py
# Código PythonWriting EP07_04.py
TestSuite("EP07_04.py").run()✔️ EP07_04.cases já existe em casos/
📋 5 caso(s) carregado(s) de casos/EP07_04.cases
🔍 Testando Python: EP07_04.py
⚠️ EP07_04.py: Arquivo sem conteúdo (menos de 3 linhas). Testes ignorados.