Exercício 12 - Interpolação no domínio da frequência

Autor: Wagner Machado do Amaral
Data: 08/06/2009

Enunciado: ia636-2009:exercicio12

Expansão sem interpolação

 1 f = iaread('cameraman.pgm')
 2 f = f[19:19+64,99:99+64] # ROI selection
 3 f = ianormalize(f,[0,255])
 4 F = iadft(f)
 5 iashow(f,title='(f) Imagem original')
 6 iashow(iadftview(F),title='(F) DFT de f')
 7 
 8 s = 4 # escala
 9 rows,cols = f.shape
10 g = zeros([rows*s,cols*s])
11 g[::s,::s] = f
12 G = iadft(g)
13 iashow(g,title='(g) Escala de '+str(s)+' em f, sem interpolação')
14 iashow(iadftview(G),title='(G) DFT de g')
15 
16 rows,cols = F.shape
17 F2 = G[0:rows,0:cols]
18 f2 = abs(iaidft(F2))
19 f2 = ianormalize(f2,[0,255])
20 iashow(f2,title='(f2) IDFT de F2')
21 iashow(iadftview(F2),title='(F2) Slice em G')
22 
23 rows,cols = F.shape
24 G2 = iatile(F,[rows*s,cols*s])
25 g2 = abs(iaidft(G2))
26 g2 = ianormalize(g2,[0,255])
27 iashow(g2,title='(g2) IDFT de G2')
28 iashow(iadftview(G2),title='(G2) G sintético gerado por F ladrilhado')
29 
30 error = abs(f - f2)
31 print 'Erro (f, f2): ' , sum(ravel(error))
32 
33 error = abs(iadftview(F2) - iadftview(F))
34 print 'Erro (F, F2): ', sum(ravel(error))
35 
36 error = abs(g - g2)
37 print 'Erro (g, g2): ' , sum(ravel(error))
38 
39 error = abs(iadftview(G) - iadftview(G2))
40 print 'Erro (G, G2): ' , sum(ravel(error))
Warning: downcasting image from double to uint16 (may lose precision)
Warning: downcasting image from double to uint16 (may lose precision)
Warning: downcasting image from double to uint16 (may lose precision)
Erro (f, f2):  0.0146534403188
Erro (F, F2):  0
Erro (g, g2):  0.0146469929548
Erro (G, G2):  0

(f) Imagem original

(F) DFT de f

(g) Escala de 4 em f, sem interpolação

(G) DFT de g

(f2) IDFT de F2

(F2) Slice em G

(g2) IDFT de G2

(G2) G sintético gerado por F ladrilhado

Expansão com interpolação - Vizinho mais próximo

 1 f = iaread('cameraman.pgm')
 2 f = f[19:19+64,99:99+64] # ROI selection
 3 f = ianormalize(f,[0,255])
 4 F = iadft(f)
 5 iashow(f,title='(f) Imagem original')
 6 iashow(iadftview(F),title='(F) DFT de f')
 7 
 8 s = 4 # escala
 9 rows,cols = f.shape
10 g = zeros([rows*s,cols*s])
11 g[::s,::s] = f
12 G = iadft(g)
13 iashow(g,title='(g) Escala de '+str(s)+' em f, sem interpolação')
14 iashow(iadftview(G),title='(G) DFT de g')
15 
16 m = zeros(g.shape)
17 m[0:s,0:s]=1
18 iashow( m , title='(m) Mascara de interpolação (domínio espacial)')
19 M = iadft(m)
20 iashow(iadftview(M),title='(M) DFT de m - Simetrico='+str(iaisdftsym(M)))
21 
22 G2 = G * M
23 g2 = abs(iaidft(G2))
24 g2 = ianormalize(g2,[0,255])
25 
26 iashow(g2,title='(g2) IDFT de G2')
27 iashow(iadftview(G2),title='(G2) G * M')
Warning: downcasting image from double to uint16 (may lose precision)
Warning: downcasting image from double to uint16 (may lose precision)
Warning: downcasting image from double to uint16 (may lose precision)

