giovani_ex6

Convolução

[1]Podemos estudar a convolução sob dois pontos de vista distintos:

  • do sinal de entrada: como cada ponto do sinal de entrada contribui para vários pontos do sinal de saída.

  • do sinal de saída: como cada ponto do sinal de saída recebeu contribuições de vários pontos do sinal de entrada.

    Estas duas perspectivas são formas diferentes de analisar a mesma operação matemática, e portanto são equivalentes: a primeira fornece uma idéia conceitual da convolução, enquanto que a segunda descreve a matemática da convolução.

A convolução discreta do ponto de vista de saída, f [x] e h [x] é denotada como f [x] * h [x] é definido como a soma do produto de duas funções discretas:

onde P=A+B-1, cujo A e B são os respectivos tamanhos de f e h.

A convolução em 2 dimensões respeita a mesma equação, porém acrescentando algumas variáveis para representar a segunda dimensão, ficando a equação da seguinte forma:

onde M=B+D-1 e N=A+C-1.

Vejamos um exemplo simples com 1 dimensão:

 1 #------------------------------------------------------------------------------------
 2 def iaconvolucao1(f, h):
 3     A=f.size
 4     B=h.size
 5     P=A+B-1
 6 
 7     fe= concatenate((f,zeros(P-A)))
 8     he= concatenate((h,zeros(P-B)))
 9 
10     Y=zeros(P)
11     for x in range(0,P):
12         aux=0
13         for m in range(0,P):
14             aux = aux + fe[m] * he[x-m]  #print "\n x:%d m:%d fe[%d]:%d  he[%d]:%d \n" %(x,m,m,fe[m],x-m,he[x-m])
15         Y[x]=aux
16 
17     return Y
18 
19 #------------------------------------------------------------------------------------
f: 
[1 2 3 2]

 h: 
[2 1]

 y: 
[ 2.  5.  8.  7.  2.]

Neste momento será apresentado o código para 2 dimensões:

 1 #----------------------------------------------------------------------------
 2 def iaconvolucao2(f, h):
 3 
 4     B,A = f.shape
 5     D,C = h.shape
 6 
 7     M=B+D-1
 8     N=A+C-1
 9 
10     fe1=hstack((f,zeros((B,N-A))))
11     he1=hstack((h,zeros((D,N-C))))
12 
13     fe2=vstack((fe1,zeros((M-B,N))))
14     he2=vstack((he1,zeros((M-D,N))))
15 
16     aux=0;
17     R=zeros((M,N));
18     for x in range(0,M):
19         for y in range(0,N):
20             aux = 0
21             for i in range(0,M):
22                 for j in range(0,N):
23                     aux = aux + fe2[i,j] * he2[x-i,y-j]
24             R[x,y]=aux
25 
26     return R.astype(int)
27 
28 #----------------------------------------------------------------------------
f: 
[[0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 1 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]]

 h: 
[[1 2 3]
 [4 5 6]]

 y: 
[[0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0]
 [0 0 1 2 3 0 0]
 [0 0 4 5 6 0 0]
 [0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0]]

Com o intuito de apresentar e estudar a operação de convolução pedida na prova, apresenta:

Questão 4: Exemplo filtro de suavização

Imagem: 
[[  0   0   0 255 255 255]
 [  0   0   0 255 255 255]
 [  0   0   0 255 255 255]
 [  0   0   0 255 255 255]
 [  0   0   0 255 255 255]]

 Filtro: 
[[ 0.11  0.11  0.11]
 [ 0.11  0.11  0.11]
 [ 0.11  0.11  0.11]]

 Resultado: 
[[  0   0   0  28  56  84  56  28]
 [  0   0   0  56 112 168 112  56]
 [  0   0   0  84 168 252 168  84]
 [  0   0   0  84 168 252 168  84]
 [  0   0   0  84 168 252 168  84]
 [  0   0   0  56 112 168 112  56]
 [  0   0   0  28  56  84  56  28]]

Questão 5: Exemplo do Filtro Laplaciano

Imagem: 
[[0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0]
 [0 0 1 1 1 0 0]
 [0 0 1 1 1 0 0]
 [0 0 1 1 1 0 0]
 [0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0]]

 Filtro: 
[[ 0  1  0]
 [ 1 -4  1]
 [ 0  1  0]]

 Resultado: 
[[ 0  0  0  0  0  0  0  0  0]
 [ 0  0  0  0  0  0  0  0  0]
 [ 0  0  0  1  1  1  0  0  0]
 [ 0  0  1 -2 -1 -2  1  0  0]
 [ 0  0  1 -1  0 -1  1  0  0]
 [ 0  0  1 -2 -1 -2  1  0  0]
 [ 0  0  0  1  1  1  0  0  0]
 [ 0  0  0  0  0  0  0  0  0]
 [ 0  0  0  0  0  0  0  0  0]]

[1] Ynoguti, Carlos Alberto. Processamento digital de sinais: Convolução.