Implementação do desfoque Gaussiano
Utilizando numpy para implementar nosso próprio desfoque gaussiano
(Esse é um texto sobre Visão Computacional, veja este texto se gostaria de ler uma introdução à área)
Seja bem vindo a mais um Turing Talks!
Filtros de desfoque são gerados naturalmente devido a captação de imagens por algumas lentes. Tem ganhado popularidade em meio a filtros no Instagram que esboçam o fundo para destacar algo, o que já é muito usado na indústria visual. Além disso com aplicações mais pontuais é usado para tratamento de pele na pós produção de uma foto.
Por se tratar de um comportamento natural da câmera também é simulado em diversos jogos como fifa 20 e nba2k20, que apresentam o conteúdo pelas “câmeras” que filmam os jogos.
Mas muito além disso, são muito usados na área de visão computacional de forma a homogeneizar uma imagem. Diminuindo seu ruído e nível de detalhamento de forma a facilitar a generalização por um futuro processamento.
Aqui vamos aprender de onde eles surgiram, porque são assim e como implementá-los!
Porque acontece o desfoque
Para ocorrer o desfoque precisamos de uma grande quantidade de pontos de luz entrando pela lente, por isso ela só pode ser conseguida naturalmente como a câmera abaixo.
Isso se deve a como a câmera captura a luz e gera a imagem. Um ponto reflete a luz em diversas direções, a lente da câmera então recupera todos esses feixes de luz e tenta junta-los em um ponto no sensor. Acontece que só é possível focar em um ponto de cada vez (o dito cujo foco da câmera), então para pontos muito longe do plano de foco os feixes de luz tendem a se interceptar atrás do sensor da câmera, o que gera no sensor um ponto espalhado, desfocado.
Como mostrado pela figura com um espaço menor para a luz passar, (o obturador da câmera mais fechado) diminuímos o efeito devido aos pontos se espalharem menos. Para quem se interessar isso é chamado de profundidade de campo, estudado por fotógrafos.
Como mesclar os pixels?
Como vimos, esse efeito é causado pela luz de vários pontos próximos se combinado no pixel final.
Uma forma de tentar reproduzi-lo a partir de uma imagem é combinado seus pixels próximos, fazendo a media de todos dentro de uma área próxima.
Aqui temos que decidir também o que fazer nos cantos, onde não se pode pegar todos os pixels. Minha escolha aqui foi por ignora-los e dividir apenas pelos que estão sob a área vermelha.
Convoluções
Melhorando um pouco nosso algoritmo, pode ser útil em vez de uma média aritmética conseguimos adicionar pesos a cada posição, para por exemplo as posições centrais importarem mais que as mais distantes.
Esses pesos são representados em uma matriz, chamada de núcleo de convolução (do inglês kernel), as vezes também chamada de máscara.
Brincando com esses pesos e a quantidade de pixels pegos conseguimos diversos resultados interessantes, como diferentes tipos de blur, detecção de borda e até mesmo descobrir rostos! É essa mesma matriz de pesos que está presente nas Redes Neurais Convolucionais, elas começam com valores aleatórios e seus pesos são treinados.
Implementação
Abaixo está a minha implementação para a aplicação da convolução em uma imagem
Desfoque Gaussiano
Agora temos que decidir como preencher nossa matriz de pesos. Nesse caso para imitar a difusão das lentes os pontos mais centrais são mais influentes mas podemos melhorar em vez de chutar potências de 2.
Um dos jeitos mais comuns de preencher nosso núcleo é com o que os estatísticos amam: uma distribuição gaussiana.
A equação para o núcleo gaussiana de tamanho (2k+1)×(2k+1) será:
Para um núcleo de tamanho 5, função retornará os seguintes valores:
E o python facilita bastante para gera-lo:
Juntando Tudo
Combinando os métodos conseguimos gerar nossa matriz gaussiana:
Gerando o seguinte resultado:
Conclusão
Obrigado por acompanhar até aqui!
Esperamos conseguir explicar um pouco mais sobre o que é o desfoque gaussiano, além da aplicação inicial das convoluções que hoje dominam o mundo das redes neurais.
Pra ficar por dentro segue a gente nas redes sociais, estamos no Facebook, LinkedIn e Instagram.
Até a próxima!
Se você gostou, confira também: Redes neurais convolucionais, Implementação de redes convolucionais com tensorflow e keras.