(f) Imagem original

(F) DFT de f

(g) Escala de 4 em f, sem interpolação

(G) DFT de g

(m) Mascara de interpolação (domínio espacial)

(M) DFT de m - Simetrico=True

(g2) IDFT de G2

(G2) G * M

Redução sem interpolação

 1 f = mmreadgray('Attachments/ia636-2009/machadowma_ex12/original.gif')
 2 F = iadft(f)
 3 iashow(f,title='(f) Imagem original')
 4 iashow(iadftview(F),title='(F) DFT de f')
 5 
 6 reducao = 4
 7 m = zeros(f.shape) # Mascara de redução (domínio espacial)
 8 m[::reducao,::reducao] = 1
 9 iashow( m , title='(m) Mascara de redução (domínio espacial)')
10 
11 M = iadft(m)
12 iashow(iadftview(M),title='(M) DFT de m - Simetrico='+str(iaisdftsym(M)))
13 
14 g = f * m
15 G = iadft(g)
16 
17 iashow( g , title='(g) f * m')
18 iashow(iadftview(G),title='(G) DFT de g')
19 
20 rows,cols = F.shape
21 G2 = G[0:rows/reducao,0:cols/reducao]
22 
23 g2 = abs(iaidft(G2))
24 g2 = ianormalize(g2,[0,255])
25 
26 iashow(g2,title='(g2) IDFT de G2')
27 iashow(iadftview(G2),title='(G2) Slice em G')
Warning: downcasting image from double to uint16 (may lose precision)
Warning: downcasting image from double to uint16 (may lose precision)
Warning: downcasting image from double to uint16 (may lose precision)

(f) Imagem original

(F) DFT de f

(m) Mascara de redução (domínio espacial)

(M) DFT de m - Simetrico=True

(g) f * m

(G) DFT de g

(g2) IDFT de G2

(G2) Slice em G

Redução com interpolação

 1 f = mmreadgray('Attachments/ia636-2009/machadowma_ex12/original.gif')
 2 F = iadft(f)
 3 
 4 iashow(f,title='(f) Imagem Original')
 5 iashow(iadftview(F),title='(F) DFT de f')
 6 
 7 M,N = F.shape
 8 H = iacircle([M,N],M/8,[M/2,N/2])
 9 FH = F * iaifftshift(H)
10 fh = abs(iaidft(FH))
11 
12 iashow(fh,title='(fh) Passa baixa em f')
13 iashow(iadftview(FH),title='(FH) Passa baixa em F')
14 
15 reducao = 4
16 m = zeros(fh.shape) # Mascara de redução (domínio espacial)
17 m[::reducao,::reducao] = 1
18 iashow( m , title='(m) Mascara de redução (domínio espacial)')
19 
20 M = iadft(m)
21 iashow(iadftview(M),title='(M) DFT de m - Simetrico='+str(iaisdftsym(M)))
22 
23 g = fh * m
24 G = iadft(g)
25 
26 iashow( g , title='(g) fh * m')
27 iashow(iadftview(G),title='(G) DFT de g')
28 
29 rows,cols = FH.shape
30 G2 = G[0:rows/reducao,0:cols/reducao]
31 
32 g2 = abs(iaidft(G2))
33 g2 = ianormalize(g2,[0,255])
34 
35 iashow(g2,title='(g2) IDFT de G2')
36 iashow(iadftview(G2),title='(G2) Slice em G')
Warning: downcasting image from double to uint16 (may lose precision)
Warning: downcasting image from double to uint16 (may lose precision)
Warning: downcasting image from double to uint16 (may lose precision)
Warning: downcasting image from double to uint16 (may lose precision)

(f) Imagem Original

(F) DFT de f

(fh) Passa baixa em f

(FH) Passa baixa em F

(m) Mascara de redução (domínio espacial)

(M) DFT de m - Simetrico=True

