Files
fold_slice/+utils/apply_3D_apodization.m
2026-08-07 15:56:42 +09:00

44 lines
1.6 KiB
Matlab

% APPLY_3D_APODIZATION Smoothly apodize tomogram to avoid sharp edges and air affecting
% the FRC analysis
%
% [tomogram,circulo] = apply_3D_apodization(tomogram, rad_apod, axial_apod, radial_smooth)
%
% Inputs:
% **tomogram - volume to be apodized
% **rad_apod - number of pixels to be zeroed from edge of the tomogram
% **axial_apod - roughly number of pixels to be zeroed from top / bottom
% **radial_smooth - smoothness of the apodization in pixels, default = Npix/10
% **layer_dim
% Outputs:
% ++tomogram - apodized volume
% ++circulo -apodization mask
% MODIFIED BY YJ TO ALLOW UNEVEN SIZES
function [tomogram,circulo] = apply_3D_apodization(tomogram, rad_apod, axial_apod, radial_smooth )
import utils.*
[Npix_y,Npix_x,Nlayers] = size(tomogram);
Npix = max(Npix_y,Npix_x);
if nargin < 4
radial_smooth = Npix/10;
end
if nargin < 3
axial_apod = [];
end
if ~isempty(rad_apod)
xt = -Npix/2:Npix/2-1;
[X,Y] = meshgrid(xt,xt);
radial_smooth = max(radial_smooth,1); % prevent division by zero
circulo= single(1-radtap(X,Y,radial_smooth,round(Npix/2-rad_apod-radial_smooth)));
if Npix_y~=Npix_x
circulo= crop_pad( circulo, [Npix_y,Npix_x]);
end
tomogram = bsxfun(@times, tomogram, circulo);
end
if ~isempty(axial_apod) && Nlayers > 1
filters = fract_hanning_pad(Nlayers,Nlayers,max(0,round(Nlayers-2*axial_apod)));
filters = ifftshift(filters(:,1));
tomogram = bsxfun(@times,tomogram,reshape(filters,1,1,[]));
end
end