Exercício 3 - Relatório

Autor: andrelau
Data: 15/03/2011

1. Função iamosaic

A função iamosaic [1] cria uma grade de imagens bidimensionais justapostas (mosaico) a partir de uma imagem tridimesional. Podem ser escolhidos os planos 'XY', 'XZ' e 'YZ' de uma imagem 3D com dimensões [Z,Y,X] (notação matricial do python).

Além de poder especificar o plano, o usuário pode também especificar o número de imagens desejadas, a imagem inicial e o número de colunas no mosaico.

Abaixo está o código da função iamosaic com comentários sobre as operações realizadas em cada etapa.

  • g = iamosaic(f, N, n, X, view='XY')
    • g: Image.
    • f: Image. input image.
    • N: number of images.
    • X: initial image.
    • n: images per row.
    • plane: String. chosen plane. Possible values: 'XY', 'XZ', 'YZ'.
 1 def iamosaic(f, N, X, n, plane='XY'):
 2 
 3     import numpy as np
 4 
 5     # Obtêm as dimensões do volume em três variáveis
 6     slice,row,column = f.shape
 7 
 8     # === 1ª PARTE - REALIZA TRANSFORMAÇÕES NOS EIXOS DO VOLUME ====
 9     # O objetivo das transformações é rotacionar o volume de forma que o
10     # plano desejado passe a ter os eixos X e Y.
11 
12     # PLANO 'XY'
13     if plane == 'XY':
14 
15         # As duas linhas abaixo determinam a faixa de fatias (imagens) que serão colocadas
16         # no mosaico. a função min() está sendo usada para garantir que os parâmetros de imagem
17         # inicial e número de imagens não estejam levando a faixa desejada para além da dimensão
18         # do volume.
19         # Essas operações são realizadas de forma similar para os planos 'XZ' e 'YZ'.
20         Xini = min(X,slice)-1
21         Xend = min(X+N,slice+1)-1
22 
23         # Cria uma cópia superficial do volume, eliminando a faixa de fatias não desejada.
24         froi = f[Xini:Xend,:,:]
25 
26     # PLANO 'XZ'
27     elif plane == 'XZ':
28 
29         # Determinação da faixa desejada
30         Xini = min(X,row)-1
31         Xend = min(X+N,row+1)-1
32 
33         # Cria uma cópia superficial do volume, eliminando a faixa de fatias não desejada.
34         froi = f[:,Xini:Xend,:]
35 
36         # Transformações para posicionar o plano XZ no plano de visualização (XY)
37         # Inversão do eixo Z
38         temp = froi[::-1,:,:]
39 
40         # Transposição dos eixos Z e Y (1,0,2)
41         # Transposição dos eixos X e Y para rotacionar as imagens resultantes em
42         # decorrência de uma especificação da aplicação. Acontece apenas para este
43         # plano.
44         froi = temp.transpose(1,2,0)
45 
46     # Plano 'YZ'
47     elif plane == 'YZ':
48 
49         # Determinação da faixa desejada
50         Xini = min(X,column)-1
51         Xend = min(X+N,column+1)-1
52 
53         # Cria uma cópia superficial do volume, eliminando a faixa de fatias não desejada.
54         froi = f[:,:,Xini:Xend]
55 
56         # Transformações para posicionar o plano YZ no plano de visualização (XY)
57         # Inversão do eixo Z
58         temp = froi[::-1,:,:]
59 
60         # Transposição dos eixos Z e X
61         froi = temp.transpose(2,1,0)
62 
63     # === 2ª PARTE - CRIA O MOSAICO DO VOLUME TRANSFORMADO ===============
64 
65     # Obtém as dimensões do novo volume em três variáveis
66     sliceS,rowS,columnS = froi.shape
67 
68     # Calcula a quantidade de linhas necessárias para criar o mosaico. Uma linha nesse caso
69     # não é uma única posição de uma matriz, mas sim uma região suficiente para colocar uma
70     # imagem completa
71     Nlinhas = np.ceil(float(sliceS)/n)
72 
73     # Calcula quantas "células" do mosaico não serão ocupadas (Nº_de_células - Nº_de_imagens)
74     Ifalt = Nlinhas*n-sliceS
75 
76     # Realiza uma transformação de volume para plano. Cada fatia do eixo Z é colocada
77     # sequencialmente abaixo umas das outras ampliando o eixo Y.
78     temp0 = froi.reshape((sliceS*rowS,columnS))
79 
80     # Transforma a coluna de imagens bidimensionais em uma linha de imagens bidimensionais
81     temp1 = np.hstack((np.vsplit(temp0,sliceS)))
82 
83     # Se houver "células" não preenchidas, preenche com fundo preto
84     if Ifalt:
85         background = np.zeros((rowS,columnS*Ifalt))
86         temp2 = np.hstack((temp1,background))
87     else:
88         temp2 = temp1
89 
90     # Realiza a divisão da linha de imagens e o empilhamento vertical, resultando na
91     # imagem-mosaico de saída
92     g = np.vstack((np.hsplit(temp2,Nlinhas)))
93 
94     # Altera o tipo de dados da imagem de saída para 'int32'
95     g = g.astype(np.int32)
96 
97     return g

Exemplos:

O código abaixo gera mosaicos de diferentes planos de uma Imagem de Tensores de Difusão tridimensional do cérebro.

 1 from ia636 import iamosaic, ianormalize
 2 from pedroferro86.projetoCCfuncaoMat import *
 3 
 4 # Carrega a imagem
 5 filename = 'difusao/Paciente1_dataset1/p1d1 - roi.mat'
 6 eigvals,eigvects = carregaMat(filename)
 7 
 8 # Converte os valores dos voxels do volume para uma escala de 0 a 1
 9 eigvals = eigvals/eigvals.max()
10 
11 # Cria o mosaico do plano 'XY', normaliza e exibe
12 adshow(ianormalize(iamosaic(255*eigvals[0],96,1,8,'XY')), "Mosaico do plano 'XY'")
13 # Cria o mosaico do plano 'XZ', normaliza e exibe
14 adshow(ianormalize(iamosaic(255*eigvals[0],96,1,8,'XZ')), "Mosaico do plano 'XZ'")
15 # Cria o mosaico do plano 'YZ', normaliza e exibe
16 adshow(ianormalize(iamosaic(255*eigvals[0],96,1,8,'YZ')), "Mosaico do plano 'YZ'")
ERROR execute
/usr/lib/python2.6/dist-packages/scipy/io/matlab/mio.py:84: FutureWarning: Using struct_as_record default value (False) This will change to True in future versions
  return MatFile5Reader(byte_stream, **kwargs)
------------------------------------------------------------
*** Exception while evaluating code:
  File "<string>", line 12, in <module>
TypeError: iamosaic() takes at most 3 arguments (5 given)

------------------------------------------------------------

[1]Função iamosaic. http://parati.dca.fee.unicamp.br/adesso/wiki/ia636/iamosaic/view/. Último acesso em 16/03/2011

1.1 Validação da função iamosaic

Validação da função iamosaic. Última atualização em 16/03/2011.

1.2 Nova proposta para a função iamosaic

Nova função *iamosaic* proposta. Última atualização em 20/03/2011.

2. Função adshow

Realizados testes com a função adshow() para verificar qual o tratamento que ela aplica a imagens de diferentes tipos de dados. Última atualização em 20/03/2011.

A lesson da função adshow() pode ser verificada no Exercício 4.