123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- % 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);
-
|