Implementação do desfoque Gaussiano

Utilizando numpy para implementar nosso próprio desfoque gaussiano

Guilherme Salustiano
Turing Talks
5 min readAug 23, 2020

--

Roda gigante parcialmente desfocada (Imagem original por Katia Ranai)

(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.

Fifa 19, com a torcida desfocada ao fundo

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.

Foto com fundo desfocado de uma câmera que gera um fundo desfocado (por Reinhart Julian)

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.

Calculo do desfoque simples de uma imagem

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.

Núcleo de convolução (matriz de pesos) usado na imagem anterior

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.

Uma distribuição gaussiana bidimensional. (fonte: Wikipedia)

A equação para o núcleo gaussiana de tamanho (2k+1)×(2k+1) será:

Equação do núcleo gaussiano bidimensional

Para um núcleo de tamanho 5, função retornará os seguintes valores:

Núcleo Gaussiano 5x5

E o python facilita bastante para gera-lo:

Juntando Tudo

Combinando os métodos conseguimos gerar nossa matriz gaussiana:

Gerando o seguinte resultado:

A esquerda a imagem original em cinza, a direita após a aplicação do desfoque gaussiano (fonte: freeimages)

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.

--

--