Receiving NaN when using iradon function

1 次查看(过去 30 天)
I'm tring the inverse radon transform of image, but I receive NaN error when I use iradon function.
Doen anyone know why is this happening and how to solve the problem?
Here is the code used to make the image.
theta = 0:1:359; % [Degree]
theta_rad = theta*pi/180; % [Radian]
x = -600:600; % [um] 1 px = 1 um
y = -600:600; % [um] 1 px = 1 um
sw = 100; % FWHM of source size : 100 um
% Making source image on the source plane
s = zeros([1201,1201]);
for n = 1:1201 % Index for x coordinate
for l = 1:1201 % Index for y coordinate
s(l,n) = exp(-4*log(2)*(x(n)^2/sw^2 + y(l)^2/sw^2)/2);
end
end
figure(1)
imagesc(s)
title('Source image'); colorbar()
% Maing aperture with size of 500 um
aper = zeros([1201,1201]);
for n = 1:1201 % Index for x coordinate
for k = 1:1201 % Index for y coordinate
if x(n)^2 + y(k)^2 <= 250^2
aper(k,n) = 1;
end
end
end
figure(2)
imagesc(aper)
title('Aperture'); colorbar()
%% 2D FFT
S = fftshift(fft2(s)); % Source in spatial frequncy domain
AP = fftshift(fft2(aper)); % Aperture in spatial frequency domain
% H1 and H2 should be replaced with proper function
H1 = 1; % Free space propagation transfer function from source to aperture
H2 = 1; % Free space propagation transfer function from aperture to detector
OBJ = H2.*AP.*H1.*S; % Penumbra image on detector plane in spatial frequency domain
obj = ifftshift(ifft2(OBJ)); % Penumbra image on detector plane in real space domain
figure(3)
imagesc(abs(obj))
Nprofile=length(theta_rad);
rho_start=0;
rho_end=600;
[x_start, y_start]=pol2cart(theta_rad,repelem(rho_start,1,Nprofile));
xs=x_start+600;
ys=y_start+600;
[x_end, y_end]=pol2cart(theta_rad, repelem(rho_end,1,Nprofile));
xe=x_end+600;
ye=y_end+600;
Npoint=600;
profile=zeros(Npoint,1,Nprofile);
for k=1:Nprofile
profile(:,:,k)=improfile(obj,[xs(k) xe(k)],[ys(k) ye(k)],Npoint);
end
display_profile=permute(flipud(profile), [1 3 2]);
figure
imagesc(abs(display_profile));
abdis=abs(display_profile);
%differentiation of radial profile image
figure
Y=diff(abdis,1,1);
imagesc(imfilter(abs(Y),ones(35)/35,'replicate'))
YY=imfilter(abs(Y),ones(35),'replicate');
A=iradon(YY,theta);
figure
imagesc(A)

回答(1 个)

Benjamin Thompson
编辑:Benjamin Thompson 2022-3-2
You can use max(max(isnan(xe))) to check if any variables created while running your code have a NaN. Looking through them after running your code, improfile is getting complex-valued image input and per its documentation it does not support that data type. That would be my guess why NaNs start to appear in the output of the code at that point.
  2 个评论
Minseo Jeong
Minseo Jeong 2022-3-3
What do you mean by 'per its documentation it does not support that data type.'?
Benjamin Thompson
If you type the command "doc improfile" in MATLAB, or go to the documentation of the function online at https://www.mathworks.com/help/images/ref/improfile.html?s_tid=srchtitle_improfile_1, you will see that the datatypes allowable for the input image argument do not include complex arrays.
I Input image
RGB image | grayscale image | binary image
Input image, specified as an RGB image, grayscale image, or binary image.
Data Types: single | double | int16 | uint8 | uint16 | logical

请先登录,再进行评论。

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by