PDI+VC · Exercício de Programação

EP07_04 — 🟠 Codificação Manual do Descritor LBP

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

  1. Quantidade: Ler o inteiro \(T\) (número de vizinhanças a processar).
  2. 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].
  3. 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.
  4. Função limiar: Para cada vizinho \(p\) com intensidade \(g_p\) e centro \(g_c\), calcule \(s(g_p - g_c)\), que vale 1 se \(g_p \geq g_c\) e 0 caso contrário.
  5. Código LBP: Calcule \[ \mathrm{LBP} = \sum_{p=0}^{7} s(g_p - g_c)\, 2^p. \]
  6. 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.
  7. Classificação: Se o número de transições for \(\le 2\), classifique como UNIFORME; caso contrário, NAO_UNIFORME.
  8. 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.
🎮 Simulador EP07_04: Código LBP de uma Vizinhança 3×3 P = 8, R = 1
Clique em uma célula da vizinhança para alternar entre claro e escuro (o centro é fixo) e observe o código LBP resultante. O rótulo p indica o índice da equação.
–
Figura 7.24: Simulador EP07_04: Código LBP de uma Vizinhança 3×3
%%writefile EP07_04.py
# Código Python
Writing 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.