Detecção de Bordas - Vetor Gradiente e Jonh Canny


Antes de tudo aqui vai um concelho importante: Pare de ver imagem como uma imagem! Inicialmente eu tive um pouco de dificuldade de entender muitos conceitos de Visão Computacional e Processamento de Imagem devido a este fato. Quando você olha para uma imagem é interessante que você veja uma matriz, uma função ou um sinal, pois isso ajudar muito na hora de realizar operações matemáticas. Esse assunto já foi abordado em postagens anteriores, mas é importante ressaltar novamente, pois o bom entendimento dessa postagem vai depender de muitos conceitos matemáticos que serão aplicados na imagem, e se não estiver claro em seus pensamentos que uma imagem pode ser expressa de diversas formas matemáticas talvez você tenha muita dificuldade de entender o que está acontecendo, como ocorreu comigo quando iniciei meus estudos.

Um tema muito abordado por cientistas de visão é a questão da detecção de bordas (ou Edge Detection), uma vez que é possível identificar do que se trata a imagem apenas pelas suas margens. O uso desse método permite obter um conjunto de características importantes, permitindo um melhor reconhecimento e detecção. Além disso, ele depende menos da iluminação do ambiente e possui uma maior facilidade de detecção computacional. Assim, faz-se a seguinte pergunta: como identificar que um pixel é correspondente a uma margem? 

Para isso, pense na imagem como uma função, onde cada pixel é representado por valores numéricos. Quando o pixel vizinho tem um valor muito maior/menor observa-se uma margem, analise a matriz abaixo:

135 134 21
135 20   22
138 138 25

Nota-se uma margem quase triangular separando os dois grupos de números "cento e trintas" e "vintes". Assim, a pergunta que resta é: Como detectar essas diferenças e o quão grandes elas são?

Existe um importante conceito matemático que pode ser aplicado nessa ocasião: Vetor Gradiente. Este nada mais é um vetor que marca a direção de maior variabilidade a partir de derivadas parciais. Vetor Gradiente é um conceito um pouco complexo, é difícil explicar em poucas palavras como funciona, seria possível fazer uma postagem apenas sobre isso (talvez farei futuramente), mas o que você precisa saber é que ele indica a direção que ocorre a maior variação de intensidade em uma imagem. É necessário salientar que a magnitude desse vetor também indica o quão a intensidade está se modificando. 

Para calcular o gradiente de uma imagem de forma eficiente utiliza-se uma convolução da imagem com um filtro, que comumente é utilizado o Sobel. Uma vez descoberto o gradiente da imagem, ressalta-se as bordas mais fortes e obtém-se as bordas desejadas.
Resumindo o procedimento, temos 6 importantes etapas:
  1. Filtra-se a imagem para extrair ruídos, uma vez que o gradiente da imagem é sensível a ruídos;
  2. Computar o gradiente.
  3. Limiarizar a imagem para encontrar regiões de gradiente significante. 
  4. Afinar bordas relevantes.
  5. Conectar bordas caso precisem ser conectados.
Esse é um possível algoritmo para detecção de borda, porém existem alguns métodos já desenvolvidos que são muito interessante e que seguem uma linha de raciocínio parecida, como o detector de bordas de Canny. Esse método existe tanto na biblioteca OpenCV quanto na toolbox do MATLAB. 

Abaixo eu utilizei essa ferramenta do MATLAB para encontrar as bordas do meu próprio rosto. Primeiramente eu converto a imagem para a escala de cinza, em seguida aplico um filtro gaussiano, pois, como dito antes, o método é sensível à ruídos. Feito isso eu aplico a função edge(img,'Canny'); e então obtenho o resultado a seguir:


Levou um tempo para ajustar os parâmetros do filtro gaussiano utilizado, porém após algum tempo foi possível obter esse resultado. Embora a explicação desse algoritmo se mostre complexa, as ferramentas hoje em dia tornaram essa aplicação bem simples. O objetivo dessa postagem é apenas familiarizar o leitor com esse método, bem como dar um norte para aqueles que começaram com os estudos recentemente. Para maiores detalhes e explicações sinta-se à vontade para me enviar dúvidas e/ou consultar as fontes utilizadas.


Fontes Utilizadas
  • OPENCV. 2018. Último acesso: 05 aug. 2018. Disponível em:<https://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/canny_detector/canny_detector.html>.
  • OPENCV. 2018. Último acesso: 05 aug. 2018. Disponível em:<https://docs.opencv.org/3.4/d5/d0f/tutorial_py_gradients.html>.
  • MATLAB. 2018. Último acesso: 05 aug. 2018. Disponível em:<https://www.mathworks.com/help/images/ref/edge.html>.
  • MATLAB. 2018. Último acesso: 05 aug. 2018. Disponível em:<https://www.mathworks.com/discovery/edge-detection.html>.
  • MATLAB. 2018. Último acesso: 05 aug. 2018. Disponível em:<https://www.mathworks.com/help/images/ref/imgradientxy.html>.
  • WIKIPEDIA. 2018. Último acesso: 05 aug. 2018. Disponível em:<https://pt.wikipedia.org/wiki/Detector_de_bordas_de_Canny>.
  • WIKIPEDIA. 2018. Último acesso: 05 aug. 2018. Disponível em:<https://pt.wikipedia.org/wiki/Gradiente>.
  • STEWART, J.: Cálculo - Vol. 2, 6ª edição. Editora Pioneira Thomson Learning, 2009.
    • Notas de aula do Prof. Eduardo L. L. Cabral, USP, (https://edisciplinas.usp.br/pluginfile.php/4301995/mod_resource/content/0/V10%20-Deteccao%20de%20bordas.pdf).
    • UDACITY - COMPUTER VISION CLASS. 2018. Último acesso: 05 aug. 2018. Disponível em:<https://br.udacity.com/>.




    Comments

    Post a Comment