我陷入了一个问题。我需要对医学图像的正弦图执行傅里叶切片定理。
我读了很多关于这个定理的文章。我写了一个 matlab 代码,但结果在傅立叶逆变换后总是无意义的。但傅立叶空间似乎没问题。
我通过将极坐标转换为笛卡尔坐标来填充傅立叶空间。我在每条正弦图线上使用 ftt 命令应用一维快速傅里叶变换。在每个角度(我使用 180 旋转角度)和半径值之后,我将其转换为笛卡尔坐标,并且对于每个对应的值 G(theta, radius) ==> F(x,y) 我填充了傅立叶空间。这似乎合乎逻辑,但结果却不是。如何更正我的代码以运行此算法?
圆形是傅立叶空间,其他无意义的图像是ifft。原始图像是二元肝脏,但我无法添加它。
谢谢!
另外,我的matlab代码!
[![I=imread('binaryliver.png');
% I = im2bw(I, 0.1);
%Sinogram was calculated before for 180 angle!
\[w,h\] = size(I);
theta = 0:1:179;][1]][1]
xorg = floor(h/2);
yorg = floor(w/2); %for find origin of matrix
F = zeros(w,h); %fourier space assigment
for i = 1:length(theta)
E(:,:,i) = fft(sinogram(i,:)); %calculate FFT for each line of sinogram
end
for i = 1:length(theta)
for r = 1: length(E(:,:,1)) %Convert polar coordinates to cartesian coordinates
x = xorg + (r-h/2+1)*cosd(-theta(i));
y = yorg + (r-w/2+1)*sind(-theta(i));
if x == 0 && y == 0 %
else
yy = round(y); xx = round(x);
if yy <= 0
yy = 1;
elseif yy > h
yy = h;
end
if xx <= 0
xx = 1;
elseif xx > w
xx = w;
end
value = E(1,r,i);
F(xx, yy) = value;
end
end
end
Im2=abs(ifft2(F));
figure; imshow(log(1+abs(F)),[]);
figure; imshow(Im2, []);