lionisEX06

Autor: lionis
Data: 21/04/2009

Convolução discreta linear

A convolução de f(x,y) e h(x,y) é denotada por f(x,y)*h(x,y), cuja expressão segue abaixo:

onde os sinais negativos realizam a rotação de 180 graus da matriz de correlação, obtendo a convolução.

onde AxB e CxD são dimensões de f(x,y) e h(x,y), respectivamente.

 1 def normalize(I, r): #esta normalizacao nao descarta os valores negativos nem valores acima de 255; todo o intervalo e' preservado
 2     min,max = r[0],r[1] #valores minimo e maximo da nova escala
 3     Im,In = I.shape #dimensoes atuais da imagem
 4 
 5     I = (I - I.min())/(I.max() - I.min())
 6     I *= (max - min) + min #conversao das escalas
 7 
 8     return uint(I)
 9 
10 def iaconvperiodica(f, h): #utiliza convolucao circular para calcular as bordas
11     a,b = f.shape #dimensoes da mascara de convolucao
12     m,n = h.shape #dimensoes da imagem
13 
14     I = zeros((m,n)) #cria a imagem final
15 
16     for i in range(0, m):
17         for j in range(0, n): #i e j iteram a imagem original
18             for k in range(0, a):
19                 for l in range(0, b): #k e l iteram a mascara de convolucao
20                     #nota-se que nesta convolucao, se a mascara ultrapassa a borda da imagem, ela utiliza
21                     #os valores do outro extremo da imagem, de forma periodica
22                     I[i,j] += f[k,l] * h[(i-(k-a/2))%m,(j-(l-b/2))%n]
23 
24     return I
25 
26 def iaconvlinear(f, h): #utilizando zero padding, assim como definido para a iaconv original
27     a,b = f.shape #dimensoes da mascara de convolucao
28     c,d = h.shape #dimensoes da imagem
29     m = a + c - 1 #numero de linhas da imagem "temporaria" a ser trabalhada
30     n = b + d - 1 #numero de colunas da imagem "temporaria" a ser trabalhada
31     lin = a - 1 #linhas adicionadas `a imagem "temporaria"
32     col = b - 1 #colunas adicionadas `a imagem "temporaria"
33 
34     I = zeros((m,n))
35     I[lin/2:m-(lin/2),col/2:n-(col/2)] = h #copiando a imagem f para a matriz I, ja com o zero padding
36     I2 = zeros((c,d)) #matriz final, a qual recebera os valores da convolucao
37 
38     for i in range(lin/2, m-lin/2):
39         for j in range(col/2, n-col/2): #i e j iteram a imagem original
40             for k in range(0, a):
41                 for l in range(0, b): #k e l iteram a mascara de convolucao
42                     I2[i-lin/2,j-col/2] += f[k,l] * I[i-(k-lin/2),j-(l-col/2)] #convolucao da mascara com a imagem
43             I2[i-lin/2,j-col/2] /= (a*b) #divide o somatorio por 1/MN
44 
45     return I2
46 
47 r = array([0,255])
48 h = mmreadgray('cameraman.pgm')
 1 f_suavizacao = array(
 2   [[ 1, 1, 1],
 3    [ 1, 1, 1],
 4    [ 1, 1, 1]])
 5 
 6 f_laplace = array(
 7   [[ 0, 1, 0],
 8    [ 1,-4, 1],
 9    [ 0, 1, 0]])
10 
11 f_laplaced = array(
12   [[ 1, 1, 1],
13    [ 1,-8, 1],
14    [ 1, 1, 1]])
15 
16 f_sobel1 = array(
17   [[ 1, 2, 1],
18    [ 0, 0, 0],
19    [-1,-2,-1]])
20 
21 f_sobel2 = array(
22   [[ 1, 0,-1],
23    [ 2, 0,-2],
24    [ 1, 0,-1]])
25 
26 adshow(h, title = 'Imagem original')
27 adshow(normalize(iaconvlinear(f_suavizacao, h), r), title = 'Convolução linear de suavização')
28 adshow(normalize(iaconvlinear(f_laplace, h), r), title = 'Convolução linear de Laplace')
29 adshow(normalize(iaconvlinear(f_laplaced, h), r), title = 'Convolução linear de Laplace diagonal')
30 adshow(normalize(iaconvlinear(f_sobel1, h), r), title = 'Convolução linear de Sobel')
31 adshow(normalize(iaconvlinear(f_sobel2, h), r), title = 'Convolução linear de Sobel')

Imagem original

Convolução linear de suavização

Convolução linear de Laplace

Convolução linear de Laplace diagonal

Convolução linear de Sobel

Convolução linear de Sobel

Convolução discreta periódica

A convolução periódica de f(x,y) e h(x,y) é denotada por f(x,y)*h(x,y), cuja expressão segue abaixo:

onde mod(x,N) é dado por:

onde as imagens f e h são periódicas com dimensões (N,M)

1 adshow(h, title = 'Imagem original')
2 adshow(normalize(iaconvperiodica(f_suavizacao, h), r), title = 'Convolução periódica de suavização')
3 adshow(normalize(iaconvperiodica(f_laplace, h), r), title = 'Convolução periódica de Laplace')
4 adshow(normalize(iaconvperiodica(f_laplaced, h), r), title = 'Convolução periódica de Laplace diagonal')
5 adshow(normalize(iaconvperiodica(f_sobel1, h), r), title = 'Convolução periódica de Sobel')
6 adshow(normalize(iaconvperiodica(f_sobel2, h), r), title = 'Convolução periódica de Sobel')

Imagem original

Convolução periódica de suavização

Convolução periódica de Laplace

Convolução periódica de Laplace diagonal

Convolução periódica de Sobel

Convolução periódica de Sobel

Considerações finais

Utilizando a convolução linear discreta, observa-se a formação de uma borda quase uniforme ao redor da imagem, pois no caso do "zero padding", a contribuição da região externa da imagem é sempre constante.

Por outro lado, na convolução periódica discreta, também chamada de convolução circular, as bordas da imagem são influenciadas pelas bordas opostas, uma vez que elas contribuem para a convolução. Assim, tem-se a percepção de periodicidade da imagem, como um ladrilho.