Extração de Linhas no Halcon: lines_color, lines_facet e lines_gauss

No Halcon, os operadores principais para extração de linhas são:

lines_color(Imagem : Linhas : Sigma, LimiteBaixo, LimiteAlto, ExtrairLargura, JunçõesCompletas : )

lines_facet(Imagem : Linhas : TamanhoMáscara, LimiteBaixo, LimiteAlto, ClaroEscuro : )

lines_gauss(Imagem : Linhas : Sigma, LimiteBaixo, LimiteAlto, ClaroEscuro, ExtrairLargura, ModeloLinha, JunçõesCompletas : )

Os operadores lines_facet e lines_gauss pertencem à mesma categoria, conforme indicado nas assinaturas da documentação.

Diferença entre extração de linhas e detecção de bordas

Os operadores de extração de linhas mencionados acima produzem contornos XLD, assim como o operador de detecção de bordas edges_sub_pix. A distinção fundamental está no que eles capturam.

Cosnidere este exemplo em pseudocódigo:

ler_imagem (Imagem, 'amostra-angiograma') contar_canais (Imagem, NumCanais) se (NumCanais == 3 ou NumCanais == 4) converter_para_cinza (Imagem, Imagem) fim

lines_gauss (Imagem, LinhasExtraidas, 2.5, 0.0, 0.8, 'dark', 'true', 'parabolic', 'true') edges_sub_pix (Imagem, BordasExtraidas, 'canny', 1, 6, 12) configurar_cor ('verde') exibir_na_janela (Imagem) exibir_na_janela (LinhasExtraidas)


</div>A saída de lines\_gauss e edges\_sub\_pix difere de maneira característica:

Uma "borda" na imagem refere-se a uma **transição abrupta de intensidade**. Ao desenhar uma **linha com largura perceptível**, ambos os lados da linha tipicamente geram bordas detectáveis.

Em contraste, operadores como lines\_gauss extraem o **esqueleto central** dessa linha larga, resultando geralmente em um único contorno XLD representando a linha propriamente dita.

### lines\_color

Este operador detecta linhas coloridas e suas larguras. Sua sintaxe é:

**lines\_color(Imagem : Linhas : Sigma, LimiteBaixo, LimiteAlto, ExtrairLargura, JunçõesCompletas : )**

Parâmetros-chave:

- **Sigma**: Define o nível de suavização gaussiana aplicada.
- **LimiteBaixo/LimiteAlto**: Limiares para a operação de histerese.
- **ExtrairLargura**: Define se a largura da linha deve ser calculada (tipicamente 'true').
- **JunçõesCompletas**: Determina se pontos de junção devem ser adicionados onde a extração falha.

**Nota importante:** Se um valor alto para Sigma for usado, os limiares LimiteBaixo e LimiteAlto devem ser ajustados para valores menores. Para extrair a largura, a escolha de Sigma deve satisfazer Sigma ≥ w/1.732, onde w é a largura da linha (metade do diâmetro). O valor mínimo aceitável é Sigma ≥ w/2.5.

Exemplo demonstrando o parâmetro JunçõesCompletas:

<div>```

ler_imagem (Img, 'cabos-exemplo')
lines_color (Img, Linhas1, 3.5, 0, 12, 'true', 'false')
lines_color (Img, Linhas2, 3.5, 0, 12, 'true', 'true')

configurar_cor ('verde')
limpar_janela ()
exibir_na_janela (Linhas1)
limpar_janela ()
exibir_na_janela (Linhas2)

lines_facet

Este operador detecta linhas usando um modelo de faceta:

lines_facet(Imagem : Linhas : TamanhoMáscara, LimiteBaixo, LimiteAlto, ClaroEscuro : )

Pontos relevantes da documentação:

  • ClaroEscuro: Especifica se deve extrair linhas claras ou escuras.
  • TamanhoMáscara: Valores maiores aumentam a suavização, mas podem reduzir a precisão local. Valores menores produzem linhas mais curtas e fragmentadas, com maior tempo de processamento.
  • Para Sigma=1.5, o TamanhoMáscara equivalente é aproximadamente 5.

Na prática, este operador raramente é utilizado, pois o lines_gauss oferece mais flexibilidade e é mais fácil de parametrizar. Pode-se considerar este operador como alternativa em cenários específicos.

lines_gauss

Este é o operador mais versátil para detecção de linhas e larguras:

lines_gauss(Imagem : Linhas : Sigma, LimiteBaixo, LimiteAlto, ClaroEscuro, ExtrairLargura, ModeloLinha, JunçõesCompletas : )

O parâmetro adicional ModeloLinha aceita os valores: 'none', 'bar-shaped', 'parabolic', 'gaussian'. Sua seleção depende da morfologia da linha:

  • 'bar-shaped': Escolha padrão para a maioria das aplicações.
  • 'parabolic': Ideal para linhas com bordas nítidas, como em imagens retroiluminadas.
  • 'gaussian': Adequado para linhas com transições suaves de entensidade.

Este parâmetro só é efetivo quando ExtrairLargura está definido como 'true'.

Para simplificar a parametrização, o Halcon oferece o operador auxiliar:

calculate_lines_gauss_parameters( : : LarguraMaximaLinha, Contraste : Sigma, LimiteBaixo, LimiteAlto)

  • LarguraMaximaLinha: Largura máxima das linhas a serem extraídas.
  • Contraste: Contraste de intensidade das linhas alvo. Pode ser um tuplo [contrasteAlto, contrasteBaixo], onde contrasteBaixo define o contraste mínimo das linhas extraídas (não pode exceder contrasteAlto). Se omitido, contrasteBaixo assume contrasteAlto/3.0. Valores menores de contrasteBaixo capturam linhas mais longas em regiões de baixo contraste.

Exemplo de aplicação:

ler_imagem (Foto, 'amostra-medica') verificar_canais (Foto, CanalCount) se (CanalCount == 3 ou CanalCount == 4) transformar_para_escala_cinza (Foto, Foto) fim

calculate_lines_gauss_parameters (10, [12,4], SigmaCalc, LimBaixoCalc, LimAltoCalc) lines_gauss (Foto, ContornosLinha, SigmaCalc, LimBaixoCalc, LimAltoCalc, 'dark', 'true', 'parabolic', 'true')

configurar_cor ('verde') mostrar_imagem (Foto) mostrar_contornos (ContornosLinha)


</div>Para tarefas de extração de linhas, os operadores **lines\_color** e **lines\_gauss** são suficientes para a maioria dos cenários.

Tags: Halcon lines_gauss lines_color lines_facet XLD

Publicado em 6-15 20:35 por Thomas