Você está na página 1de 10

RECONSTRUÇÃO DE DADOS DE RESSONÂNCIA MAGNÉTICA AMOSTRADOS DE

FORMA NÃO CARTESIANA

Thyago F. Mangueira

Universidade de Brasília, Campus Universitário Darcy Ribeiro, Brasília - CEP 70910-900


RESUMO Uma maneira de acelerar o processo de obtenção do sinal
é utilizar outras trajetórias de aquisição que geram dados em
A amostragem não cartesiana de dados no espaço K pode ser coordenadas não Cartesianas como, as trajetórias em espiral,
uma solução para aquisições mais velozes de imagens em rosette e Lissajous (Figura 2). O custo destes tipos de
Ressonância Magnética. Este trabalho teve por objetivo aquisição é a impossibilidade de se reconstruir os dados de
estudar a implementação de um algoritmo de reconstrução forma direta usando a 2D-FFT. A maneira mais simples de se
por Transformada Rápida de Fourier Não Uniforme contornar esse problema é interpolando os dados para uma
(NUFFT). Foram desenvolvidos códigos em MatLab® que grade Cartesiana e então realizar a 2D-FFT (Gridding). Outra
reconstroem uma imagem bidimensional a partir de dados alternativa é a chamada transformada direta de Fourier
simulados no espaço K com amostragem em espiral, (DrFT, do inglês direct Fourier transform), a qual pode ser
utilizando o algoritmo de interpolação (Gridding) e a 2D-FFT aplicada a amostras desigualmente espaçadas, mas que, em
através do código implementado por Fessler, 2007. termos de custo computacional, é equivalente a uma
transformada discreta de Fourier convencional.
Palvras chave— Imagem por Ressonância Magnética Aproximações da DrFT como a transformada rápida de
Nuclear (MRI), Transformada Rápida de Fourier Não Fourier generalizada (GFFT, do inglês generalized fast
Uniforme (NUFFT), Aquisição em Espiral. Fourier transform) e o algoritmo por linhas de fase iguais
(EPL, do inglês equal-phase line) podem tornar o processo
1. INTRODUÇÃO mais rápido [1-4].

Imagens médicas por ressonância magnética nuclear (MRI,


do inglês magnetic ressonance imaging) podem ser
reconstruídas com a transformada inversa de Fourier, uma
vez que os dados são adquiridos diretamente no domínio de
Fourier (ou espaço K) [1].
As amostras no espaço K, quando adquiridas com
trajetórias em grade Cartesiana — como nas chamadas
imagens eco planares (EPI do inglês echo planar imaging),
cuja trajetória no espaço K é ilustrada na Figura 1 —, podem
ser computacionalmente reconstruídas de maneira rápida
com a transformada rápida de Fourier bidimensional (A) (B)
(2D-FFT, do inglês two-dimensional fast Fourier transform).
Deve-se observar que, devido às características de aquisição
da MRI, métodos que empregam amostragem não Cartesiana
estão geralmente associados a um longo tempo de aquisição
dos dados, o que pode levar a problemas como artefatos de
movimento do paciente [1-3].

Figura 1.1 – Trajetória Cartesiana


(C)
para aquisição em MRI.
Figura 1.2 – (A) Trajetória Espiral (B) Trajetória Rosette e (C)
Reproduzido de: Sangwoo Lee,
Trajetória Lissajous ,para aquisição em MRI. Reproduzido de: (A)
Iterative reconstruction methods
e (B) Sangwoo Lee, Iterative reconstruction methods for rosette
for rosette trajectories in functional
trajectories in functional MRI, Tese de doutorado da Universidade
MRI, Tese de doutorado da
de Michigan, 2006. (C) H. Feng et all, Single-Shot MR Imaging
Universidade de Michigan, 2006.
Using Trapezoidal-Gradient Based Lissajous Trajectories, Proc.
Intl. Soc. Mag. Reson. Med. 11, 2003.
Este projeto desenvolveu dois códigos em MatLab® que Conforme a abordagem escolhida, uma vez adquirido o
reconstroem uma imagem bidimensional a partir de dados sinal deve-se realizar o Gridding. A ideia básica deste
simulados no espaço K com amostragem não Cartesiana, processo é estimar (interpolar) os valores ao longo do
utilizando a interpolação dos dados (Gridding) e uso da 2D- espaço K e então reamostrar em uma grade cartesiana.
FFT utilizado o algoritmo desenvolvido por Fessler, 2007. Assim para realizar o Gridding primeiro convolui-se os
dados adquiridos (já corrigidos pela função de densidade de
2. ASPECTOS TEÓRICOS amostragem) com um kernel de tamanho suficiente para
cobrir as regiões não amostradas. Com este novo espaço K é
A aquisição do sinal S(t) para MRI é obtido pela excitação de realizada uma amostragem (ou reamostragem) com grade
um volume alvo definido por uma espessura de corte e uma cartesiana e então os novos dados são processados com a
área de interesse (FOV). Pode-se representar a aquisição com 2D-FFT inversa. Este algoritmo é apresentado na equação 7
trajetória em espiral no espaço K com as equações 1 e 2: e 8:

