-
Notifications
You must be signed in to change notification settings - Fork 8
/
reconSCFpyr.m
executable file
·87 lines (74 loc) · 4.37 KB
/
reconSCFpyr.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
% RES = reconSCFpyr(PYR, INDICES, LEVS, BANDS, TWIDTH)
%
% The inverse of buildSCFpyr: Reconstruct image from its complex steerable pyramid representation,
% in the Fourier domain.
%
% The image is reconstructed by forcing the complex subbands to be analytic
% (zero on half of the 2D Fourier plane, as they are supossed to be unless
% they have being modified), and reconstructing from the real part of those
% analytic subbands. That is equivalent to compute the Hilbert transforms of
% the imaginary parts of the subbands, average them with their real
% counterparts, and then reconstructing from the resulting real subbands.
%
% PYR is a vector containing the N pyramid subbands, ordered from fine
% to coarse. INDICES is an Nx2 matrix containing the sizes of
% each subband. This is compatible with the MatLab Wavelet toolbox.
%
% LEVS (optional) should be a list of levels to include, or the string
% 'all' (default). 0 corresonds to the residual highpass subband.
% 1 corresponds to the finest oriented scale. The lowpass band
% corresponds to number spyrHt(INDICES)+1.
%
% BANDS (optional) should be a list of bands to include, or the string
% 'all' (default). 1 = vertical, rest proceeding anti-clockwise.
%
% TWIDTH is the width of the transition region of the radial lowpass
% function, in octaves (default = 1, which gives a raised cosine for
% the bandpass filters).
% Javier Portilla, 7/04, basing on Eero Simoncelli's Matlab Pyrtools code
% and our common code on texture synthesis (textureSynthesis.m).
function res = reconSCFpyr(pyr, indices, levs, bands, twidth)
%%------------------------------------------------------------
%% DEFAULTS:
if ~exist('levs'),
levs = 'all';
end
if ~exist('bands')
bands = 'all';
end
if ~exist('twidth'),
twidth = 1;
elseif (twidth <= 0)
fprintf(1,'Warning: TWIDTH must be positive. Setting to 1.\n');
twidth = 1;
end
%%------------------------------------------------------------
pind = indices;
Nsc = log2(pind(1,1)/pind(end,1));
Nor = (size(pind,1)-2)/Nsc;
for nsc = 1:Nsc,
firstBnum = (nsc-1)*Nor+2;
%% Re-create analytic subbands
dims = pind(firstBnum,:);
ctr = ceil((dims+0.5)/2);
ang = mkAngle(dims, 0, ctr);
ang(ctr(1),ctr(2)) = -pi/2;
for nor = 1:Nor,
nband = (nsc-1)*Nor+nor+1;
ind = pyrBandIndices(pind,nband);
ch = pyrBand(pyr, pind, nband);
ang0 = pi*(nor-1)/Nor;
xang = mod(ang-ang0+pi, 2*pi) - pi;
amask = 2*(abs(xang) < pi/2) + (abs(xang) == pi/2);
amask(ctr(1),ctr(2)) = 1;
amask(:,1) = 1;
amask(1,:) = 1;
amask = fftshift(amask);
ch = ifft2(amask.*fft2(ch)); % "Analytic" version
%f = 1.000008; % With this factor the reconstruction SNR goes up around 6 dB!
f = 1;
ch = f*0.5*real(ch); % real part
pyr(ind) = ch;
end % nor
end % nsc
res = reconSFpyr(pyr, indices, levs, bands, twidth);