(g) fh * m

(G) DFT de g

(g2) IDFT de G2

(G2) Slice em G

Função Resize

 1 def escala(f, Sx, Sy):
 2   from numpy.linalg import inv
 3   from numpy import maximum, minimum
 4   T = array([ [Sx,0,0],[0,Sy,0],[0,0,1] ])
 5   faux = ravel(f)*1.
 6   (m, n) = f.shape
 7   (x, y) = iameshgrid(range(n),range(m))
 8   aux = concatenate((reshape(x, (1,m*n)), reshape(y, (1,m*n))))
 9   aux = concatenate((aux, ones((1, m*n))))
10   XY = dot(T, aux)
11   XY = fix(XY)
12   X, Y = XY[0,:], XY[1,:]
13   indice = Y*ceil(f.shape[1]*Sx)+X
14   indice = floor(indice)
15   g=arange(ceil(f.shape[0]*Sy)*ceil(f.shape[1]*Sx))*0.
16   g.put([indice],[faux])
17   g = reshape(g, [ceil(f.shape[0]*Sy),ceil(f.shape[1]*Sx)])
18   return g
 1 def resize(f,Sx,Sy):
 2   F = iadft(f)
 3   g2=0;
 4   if(Sx>1 or Sy>1):
 5     if(Sx>1 and Sy>1):
 6       Sx_,Sy_ = Sx,Sy
 7     elif(Sx>1):
 8       Sx_,Sy_ = Sx,1
 9     elif(Sy>1):
10       Sx_,Sy_ = 1,Sy
11 
12     g = escala(f,Sx_,Sy_)
13     G = iadft(g)
14     m = zeros(g.shape)
15     m[0:Sy_,0:Sx_]=1
16     M = iadft(m)
17     G2 = G * M
18     g2 = abs(iaidft(G2))
19     g2 = ianormalize(g2,[0,255])
20     f=g
21   if(Sx<1 or Sy<1):
22     if(Sx<1 and Sy<1):
23       Sx_,Sy_ = ceil(1/Sx),ceil(1/Sy)
24     elif(Sx<1):
25       Sx_,Sy_ = ceil(1/Sx),1
26     elif(Sy<1):
27       Sx_,Sy_ = 1,ceil(1/Sy)
28     m = zeros(f.shape) # Mascara de redução (domínio espacial)
29     m[::Sy_,::Sx_] = 1
30     M = iadft(m)
31     g = f * m
32     G = iadft(g)
33     rows,cols = f.shape
34     G2 = G[0:rows/Sy_,0:cols/Sx_]
35     g2 = abs(iaidft(G2))
36     g2 = ianormalize(g2,[0,255])
37   return g2
 1 f = iaread('cameraman.pgm')
 2 f = f[19:19+64,99:99+64] # ROI selection
 3 f = ianormalize(f,[0,255])
 4 
 5 mmshow(f,title='Imagem original')
 6 
 7 Sx=0.5
 8 Sy=0.5
 9 g = resize(f,Sx,Sy)
10 mmshow(g,title='Escala ('+str(Sx)+','+str(Sy)+')')
11 
12 Sx=3
13 Sy=1
14 g = resize(f,Sx,Sy)
15 adshow(g,title='Escala ('+str(Sx)+','+str(Sy)+')')
16 
17 Sx=3
18 Sy=3
19 g = resize(f,Sx,Sy)
20 mmshow(g,title='Escala ('+str(Sx)+','+str(Sy)+')')
21 
22 Sx=1
23 Sy=2
24 g = resize(f,Sx,Sy)
25 mmshow(g,title='Escala ('+str(Sx)+','+str(Sy)+')')
Warning: downcasting image from double to uint16 (may lose precision)
Warning: downcasting image from double to uint16 (may lose precision)
Warning: downcasting image from double to uint16 (may lose precision)

Imagem original

Escala (0.5,0.5)

Escala (3,1)

Escala (3,3)

Escala (1,2)