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

EP04_02 — 📊 Limiarização Automática de Otsu

4.9.2 EP04_02 📊 Limiarização Automática de Otsu

Escolher manualmente o limiar \(T\) funciona quando a iluminação é estável, mas em microscopia digital e em inspeção de lâminas de sangue, cada amostra tem um contraste diferente — um limiar fixo falharia de imagem para imagem. O método de Otsu resolve isso encontrando, sozinho, o limiar que maximiza a separação estatística entre as duas classes de pixels, tornando a segmentação automática e adaptativa. Ver na Figura 4.31 uma simulação deste EP.

4.9.2.1 📋 Diretrizes de Implementação

  1. Dimensões: Ler os inteiros \(L\) (linhas) e \(C\) (colunas).

  2. Dados: Ler os valores inteiros da matriz original linha a linha.

  3. Histograma: Construir o histograma \(h[i]\), \(i=0,\dots,255\), contando quantos pixels têm valor \(i\).

  4. Busca do limiar: Para cada candidato \(T\) de \(1\) a \(255\), calcular a variância entre classes: \[ \sigma_B^2(T) = \frac{n_0 \cdot n_1}{N^2}\,(m_0 - m_1)^2 \] onde \(n_0,n_1\) são as quantidades de pixels com valor \(<T\) e \(\geq T\), \(m_0,m_1\) são suas médias, e \(N=L\times C\).

  5. Escolha: O limiar ótimo \(T^*\) é o que maximiza \(\sigma_B^2(T)\) (em caso de empate, manter o primeiro encontrado).

  6. Aplicação: Binarizar a imagem usando T*, aplicando: \[ p' = \begin{cases} 255, & \text{se } p > T^* \\ 0, & \text{se } p \le T^* \end{cases} \]

4.9.2.2 📌 Restrições Computacionais

  • Candidatos válidos: Ignorar \(T\) que deixe \(n_0=0\) ou \(n_1=0\) (classe vazia).
  • Empate: Sempre manter o primeiro \(T\) que atingiu o valor máximo de \(\sigma_B^2\).
  • Tipo: \(T^*\) e a matriz de saída devem ser inteiros.
  • Convenção OpenCV: A binarização segue cv2.THRESL_BINARY; pixels com valor exatamente igual a \(T^*\) tornam-se pretos.

4.9.2.3 🧠 Fundamentação Teórica

Conceito Significado Impacto
\(\sigma_B^2(T)\) alta Classes bem separadas em \(T\) \(T\) é um bom candidato a limiar
Histograma bimodal Dois “morros” distintos Otsu encontra o vale entre eles
Histograma unimodal Um único “morro” Otsu ainda escolhe algum \(T\), mas a segmentação é pouco confiável

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

Entrada:

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

Saída:

  • Matriz binarizada em \(L\) linhas e \(C\) colunas, valores \(0\) ou \(255\).

4.9.2.5 📌 Exemplos

Entrada Saída Observação
4
4
12 12 12 200
12 12 200 200
12 200 200 200
200 200 200 200
0 0 0 255
0 0 255 255
0 255 255 255
255 255 255 255
Histograma bimodal claro: 12 e 200
1
2
10 250
0 250 Apenas dois valores: \(T^*\) fica no maior
📊 Simulador EP04_02: Otsu Automático T* = argmax σ²_B(T)

👆 Clique esquerdo escurece (−25) e clique com o botão direito clareia (+25) os pixels da entrada. Observe o limiar ótimo T* ajustar-se dinamicamente ao histograma.

T* = −

Entrada Original (Clicável)
Resultado Otsu (p')
Figura 4.31: Simulador EP04_02: Limiarização Automática de Otsu (T* = argmax σ²_B(T))
%%writefile EP04_02.cpp
// sua solução
Overwriting EP04_02.cpp
TestSuite("EP04_02.cpp").run()
✔️ EP04_02.cases já existe em casos/
📋 5 caso(s) carregado(s) de casos/EP04_02.cases

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