𝑘𝑥 (𝑡) = 𝛾𝑡 cos 𝑡 (1) ̂ (𝑘𝑥 , 𝑘𝑦 ) = [(𝑀(𝑘𝑥 , 𝑘𝑦 ). 𝑆(𝑘𝑥 , 𝑘𝑦 )) ∗ 𝐶(𝑘𝑥 , 𝑘𝑦 )]


𝑀 (7)
𝑘𝑦 (𝑡) = 𝛾𝑡 sin 𝑡 (2)
𝑘𝑥 𝑘 𝑦
. 𝐼𝐼𝐼 ( , )
Sendo então o vetor de trajetória da espiral dado pela ∆𝑘𝑥 ∆𝑘𝑦
equação 3:
na qual M representa o espaço K sendo amostrado, S é a
𝑘(𝑡) = 𝑘𝑥 (𝑡) + 𝑖𝑘𝑦 (𝑡) (3) função de amostragem não cartesiana, C o kernel e III é a
função de amostragem cartesiana no espaço K. Após a
Esta trajetória no espaço K é gerada por variação nos 2D-FFT inversa a função fica:
gradientes de campo magnético pelas bobinas de gradiente.
Matematicamente isto é descrito pelas equações 4 e 5 : 𝑚
̂(𝑥, 𝑦) = [(𝑚(𝑥, 𝑦) ∗ 𝑠(𝑥, 𝑦)). 𝑐(𝑥, 𝑦)] (8)

𝐺𝑥 (𝑡) =
1 𝑑
[𝑘𝑥 (𝑡)] =  cos 𝑡 − 𝑡 sin 𝑡 (4) 𝑥 𝑦
𝛾 𝑑𝑡 ∗ 𝐼𝐼𝐼 ( , )
1 𝑑 𝐹𝑂𝑉𝑥 𝐹𝑂𝑉𝑦
𝐺𝑥𝑦 (𝑡) = [𝑘𝑦 (𝑡)] =  sin 𝑡 + 𝑡 cos 𝑡 (5)
𝛾 𝑑𝑡
Nota-se que neste algoritmo a imagem ideal m(x,y) é
sendo o sinal adquirido neste processo é dado por [6]: inicialmente borrada pela convolução com a função de
amostragem s(x,y). Além disso, lobos laterais serão formados
𝑆(𝑡) = ∬ 𝜌(𝑥, 𝑦, 𝑧𝑜 )𝑒 𝑖{𝑘𝑥(𝑡)𝑥+𝑘𝑦 (𝑡)𝑦} 𝑑𝑥𝑑𝑦 ≅ 𝑆(𝑘𝑥 , 𝑘𝑦 ) (6) neste processo devido ao padrão de amostragem no espaço K.
Na abordagem escolhida de aquisição em espiral, isto
Estas equações representam as etapas finais do processo acarretará em artefatos do tipo anel. Em seguida o kernel
de aquisição que envolve a excitação, seleção, codificação e c(x,y) causa uma apodização que, apesar de remover os lobos
leitura. Na Figura 3 é apresentado a sequência de pulso que laterais, provoca um indesejável efeito de borramento (que
representa todo o processo: pode ser melhorado com pós-processamento). Por último a
reamostragem cartesiana realizada por III gera réplicas no
domínio da imagem, necessitando assim de uma super-
amostragem para reduzir efeitos de aliasing. Tipicamente a
super-amostragem é realizada dobrando o grid [1].

