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

EP04_09 — 🗺️ Transformada de Distância e o “Miolo” do Objeto

4.9.9 EP04_09 🗺️ Transformada de Distância e o “Miolo” do Objeto

Em robótica móvel, ao planejar uma rota dentro de um corredor, o robô quer saber não apenas onde existe espaço livre, mas também quão longe cada ponto livre está da parede mais próxima. Os caminhos mais seguros tendem a passar pelo “miolo” do corredor, longe dos obstáculos.

A transformada de distância morfológica atribui a cada pixel um valor que representa sua distância até a borda mais próxima, segundo a métrica definida pelo elemento estruturante. Pixels próximos à borda recebem valores baixos, enquanto pixels mais internos recebem valores maiores. O pixel de valor máximo corresponde à região mais protegida do objeto, frequentemente associada ao seu centro morfológico.

Ver na Figura 4.38 uma simulação deste EP.

4.9.9.1 📋 Diretrizes de Implementação

  1. Dimensões da imagem: ler os inteiros \(L\) (linhas) e \(C\) (colunas) da imagem \(f\).
  2. Dimensões de \(B\): ler os inteiros \(L_B\) (linhas) e \(C_B\) (colunas) do elemento estruturante.
  3. Elemento estruturante: ler a matriz \(b\), contendo valor \(0\) no centro e valores negativos nas demais posições.
  4. Imagem: ler a matriz binária \(f\) (valores \(0\) ou \(1\)), linha a linha.
  5. Preparação: multiplicar a imagem por \(L\times C\), garantindo que os pixels internos tenham valor inicial suficientemente alto para a propagação das distâncias.
  6. Transformada de distância: calcular a matriz de distâncias utilizando o método mm.dist1(f,b).
  7. Saída: exibir a matriz resultante da transformada de distância.

4.9.9.2 📌 Restrições Computacionais

  • Utilizar a implementação de erosão ponderada fornecida pela biblioteca.
  • O elemento estruturante pode conter valores negativos arbitrários.
  • A transformada deve ser obtida pela aplicação iterativa de erosões ponderadas até atingir um ponto fixo.

⚠️ Nota Crucial sobre Leitura de Matrizes: Como o elemento estruturante pode conter valores inteiros negativos (por exemplo, -1 e -99), não utilize a função mm.readImg para ler a matriz \(b\). Essa função converte os dados para o tipo uint8, provocando underflow e corrompendo os valores negativos. Leia as \(L_B\) linhas de \(b\) manualmente utilizando o tipo padrão int. A imagem \(f\) pode continuar sendo lida normalmente por mm.readImg.

4.9.9.3 🧠 Fundamentação Teórica

Conceito Significado Impacto Visual
\(\text{dist}(y,x)\) Distância morfológica até a borda mais próxima segundo a métrica definida por \(b\) Pixels mais internos recebem valores maiores
Valor máximo Pixel mais distante da borda Aproxima o centro morfológico do objeto
Elemento estruturante ponderado Define os custos de deslocamento entre pixels vizinhos Determina a métrica de distância utilizada
Objetos finos Regiões estreitas do objeto Produzem valores baixos de distância

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

Entrada:

  • Linha 1: inteiro \(L\).
  • Linha 2: inteiro \(C\).
  • Linha 3: inteiro \(L_B\).
  • Linha 4: inteiro \(C_B\).
  • Próximas \(L_B\) linhas: elementos inteiros da matriz \(b\).
  • Próximas \(L\) linhas: elementos binários (\(0\) ou \(1\)) da matriz \(f\).

⚠️ Nota de implementação: Os elementos da matriz \(f\) (0 ou 1) devem ser multiplicados por 255 para gerar uma imagem binária adequada (\(0\) e \(255\)) antes de aplicar a Transformada de Distância (TD).

Saída:

  • Matriz da transformada de distância em \(L\) linhas e \(C\) colunas.

4.9.9.5 📌 Exemplo

Entrada Saída Observação
5
9
3
3
-99 -1 -99
-1 0 -1
-99 -1 -99
0 0 0 0 0 0 0 0 0
0 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 1 1 1 1 1 1 1 0
0 1 2 2 2 2 2 1 0
0 1 1 1 1 1 1 1 0
0 0 0 0 0 0 0 0 0
Resultado da transformada de distância.

Nota: o valor -99 atua como uma aproximação prática de \(-\infty\), impedindo a propagação pelas diagonais. Dessa forma, apenas os vizinhos horizontal e vertical contribuem para a distância, produzindo a distância de Manhattan.

🗺️ Simulador EP04_09: Transformada de Distância Camadas de Erosão

Clique nas células para desenhar o seu próprio objeto ou selecione uma forma predefinida para calcular o mapa de distâncias em cascata.

Mapa de Distâncias Calculado
Figura 4.38: Simulador EP04_09: Transformada de Distância (Camadas de Erosão)
%%writefile EP04_09.py
# Código Python
Writing EP04_09.py
TestSuite("EP04_09.py").run()
✔️ EP04_09.cases já existe em casos/
📋 4 caso(s) carregado(s) de casos/EP04_09.cases

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