Algoritmo que detecta linhas e minúcias, tal como seus sentidos vetoriais usando principalmente filtros sobel, de gabor e outros. Futura implementação de rede neural em busca de melhor desempenho do software. Ja foi feito nesta conta git um algoritmo teste que detectava angulos usando filtros sobel. A primeira parte da presente ideia, tal como seu algorítmo foram originados a partir daquele primeiro projeto, o qual foi modificado e melhorado para o caso em questão, portanto a parte de detecção de angulo é uma versão dele muito melhorada e com interface modificável, que permite modificar, com velocidade, parametros importantes para observar resultados, encontrar um bom limiar e passarmos para o próximo passo.
No desenvolvimento dos meus códigos python costumo realizar testes alterando variáveis e parâmetros manualmente, rodando e observando, porém, quando o código fica grande, com funções em outros arquivos, nem adianta muito seguir paradigmas de código limpo, modificar variáveis para testes sempre vai ser trabalhoso e requerer atenção. Pensando em melhorar isto e deixar meu próximo código mais apresentável resolvi usar o básico da biblioteca pySimpleGui.
A interface não foi pensada para ser interativa, mas sim para simplificar e centralizar a entrada de parametros gerais. Como é possivel observar na imagem abaixo, na tela ja vem com parametros pré-preenchidos, (o default pode ser modificado no código para agilizar) é necessário informar primeiramente o caminho da imagem a ser processada, logo depois, dados de processamentos adicionais a serem feitos na primeira fase.
Esta fase é dividida em 3 partes mais importantes de processamento:
Nesta versão, para resolver este problema, resolvi trabalhar com dois mapas diferentes e calcular o ABS (módulo) da matriz, o que nos retorna a imagem (abs do sobel), observe que nela ja não temos a quebra de passagem de 0 á π, mas repare que perdemos parte do range do angulo que tinhamos que antes era de 180º, agora passa a ser de somente 90º.
Observe que para representar uma direção vetorial só precisamos de 180º, o qual perdemos por uma boa razão. Mas ainda temos o mapa (sobels arctg). Quando limitamos os angulos á 90º, basta imaginar que por, exemplo, o angulo (135 ou 3π/4) é representado aqui por (45 ou π/4), ou seja usando o mapa sobels arctg podemos determinar se será para direita (>90º) ou para a esquerda (<90º). isso é importante para salvar os dados ou plotar.
O mapa estando tratado podemos aplicar algum filtro para melhorar a distribuição. até o momento foram implementados três métodos para testes. Se olharmos bem, o mapa possui linhas que com certeza vão interferir no angulo horiginal, caso apliquemos um filtro de média simples estes espaços que fogem muito do valor que se espera vão alterar o valor real, e foi pensando nisso que eu desenvolvi um filtro usando a opção histograma da biblioteca numpy. Para o histograma e para a média harmonica fiz as opções de filtro conolucional 3x3 e 5x5 manualmente. Basicamente Este filtro vai convoluir a imagem, mas para cada ponto e ao redor, ao invés de somar, é calculado um histograma, e o range com os angulos que mais aparecem é atribuido ao ponto em questão, assim, caso hajam pontos próximos, a chance deles serem considerados é muito menor e o risco de alterar o valor real por calculo de média é diminuido. Como discutido, dependendo da quantidade de pontos errôneos ao redor, uma média comum pode alterar os valores reais, mesmo que antes naquele ponto o valor já fosse o correto. Para resolver isso, a média harmonica, semelhante á média comum, aproxima um valor comum, mas caso hajam valores que se repitam ou muito próximos, diz-se que estes representam o todo, por fim este método só foi implementado para testes e esta se saindo bem. Apezar de insistirmos no problema de perda de precisão, uma função com a opção blur foi implementada, pois ela será util depois, sem contar que, por mais que saibamos que problemas surgirão com seu uso nesta fase, caso façamos teste podemos constatar que uma coisa ou outra pode ser afetada positivamente e podemos tirar proveito disso.
Para plotar, usamos os conceitos ja citados acima. Com os dois mapas sobles arctg e o calculado em abs e aproximado, num intervalo de a cada 10 píxels (definido na interface) plotamos uma seta direcional. Existe a opção neste caso, de quando for plotar, fazer mais uma análise local ao redor do ponto para ter mais precisão, podendo optar por um filtro diferente do que foi usado no primeiro processamento para observer os diferentes comportamentos. Futuramente talvez será interessante implementar uma sequencia grande de diversos filtros a serem marcados/selecionados.
É possível observer no gradiente plotado abaixo que alguns angulos estão perpendiculares á direção predominante, isso pode ser decorrende de falhas na imagem analisada e a limitação do filtro sobel 3x3 e/ou no mapa sobels arctg que por algum motivo acusa estar para um lado quando na verdade está para outro, o que também pode ser problema de resolução de filtros.