1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- % RES = reconLpyr(PYR, INDICES, LEVS, FILT2, EDGES)
- %
- % Reconstruct image from Laplacian pyramid, as created by buildLpyr.
- %
- % 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). The finest scale is number 1. The lowpass band
- % corresponds to lpyrHt(INDICES)+1.
- %
- % FILT2 (optional) can be a string naming a standard filter (see
- % namedFilter), or a vector which will be used for (separable)
- % convolution. Default = 'binom5'. EDGES specifies edge-handling,
- % and defaults to 'reflect1' (see corrDn).
- % Eero Simoncelli, 6/96
- function res = reconLpyr(pyr, ind, levs, filt2, edges)
- if (nargin < 2)
- error('First two arguments (PYR, INDICES) are required');
- end
-
- %%------------------------------------------------------------
- %% DEFAULTS:
- if (exist('levs') ~= 1)
- levs = 'all';
- end
- if (exist('filt2') ~= 1)
- filt2 = 'binom5';
- end
- if (exist('edges') ~= 1)
- edges= 'reflect1';
- end
- %%------------------------------------------------------------
- maxLev = 1+lpyrHt(ind);
- if strcmp(levs,'all')
- levs = [1:maxLev]';
- else
- if (any(levs > maxLev))
- error(sprintf('Level numbers must be in the range [1, %d].', maxLev));
- end
- levs = levs(:);
- end
- if isstr(filt2)
- filt2 = namedFilter(filt2);
- end
- filt2 = filt2(:);
- res_sz = ind(1,:);
- if any(levs > 1)
- int_sz = [ind(1,1), ind(2,2)];
-
- nres = reconLpyr( pyr(prod(res_sz)+1:size(pyr,1)), ...
- ind(2:size(ind,1),:), levs-1, filt2, edges);
-
- if (res_sz(1) == 1)
- res = upConv(nres, filt2', edges, [1 2], [1 1], res_sz);
- elseif (res_sz(2) == 1)
- res = upConv(nres, filt2, edges, [2 1], [1 1], res_sz);
- else
- hi = upConv(nres, filt2, edges, [2 1], [1 1], int_sz);
- res = upConv(hi, filt2', edges, [1 2], [1 1], res_sz);
- end
- else
-
- res = zeros(res_sz);
- end
- if any(levs == 1)
- res = res + pyrBand(pyr,ind,1);
- end
|