2. MATERIAIS E MÉTODOS

Para as análises propostas foram implementados dois códigos


em MatLab® (anexos 1,2) conforme algoritmo descrito no
item 2 deste trabalho.
O primeiro código (anexo 1) inicialmente cria a trajetória
de amostragem com a densidade de para então calcular o sinal
de cada ponto na trajetória a partir das equações que definem
o fantoma. Em seguida foi realizado o processo de Gridding
com a função nufft_adj que gera a imagem reconstruída.
Figura 2.1 – Exemplo de sequência de pulso para aquisição em O segundo código (anexo 2) realiza o mesmo tipo de
espiral. Reproduzido de: Ahn C. B., Kim J. H., Cho Z. H. High- reconstrução, mas utilizando um conjunto de dados já
Speed Spiral-Scan Echo Planar NMR Imaging-I IEEE Transactions simulados fornecido pelo prof. João Luiz Azevedo de
On Medical Imaging, Vol. Mi-5, No. 1, 1986 Carvalho.
3. RESULTADOS

No primeiro código, para ser utilizado como fantoma, foi


construída uma função no domínio das frequências que cria
um disco e um retângulo deslocados do centro. Um esquema
deste fantoma no domínio da imagem é apresentado na
Figura 3.1.

Figura 3.4 – Dados obtidos para cada um dos 12 entrelaces


apresentados em uma matriz com tons de cinza em dB.

Figura 3.1 – Esquema no domínio da imagem para o fantoma


utilizado.

Com esse código foram criados e apresentados a forma de


onda do gradiente, a trajetória no espaço K, uma
representação dos dados adquiridos em dB, e a imagem
reconstruída. Estes resultados estão, respectivamente, nas
Figuras 3.2, 3.3, 3.4 e 3.5.

Figura 3.5 – Imagem reconstruída no primeiro código.

No segundo código foi extraído dos dados fornecidos as


trajetórias de aquisição (Figura 3.6) e em seguida a imagem
Figura 3.1 – Forma de onda do gradiente para aquisição em espiral. foi reconstruída (Figura 3.7).

Figura 3.2 – Trajetória no espaço k para aquisição em espiral, com Figura 3.6 – Trajetória no espaço k dos dados fornecido, com
parâmetros utilizados. parâmetros utilizados.
11. REFERENCES

[1] Pauly J. Reconstruction of non-Cartesian Data Image.


Reconstruction Textbook; pp 39-54.

[2] Jackson J. I., Meyer C. H., Nishimura D. G. Selection of a


Convolution Function for Fourier Inversion Using Gridding. IEEE
Transactions on Medical Imaging. Vol. Io. No. 3, 1991.

[3] Sangwoo Lee, Iterative reconstruction methods for rosette


trajectories in functional MRI, Tese de doutorado da Universidade
de Michigan, 2006.

[4] H. Feng et all, Single-Shot MR Imaging Using Trapezoidal-


Gradient Based Lissajous Trajectories, Proc. Intl. Soc. Mag. Reson.
Med. 11, 2003.

[5] Fessler J. A. On NUFFT-based gridding for non-Cartesian MRI,


Figura 3.7 – Imagem reconstruída no segundo código. Journal of Magnetic Resonance 188 (2007) 191–195.

4. CONSIDERAÇÕES FINAIS [6] Ahn C. B., Kim J. H., Cho Z. H. High-Speed Spiral-Scan Echo
Planar NMR Imaging-I IEEE Transactions On Medical Imaging,
O algoritmo apresentado pode ser utilizado para processar Vol. Mi-5, No. 1, 1986
rapidamente aquisições não cartesianas no espaço K, com
alguma perda na qualidade e presença de artefatos como o
efeito anel. Esta proposta requer cuidados com a não
uniformidade da densidade de amostragem, apodização e
aliasing que podem ser resolvidos ou melhorados com
funções de ponderação e compensação e com uma
super-amostragem do espaço de K interpolado.
11. ANEXOS

11.1. Anexo 1

%Este código foi escrito como projeto da Disciplina de Processamento de


%Imagens com a prof. Mylène C.Q. de Farias no primeiro semestre de 2014 por
%Thyago Fressatti Mangueira.

%O código cria uma aquisição em espiral de uma figura constituída de um


