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

EP04_01 — 🎚️ Limiarização Global por Limiar Fixo

4.9.1 EP04_01 🎚️ Limiarização Global por Limiar Fixo

Em scanners de documentos e em sistemas de leitura de código de barras, a primeira etapa do processamento é sempre separar o que é “objeto” (tinta, texto, barras) do que é “fundo” (papel, embalagem). A limiarização global faz exatamente isso: compara cada pixel a um único limiar \(T\) e decide, em tempo real, se ele pertence à classe clara ou à classe escura. É o operador de segmentação mais simples — e mesmo assim, está por trás de boa parte dos pipelines industriais de inspeção visual. Ver na Figura 4.30 uma simulação deste EP.

4.9.1.1 📋 Diretrizes de Implementação

  1. Dimensões: Ler os inteiros \(L\) (linhas) e \(C\) (colunas).
  2. Limiar: Ler o inteiro \(T\) (limiar de decisão).
  3. Dados: Ler os valores inteiros da matriz original linha a linha.
  4. Mapeamento: Para cada pixel \(p\), calcular o novo valor pela equação:

\[ p' = \begin{cases} 255, & \text{se } p > T \\ 0, & \text{se } p \le T \end{cases} \] 5. Saída: Exibir a matriz binarizada com dimensões \(L \times C\).

4.9.1.2 📌 Restrições Computacionais

  • Binarização: A saída contém apenas os valores \(0\) ou \(255\).
  • Comparação estrita: O critério usa \(> T\) (pixels iguais a \(T\) tornam-se fundo).
  • Tipo: O resultado final deve ser inteiro.
  • Observação: Este EP segue a convenção da OpenCV (cv2.THRESL_BINARY): apenas pixels com valor maior que \(T\) tornam-se brancos (255); pixels com valor igual a \(T\) permanecem pretos (0).

4.9.1.3 🧠 Fundamentação Teórica

Parâmetro Tipo Impacto Visual
\(T\) pequeno Inteiro A maioria dos pixels torna-se branca
\(T\) grande Inteiro A maioria dos pixels torna-se preta
\(T\) bem escolhido Inteiro Separa nitidamente objeto e fundo

4.9.1.4 📦 Especificação de Entrada e Saída (VPL)

Entrada:

  • Linha 1: Inteiro \(L\).
  • Linha 2: Inteiro \(C\).
  • Linha 3: Inteiro \(T\).
  • Linhas seguintes: Elementos inteiros da matriz original.

Saída:

  • Matriz binarizada em \(L\) linhas e \(C\) colunas, valores \(0\) ou \(255\) separados por espaço.

4.9.1.5 📌 Exemplos

Entrada Saída Observação
2
4
100
0 99 100 180
255 30 120 80
0 0 0 255
255 0 255 0
\(T=100\): apenas pixels com valor maior que 100 tornam-se brancos;
por isso, 99 e 100 tornam-se pretos.
1
3
0
0 50 255
0 255 255 \(T=0\): apenas pixels com valor estritamente maior que 0 tornam-se brancos.
🎚️ Simulador EP04_01: Limiarização Global p' = (p > T) ? 255 : 0

👆 Clique numa célula da Entrada Original para escurecer o píxel (−30) e clique com o botão direito para clarear (+30). Ajuste o limiar T para binarização.

128
Entrada Original (Clicável)
Resultado Binarizado (p')
Fórmula aplicada: (p > 128) ? 255 : 0
Figura 4.30: Simulador EP04_01: Limiarização Global por Limiar Fixo (p’ = (p > T) ? 255 : 0)
%%writefile EP04_01.cpp
// sua solução
Overwriting EP04_01.cpp
TestSuite("EP04_01.cpp").run()
✔️ EP04_01.cases já existe em casos/
📋 7 caso(s) carregado(s) de casos/EP04_01.cases

🔍 Testando C++: EP04_01.cpp
⚠️ EP04_01.cpp: Arquivo sem conteúdo (menos de 3 linhas). Testes ignorados.