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.
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
- Dimensões da imagem: ler os inteiros \(L\) (linhas) e \(C\) (colunas) da imagem \(f\).
- Dimensões de \(B\): ler os inteiros \(L_B\) (linhas) e \(C_B\) (colunas) do elemento estruturante.
- Elemento estruturante: ler a matriz \(b\), contendo valor \(0\) no centro e valores negativos nas demais posições.
- Imagem: ler a matriz binária \(f\) (valores \(0\) ou \(1\)), linha a linha.
- 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.
- Transformada de distância: calcular a matriz de distâncias utilizando o método
mm.dist1(f,b). - 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.
%%writefile EP04_09.py
# Código PythonWriting 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.