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.