Danilo R. Pereira - Exercicio 14 - Dia de entrega 31/05/2011

1 - Introdução

  • Função responsável por calcular a correlação de fase 2D para translação e rotação.

1.1 - Passo a passo

  • Verificar as dimensões das imagens, (se possivél eliminar as bordas)
  • Aplicar a FFT nas imagens de entrada.
  • Conversão do espectro para coordenadas polares
  • Aplicar a correlação de fase
  • Aplicar a FFT inversa.
  • Aplicar a correlação de fase (coor. polares) na imagem original e na imagem rotacionada.
  • Obter o ângulo de rotação estimado.
  • Rotacionar a imagem modificado de acordo com o valor estimado.

2 - Código-fonte

2.1 - Função auxiliar - (Conversão para coordenadas polares)

  • g = icTransformacaoPolar(f, M, N)

    • Saída
      • g: Imagem em coordenadas polares.
    • Entrada
      • f: Imagem original. Obrigatório
      • M, N: Dimensões da imagem. Obrigatório
 1 from ia636 import *
 2 from numpy import *
 3 
 4 def icTransformacaoPolar(f, M, N):
 5 
 6     m,n = f.shape
 7 
 8     R1 = floor(m/2)
 9     R2 = floor(n/2)
10 
11     R = max(R1,R2)
12     b = R/M
13     a = pi/N
14 
15     y1,x1 = meshgrid(arange(N),arange(M))
16 
17     ro = a * x1
18     theta = b * y1
19 
20     XI = R + (theta)* cos(ro)
21     YI = R + (theta)* sin(ro)
22 
23     g = iainterpolclosest(f, (YI,XI))
24 
25     return g

2.2 - Função para encontrar a Correlação de fase (Coordenadas polares)

  • h = phaseCorrelationPolar(f, g)

    • Saída
      • h: FFT da transformação polar.
    • Entrada
      • f: Imagem original. Obrigatório
      • g: Imagem modificada (Rotação ou translação). Obrigatório
 1 from numpy import *
 2 from ia636 import *
 3 
 4 def phaseCorrelationPolar(f,g):
 5 
 6     # Calculando as FFT´s
 7     F = fft.fftn(f)
 8     G = fft.fftn(g)
 9 
10     # FFT polar do espectro da imagem
11     FPolar = icTransformacaoPolar(F,F.shape[0],F.shape[1])
12     GPolar = icTransformacaoPolar(G,G.shape[0],G.shape[1])
13 
14     # FFT da transformação polar
15     x = fft.fftn(FPolar)
16     y = fft.fftn(GPolar)
17 
18     # Correlação de fase para Coordenadas Polares
19     R = (x * conjugate(y)) /(abs(x * conjugate(y)))
20 
21     result = fft.ifftn(R)
22 
23     return abs(result)

3 - Exemplos

  • Demostração da função atráves de imagens 2D.

3.1 - Exemplos com imagens - (Rotação de 6°)

 1 import dicom
 2 import numpy as np
 3 from ia636 import *
 4 from pedroferro86.iamosaic import iamosaic
 5 
 6 filename = 'PHILIPS/DICOM/IM_0007'
 7 dataset = dicom.read_file(find_attachment_file(filename))
 8 data = dataset.pixel_array.astype(float64)
 9 imgOriginal = iamosaic(data,1,100,1,'XY')
10 adshow(imgOriginal, title ='Figura a) - Imagem Original.')
11 
12 th= pi/30
13 
14 Trotacao  = [[cos(th),-sin(th),0], [sin(th),cos(th),0], [0,0,1]]
15 
16 g = iaffine(imgOriginal,Trotacao)
17 adshow(g, title ='Figura b) - Imagem Rotacionada. 6°')
18 
19 r = phaseCorrelationPolar(imgOriginal,g)
20 
21 peak = unravel_index(argmax(r), r.shape)
22 
23 anguloEstimado = mod((float(peak[1])/r.shape[1]) * pi, pi)
24 
25 print "\n************************** RESULTADOS ********************************"
26 
27 print "\nO ângulo de rotação (RADIANOS) estimado foi: ", anguloEstimado
28 print "\nO angulo de rotação (GRAUS) estimado foi: ", (180/pi) * anguloEstimado
29 
30 print "\n**********************************************************************"
************************** RESULTADOS ********************************

O ângulo de rotação (RADIANOS) estimado foi:  0.0841498032212

O angulo de rotação (GRAUS) estimado foi:  4.82142857143

**********************************************************************

Figura a) - Imagem Original.

Figura b) - Imagem Rotacionada. 6°

3.2 - Exemplos com imagens - (Rotação de 9°)

 1 import dicom
 2 import numpy as np
 3 from ia636 import *
 4 from pedroferro86.iamosaic import iamosaic
 5 
 6 filename = 'PHILIPS/DICOM/IM_0007'
 7 dataset = dicom.read_file(find_attachment_file(filename))
 8 data = dataset.pixel_array.astype(float64)
 9 imgOriginal = iamosaic(data,1,100,1,'XY')
10 adshow(imgOriginal, title ='Figura c) - Imagem Original.')
11 
12 th= pi/20
13 
14 TrotacaoX  = [[cos(th),-sin(th),0], [sin(th),cos(th),0], [0,0,1]]
15 
16 g = iaffine(imgOriginal,TrotacaoX)
17 adshow(g, title ='Figura d) - Imagem Rotacionada. 9°')
18 
19 r = phaseCorrelationPolar(imgOriginal,g)
20 
21 peak = unravel_index(argmax(r), r.shape)
22 
23 anguloEstimado = mod((float(peak[1])/r.shape[1]) * pi, pi)
24 
25 print "\n************************** RESULTADOS ********************************"
26 
27 print "\nO ângulo de rotação (RADIANOS) estimado foi: ", anguloEstimado
28 
29 print "\nO angulo de rotação (GRAUS) estimado foi: ", (180/pi) * anguloEstimado
30 
31 print "\n**********************************************************************"
************************** RESULTADOS ********************************

O ângulo de rotação (RADIANOS) estimado foi:  0.182324573646

O angulo de rotação (GRAUS) estimado foi:  10.4464285714

**********************************************************************

Figura c) - Imagem Original.

Figura d) - Imagem Rotacionada. 9°

3.3 - Translação

 1 import dicom
 2 import numpy as np
 3 from ia636 import *
 4 from pedroferro86.iamosaic import iamosaic
 5 
 6 adshow(imgOriginal, title ='Figura e) - Imagem Original.')
 7 print imgOriginal.shape
 8 x = 40
 9 y = 0
10 
11 Tt   = [[1,0,y], [0,1,x], [0,0,1]]
12 
13 g = iaffine(imgOriginal,Tt)
14 
15 adshow(g, title ='Figura f) - Imagem Translada.')
16 
17 r = phaseCorrelationPolar(imgOriginal,g)
18 
19 peak = unravel_index(argmax(r), r.shape)
20 
21 print "\n************************** RESULTADOS ********************************"
22 print "\nA melhor correlação foi encontrada da posição: ", peak
23 print "\n**********************************************************************"
(224, 224)

************************** RESULTADOS ********************************

A melhor correlação foi encontrada da posição:  (215, 214)

**********************************************************************

Figura e) - Imagem Original.

Figura f) - Imagem Translada.

5 - Conclusão

  • Atráves dos exemplos (utilizando imagens de um exame de ressonância magnetíca), podemos perceber que a função phaseCorrelationPolar apresentou resultados bastante próximos do esperado. Outra observação interessante, é , em relação do tempo de execução ser bastante rápido.