jahuaman

Data: 21/04/2009

convolução discreta linear

1-D Version

Convolução discreta de f [x] e h [x] é denotada como f [x] * h [x] é definido como a soma do produto de duas funções discretas, após o que h (x) é invertido e deslocadas uma distância m

Se f e h são causais de tamanho A e B, respectivamente, em um sistema LTI, então:

onde P=A+B-1

2-D Version

Convolução discreta de f [x,y] e h [x,y] é denotada como f [x,y] * h [x,y] é definido como a soma do produto de duas funções discretas, após o que h (x,y) é invertido e deslocadas uma distância 'm' no eixo x, y 'n' no eixo y

 1 def conv2D(f, h):
 2     if (h.ndim == 1):
 3         A=f.size/f.shape[0];
 4         B=f.shape[0];
 5         D=h.size/h.shape[0];
 6         C=h.shape[0];
 7     elif (f.ndim == 1):
 8         B=f.size/f.shape[0];
 9         A=f.shape[0];
10         C=h.size/h.shape[0];
11         D=h.shape[0];
12     else:
13         A=f.size/f.shape[0];
14         B=f.shape[0];
15         C=h.size/h.shape[0];
16         D=h.shape[0];
17     M=B+D-1;
18     N=A+C-1;
19 
20     if (D==1):
21         faux1=hstack((f,zeros((B,N-A))));
22         haux1=hstack((h,zeros((N-C))));
23     elif (B==1):
24         faux1=hstack((f,zeros((N-A))));
25         haux1=hstack((h,zeros((D,N-C))));
26     else:
27         faux1=hstack((f,zeros((B,N-A))));
28         haux1=hstack((h,zeros((D,N-C))));
29     faux2=vstack((faux1,zeros((M-B,N))));
30     haux2=vstack((haux1,zeros((M-D,N))));
31     aux=0;
32     G=zeros((M,N));
33     for x in range(M):
34         for y in range(N):
35             for i in range(M):
36                 for j in range(N):
37                     aux=aux+faux2[i,j]*haux2[x-i,y-j];
38             G[x,y]=aux;
39             aux=0;
40     return G;
41 
42 
43 #exemplo:
44 f = array(((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)))
45 h = array(((1,2,3),(1,2,3)))
46 g = conv2D(f,h)
47 print 'f= \n',f,'\n'
48 print 'h= \n',h,'\n'
49 print 'g= \n',g,'\n'
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]
 [1 2 3]] 

g= 
[[ 0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  1.  2.  3.  0.  0.]
 [ 0.  0.  1.  2.  3.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.]]
1 f = array(((1,0,0,0,0,0),(0,0,0,0,0,0)))
2 h = array(((1,2,3,4)))
3 g = conv2D(f,h)
4 print 'f= \n',f,'\n'
5 print 'h= \n',h,'\n'
6 print 'g= \n',g,'\n'
f= 
[[1 0 0 0 0 0]
 [0 0 0 0 0 0]] 

h= 
[1 2 3 4] 

g= 
[[ 1.  2.  3.  4.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.]]
1 f = array(((1,0,0,0,0,0),(0,0,0,0,0,0)))
2 h = array(([1],[2],[3],[4]))
3 g = conv2D(f,h)
4 print 'f= \n',f,'\n'
5 print 'h= \n',h,'\n'
6 print 'g= \n',g,'\n'
f= 
[[1 0 0 0 0 0]
 [0 0 0 0 0 0]] 

h= 
[[1]
 [2]
 [3]
 [4]] 

g= 
[[ 1.  0.  0.  0.  0.  0.]
 [ 2.  0.  0.  0.  0.  0.]
 [ 3.  0.  0.  0.  0.  0.]
 [ 4.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.]]
 1 x, y = iameshgrid(arange(0,50), arange(0,50) )
 2 x1, y1 = iameshgrid(arange(0,100), arange(0,100) )
 3 x = x.astype(float)
 4 y = y.astype(float)
 5 x1 = x1.astype(float)
 6 y1 = y1.astype(float)
 7 f = 255*exp(-1./2 *( ((x - 25)/5)**2+((y - 25)/5)**2));
 8 h = 255*exp(-1./2 *( ((x1 - 80)/1)**2+((y1 - 80)/1)**2));
 9 T=zeros(256,uint8);
10 T[211:256]=255
11 img_bin = iaapplylut(uint8(h),T)
12 g = iaconv(f,img_bin);
13 adshow(uint8(ianormalize(f)),title='img - Imagen 1')
14 adshow(uint8(ianormalize(img_bin)),title='img - Imagen 2')
15 adshow(uint8(ianormalize(g)),title='img - conv')

img - Imagen 1

img - Imagen 2

img - conv

filtros espaciales

Máscara de um filtro passa-baixas 3x3

Máscaras para o cálculo de Gx e Gy por Prewitt

