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

EP06_06 — 🔴 Mapa de Variância Local para Detecção de Textura

6.14.6 EP06_06 🔴 Mapa de Variância Local para Detecção de Textura

Uma fábrica de tecidos precisa inspecionar rolos de pano em tempo real, sem dispor de uma imagem de referência — cada rolo apresenta pequenas variações naturais. Nessa situação, a estratégia apresentada no capítulo consiste em analisar a homogeneidade local da textura: regiões uniformes apresentam baixa variância de intensidade em pequenas vizinhanças, enquanto riscos, manchas e falhas de fabricação produzem aumentos locais dessa variância.

Neste exercício, você implementará o núcleo desse método, calculando a variância local em uma janela deslizante e gerando uma máscara binária que identifica as regiões cuja variância excede um limiar.

6.14.6.1 📋 Diretrizes de Implementação

  1. Dimensões e parâmetros: Ler os inteiros \(L\), \(C\), \(k\) (tamanho da janela, sempre ímpar) e \(T\) (limiar de variância).

  2. Imagem: Ler os \(L \times C\) valores inteiros da matriz de textura (intensidades entre 0 e 255).

  3. Tratamento das bordas: Quando a janela ultrapassar os limites da imagem, utilizar replicação de borda, isto é, repetir o valor do pixel válido mais próximo.

  4. Média local: Para cada posição \((i,j)\), calcular \[ \mu(i,j)= \frac{1}{k^2} \sum_{(p,q)\in\text{janela}} \text{textura}(p,q). \]

  5. Variância local: Calcular a variância populacional da janela, \[ \sigma^2(i,j)= \frac{1}{k^2} \sum_{(p,q)\in\text{janela}} \left(\text{textura}(p,q)-\mu(i,j)\right)^2, \] ou, de forma equivalente, \[ \sigma^2(i,j)=\overline{x^2}-\mu(i,j)^2, \] em que \(\overline{x^2}\) representa a média dos quadrados das intensidades.

  6. Arredondamento: Arredondar a variância para o inteiro mais próximo (round half away from zero, com np.floor(res_norm + 0.5)).

  7. Limiarização: Definir \(\text{máscara}(i,j)=1\) se a variância arredondada for estritamente maior que \(T\); caso contrário, definir \(\text{máscara}(i,j)=0\).

  8. Saída: Imprimir a máscara binária resultante.

6.14.6.2 📌 Restrições Computacionais

  • Replicação de borda: utilizar o valor do pixel válido mais próximo sempre que a janela ultrapassar os limites da imagem.
  • Variância populacional: utilizar denominador \(k^2\), nunca \(k^2-1\).
  • Comparação estrita: a máscara deve ser calculada utilizando a condição \(\sigma^2_{\text{arred}}>T\).
  • Janela ímpar: o valor de \(k\) é sempre ímpar, garantindo um pixel central.

6.14.6.3 🧠 Fundamentação Teórica

Situação Variância local Interpretação
Região uniforme Baixa Intensidades semelhantes na vizinhança.
Região contendo defeito Alta A presença de intensidades distintas aumenta a dispersão dos valores.
Janela pequena Maior sensibilidade a detalhes e ruído Detecta alterações localizadas.
Janela grande Resposta mais suave Evidencia defeitos maiores, porém reduz a precisão de sua localização.

A variância local mede a dispersão das intensidades em uma vizinhança. Regiões homogêneas apresentam baixa variância, enquanto alterações na textura aumentam essa medida, permitindo identificar possíveis defeitos por meio de uma simples limiarização.

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

Entrada:

  • Linha 1: Inteiro \(L\).
  • Linha 2: Inteiro \(C\).
  • Linha 3: Inteiro \(k\) (ímpar).
  • Linha 4: Inteiro \(T\).
  • Próximas \(L\) linhas: elementos inteiros da matriz de textura.

Saída:

  • Máscara binária (valores 0 ou 1), com \(L\) linhas e \(C\) colunas.

6.14.6.5 📌 Exemplos

Entrada Saída Observação
3
3
3
50
10 10 10
10 10 10
10 90 10
0 0 0
1 1 1
1 1 1
O defeito aumenta a variância em todas as janelas que o contêm.
2
2
3
5
100 100
100 100
0 0
0 0
A textura é uniforme; a variância é nula em toda a imagem.
🎮 Simulador EP06_06: Variância Local (Detecção de Textura) σ² = média(x²) − média(x)²
Ajuste o valor do defeito e o limiar T; observe como a janela 3×3 espalha a detecção pela vizinhança.
Textura (3×3)
Máscara de Defeito
–
Figura 6.26: Simulador EP06_06: Mapa de Variância Local para Detecção de Textura
%%writefile EP06_06.py
# Código Python
Writing EP06_06.py
TestSuite("EP06_06.py").run()
✔️ EP06_06.cases já existe em casos/
📋 5 caso(s) carregado(s) de casos/EP06_06.cases

🔍 Testando Python: EP06_06.py
⚠️ EP06_06.py: Arquivo sem conteúdo (menos de 3 linhas). Testes ignorados.