Convolução

Autor: cronuxs
Data: 23/04/2009

Exercício

Estudar as convoluções discreta, tanto linear como a periódica. Implementar estas funções da forma que achar mais simples (pode ser a varredura tradicional de pixels). Explore pequenos exemplos numéricos e discuta a questão dos limites da imagem e do núcleo da convolução.

Este exercício é bem mais livre e permitirá que cada um explore mais e procure literatura e exemplos a respeito. Convolução vem da teoria de sistemas lineares e existe uma teoria e exemplos sobre o assunto, a maioria deles está no caso contínuo com o uso de integrais. Estou mais interessado aqui no caso restrito de imagens digitais.

Fiquem à vontade aqui para trazer dicas e comentários entre os alunos e comigo também.

Teoria

A convolução discreta é uma ferramenta para construir qualquer filtro linear ou de deslocamento. A equação da convolução, g(x), da sequência f(x) com o nucleo da convolução h(x) é:

http://mathworld.wolfram.com/images/gifs/convrect.gif http://communities.ptc.com/servlet/JiveServlet/showImage/2-148864-1929/convgaus.gif

Soluções

Convolução Discreta Linear

Iterando no kernel

 1 def convlinear2d(f,h):
 2     m = f.shape[0] + h.shape[0] - 1
 3     n = f.shape[1] + h.shape[1] - 1
 4     g = zeros((n,m))
 5 
 6     for i in range(h.shape[0]):
 7         for j in range(h.shape[1]):
 8             g[i:f.shape[0]+i, j:f.shape[1]+j ] += h[i,j] * f
 9 
10     return g

Iterando na imagem

 1 def convlinear2d_2(f,h):
 2     m = f.shape[0] + h.shape[0] - 1
 3     n = f.shape[1] + h.shape[1] - 1
 4     g = zeros((n,m))
 5 
 6     for i in range(f.shape[0]):
 7         for j in range(f.shape[1]):
 8             g[i:h.shape[0]+i, j:h.shape[1]+j ] += f[i,j] * h
 9 
10     return g

imagem original

iterando no kernel. 0.0142841339111s

iterando na imagem. 0.887369155884s

usando a iaconv. 0.00278282165527s