%disco e um retângulo deslocados do centro. Os objetos geométricos são
%criados e deslocados já no espaço de fase k. Em seguida a imagem é
%reconstruída utilizando a NUFFT implementada por Prof. Jefrey A. Fessler e
%outras funções implementadas por Prof. João Luiz Azevedo de Carvalho

%usa as funções spiraltrajectory, jinc, sinc, nufftoffset,


%nufft_table_init, nufft_init e nufft_adj

clear;
close all;
clc;

cd('C:\Users\Thyago\Dropbox\1-Doutorado\Processamento de Imagens\Projeto\homework
sobre 2DFT e amostragem\ee591-fall2004-homework4\fessler');
setup

% krange=(-128:127)/256;
% [kx ky] = meshgrid(krange,krange);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%criando trajetória espiral
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

maxfov = 128; %fild of view (128)


spatres = 1.4; %resolução espacial (1.4)
densityreductionfactor = 1; %fator de redução de densidade (1)
nintl = 12; %número de entrelaces (12)

[kspacetraj,denscompfunc,gradwvfrm,nread] =
spiraltrajectory(maxfov,spatres,densityreductionfactor,nintl);

%kspacetraj = Trajetória no espaço K


%denscompfunc = Density compensation functions
%gradwvfrm = Forma de onda do Gradiente
%nread = number of readout points (numero de pontos em cada braço de espiral)

kx = real(kspacetraj);
ky = imag(kspacetraj);

%figure, plot(kx,ky,'.')
figure,plot(gradwvfrm),title('Forma de onda do Gradiente'),
figure,plot(kx,ky,'.'),title({['Trajetórias no espaço K com ',num2str(nintl),'
entrelaces'];['e ',num2str(nread),' pontos em cada braço de espiral']}),axis
square,axis([-1 1 -1 1]/2)
xlabel({'kx';['Duração da leitura: ',num2str(nread*4/1000),' ms']})
ylabel('ky')

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%fazendo fantoma com um circulo e um quadrado deslocados
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

kr=sqrt(kx.^2+ky.^2); %módulo do vetor posição de cada ponto


da espiral

tx_circ=25*25*jinc(25*kr); %criando o circulo


tx_rect = 5*30*sinc(5*kx).*sinc(30*ky); %criando o quadrado

tx = tx_circ .* exp(-j*2*pi*kx*30) + tx_rect .* exp(-j*2*pi*(-10*kx + 20*ky));


%dados em espiral do fantoma

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%criando a estrutura st com parâmetros para inicializar a inuFFT
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%colocando as trajetórias no espaço k em um vetor k


k=kspacetraj.';
k=k(:);

om(:,1) = 2*pi*real(k); % frequencias "digitais" em radianos


om(:,2) = 2*pi*imag(k);

pixels = ceil(maxfov/spatres); % tamanho da imagem


if mod(pixels,2), pixels=pixels+1; end; % o número de pixels precisa ser ímpar
Nx=pixels; Ny=pixels; % imagem quadrada
Nd = [Nx,Ny]; % dimensões da imagem

%?????????????
Jd = [6,6]; %tamanho do kernel (6x6) max (16x16)
overgridfactor = 2; %(intensidade do aliasing (2)
%?????????????

st=nufft_init(om, Nd, Jd, overgridfactor*Nd, Nd/2); %condições iniciais

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Realizando a FFT não uniforme inversa (inuFFT)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

disp('calculando a inuFFT...'),pause(.1),tic

d=tx.'; %colocando tx na forma de vetor


d=d(:);

w=denscompfunc.'; %colocando a função de compensação


de densidade na forma de vetor
w=w(:);
weighteddata = d.*w; %dados ponderados

im = nufft_adj(weighteddata,st)/sqrt(Nx*Ny); %imagem recosntruída

toc,pause(.1)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Apresentando os resultados
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

figure
subplot(2,2,1), imagesc(20*log10(abs(tx_circ)/max(abs(tx_circ(:)))),[-60 0]),
title('tx circ');
subplot(2,2,2), imagesc(20*log10(abs(tx_rect)/max(abs(tx_rect(:)))),[-60 0]),
title('tx rect');

subplot(2,2,3), imagesc(20*log10(abs(tx)/max(abs(tx(:)))),[-60 0]), title('tx');

subplot(2,2,4), imshow(abs(im),[]),title('imagem reconstruida');


11.2. Anexo 2

%Este código foi escrito como projeto da Disciplina de Processamento de


%Imagens com a prof. Mylène C.Q. de Farias no primeiro semestre de 2014 por
%Thyago Fressatti Mangueira.

%O código lê uma aquisição em espiral fornecida pelo Prof. João Luiz


%Azevedo de Carvalho. Em seguida a imagem é reconstruída utilizando a NUFFT
%implementada por Prof. Jefrey A. Fessler e outras funções implementadas
%por Prof. João Luiz Azevedo de Carvalho.

%usa as funções spiraltrajectory, jinc, sinc, nufftoffset,


%nufft_table_init, nufft_init e nufft_adj

clear;
close all;
clc;

cd('C:\Users\Thyago\Dropbox\1-Doutorado\Processamento de Imagens\Projeto\homework
sobre 2DFT e amostragem\ee591-fall2004-homework4\fessler');
setup

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%lendo fantoma fornecido pelo Prof. João Luiz Azevedo de Carvalho
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

load rt_spiral

%kspacetraj = Trajetória no espaço K


%denscompfunc = Density compensation functions
%nread = number of readout points (numero de pontos em cada braço de espiral)

kspacetraj = k;
denscompfunc = w;
spatres = 1.2;
maxfov = 128;
nintl = size(k,2);
nread = size(k,1);

kx = real(kspacetraj);
ky = imag(kspacetraj);

%figure, plot(kx,ky,'.')
figure,plot(kx,ky,'.'),title({['Trajetórias no espaço K com ',num2str(nintl),'
entrelaces'];['e ',num2str(nread),' pontos em cada braço de espiral']}),
axis square,axis([-1 1 -1 1]/2)
xlabel({'kx';['Duração da leitura: ',num2str(nread*4/1000),' ms']})
ylabel('ky')

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%fazendo fantoma com um circulo e um quadrado deslocados
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
kr=sqrt(kx.^2+ky.^2); %módulo do vetor posição de cada ponto
da espiral

tx_circ=25*25*jinc(25*kr); %criando o circulo


tx_rect = 5*30*sinc(5*kx).*sinc(30*ky); %criando o quadrado

tx = tx_circ .* exp(-j*2*pi*kx*15) + tx_rect .* exp(-j*2*pi*(-10*kx + 10*ky));


%fantoma

tx = d;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%criando a estrutura st com parâmetros para inicializar a inuFFT
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%colocando as trajetórias no espaço k em um vetor k


k=kspacetraj.';
k=k(:);

om(:,1) = 2*pi*real(k); % frequencias "digitais" em radianos


om(:,2) = 2*pi*imag(k);

pixels = ceil(maxfov/spatres); % tamanho da imagem


if mod(pixels,2), pixels=pixels+1; end; % o número de pixels precisa ser ímpar
Nx=pixels; Ny=pixels; % imagem quadrada
Nd = [Nx,Ny]; % dimensões da imagem

%?????????????
Jd = [6,6]; %tamanho do kernel (6x6) max (16x16)
overgridfactor = 2; %(intensidade do aliasing (2)
%?????????????

st=nufft_init(om, Nd, Jd, overgridfactor*Nd, Nd/2); %condições iniciais

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Realizando a FFT não uniforme inversa (inuFFT)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

disp('calculando a inuFFT...'),pause(.1),tic

d=tx.'; %colocando tx na forma de vetor


d=d(:);

w=denscompfunc.'; %colocando a função de compensação


de densidade na forma de vetor
w=w(:);
weighteddata = d.*w; %dados ponderados

im = nufft_adj(weighteddata,st)/sqrt(Nx*Ny); %imagem recosntruída


toc,pause(.1)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Criando FFT da imagem final
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

im_fft=fft2(im);
im_fft=fftshift(im_fft);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Apresentando os resultados
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

figure

subplot(2,2,1), imagesc(20*log10(abs(tx)/max(abs(tx(:)))),[-60 0]), title('tx');

subplot(2,2,2), imshow(abs(im),[]),title('imagem reconstruida');

subplot(2,2,3), imshow(20*log10(abs(im_fft)/max(abs(im_fft(:)))),[-60 0]), colormap


gray, title('FFT 2D da imagem');

Você também pode gostar