Máscaras para o cálculo de Gx e Gy por Sobel

 1 img = mmreadgray('keyb.tif');
 2 mascara_media = ones((3,3));
 3 prewitt1 = array([[ -1, -1, -1],[ 0, 0, 0],[1,1,1]])
 4 prewitt2 = array([[ 1, 0,-1],[ 2, 0,-2],[ 1, 0,-1]])
 5 sobel1 = array([[ -1, -2, -1],[ 0, 0, 0],[1,2,1]])
 6 sobel2 = array([[ -1, 0,1],[ -2, 0,2],[ -1, 0,1]])
 7 
 8 g = iaconv(img,mascara_media)
 9 g1 = iaconv(img,prewitt1)
10 g2 = iaconv(img,prewitt2)
11 g3 = iaconv(img,sobel1)
12 g4 = iaconv(img,sobel2)
13 
14 adshow(img, title = 'imagem original')
15 adshow(uint8(ianormalize(g, [0,255])), title = 'Result depois da convolução com filtro mascara_media')
16 adshow(uint8(ianormalize(g1, [0,255])), title = 'Result depois da convolução com filtro prewitt1 3x3')
17 adshow(uint8(ianormalize(g2, [0,255])), title = 'Result depois da convolução com filtro prewitt2 3x3')
18 adshow(uint8(ianormalize(g3, [0,255])), title = 'Result depois da convolução com filtro sobel1 3x3')
19 adshow(uint8(ianormalize(g4, [0,255])), title = 'Result depois da convolução com filtro sobel2 3x3')

imagem original

Result depois da convolução com filtro mascara_media

Result depois da convolução com filtro prewitt1 3x3

Result depois da convolução com filtro prewitt2 3x3

Result depois da convolução com filtro sobel1 3x3

Result depois da convolução com filtro sobel2 3x3

Convolução discreta periódica

1-D Version

Convolução discreta periódica de f [x] e h [x] é denotada como:

onde:

 1 def convP1D(f,h):
 2     N=len(f);
 3     Y=zeros(N);
 4     aux=0;
 5     for x in range(N):
 6         for i in range(N):
 7             aux=aux+f[i]*h[mod(x-i,N)];
 8         Y[x]=aux;
 9         aux=0;
10     return Y;
11 
12 f=array((1,2,3,1));
13 h=array((1,-2,2,1));
14 fh=normPer(f,h);
15 print fh[0];
16 print fh[1];
17 Y=convP1D(fh[0],fh[1]);
18 print Y
[1 2 3 1]
[ 1 -2  2  1]
[ 7.  5.  2.  0.]

2-D Version

Convolução discreta Periódica de f [x,y] e h [x,y] é denotada como:

 1 def convP2D(f, h):
 2     if (h.ndim == 1):
 3         A=f.size/f.shape[0];
 4         B=f.shape[0];
 5         D=h.size/h.shape[0];
 6         C=h.shape[0];
 7     elif (f.ndim == 1):
 8         B=f.size/f.shape[0];
 9         A=f.shape[0];
10         C=h.size/h.shape[0];
11         D=h.shape[0];
12     else:
13         A=f.size/f.shape[0];
14         B=f.shape[0];
15         C=h.size/h.shape[0];
16         D=h.shape[0];
17     M=max(B,D);
18     N=max(A,C);
19 
20     if (D==1):
21         faux1=hstack((f,zeros((B,N-A))));
22         haux1=hstack((h,zeros((N-C))));
23     elif (B==1):
24         faux1=hstack((f,zeros((N-A))));
25         haux1=hstack((h,zeros((D,N-C))));
26     else:
27         faux1=hstack((f,zeros((B,N-A))));
28         haux1=hstack((h,zeros((D,N-C))));
29     faux2=vstack((faux1,zeros((M-B,N))));
30     haux2=vstack((haux1,zeros((M-D,N))));
31     aux=0;
32     G=zeros((M,N));
33     for x in range(M):
34         for y in range(N):
35             for i in range(M):
36                 for j in range(N):
37                     aux=aux+faux2[i,j]*haux2[mod(x-i,M),mod(y-j,N)];
38             G[x,y]=aux;
39             aux=0;
40     return G;
41 
42 f = array(((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)))
43 h = array(((1,2,3),(4,5,6)))
44 g = convP2D(f,h)
45 print 'f= \n',f,'\n'
46 print 'h= \n',h,'\n'
47 print 'g= \n',g,'\n'
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]] 

g= 
[[ 0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.]
 [ 0.  0.  1.  2.  3.]
 [ 0.  0.  4.  5.  6.]
 [ 0.  0.  0.  0.  0.]]
1 f = array(((1,0,0,0,0),(0,0,0,0,0)))
2 h = array(((1,2,3)))
3 g = convP2D(f,h)
4 print 'f= \n',f,'\n'
5 print 'h= \n',h,'\n'
6 print 'g= \n',g,'\n'
f= 
[[1 0 0 0 0]
 [0 0 0 0 0]] 

h= 
[1 2 3] 

g= 
[[ 1.  2.  3.  0.  0.]
 [ 0.  0.  0.  0.  0.]]

Referências

  • GONZALEZ, Rafael C.; WOODS, Richard E. Processamento de Imagens Digitais. Edgard Blücher, 2000. ISBN 85-212-0264-4.
  • PROAKIS, Jhon G.; MANOLAKIS, Dimitris G. Digital Signal Processing. Principles, Algorithms, and Applications