123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- % RES = reconSpyr(PYR, INDICES, FILTFILE, EDGES, LEVS, BANDS)
- %
- % Reconstruct image from its steerable pyramid representation, as created
- % by buildSpyr.
- %
- % 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.
- %
- % FILTFILE (optional) should be a string referring to an m-file that returns
- % the rfilters. examples: sp0Filters, sp1Filters, sp3Filters
- % (default = 'sp1Filters').
- % EDGES specifies edge-handling, and defaults to 'reflect1' (see
- % corrDn).
- %
- % 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.
- % Eero Simoncelli, 6/96.
- function res = reconSpyr(pyr, pind, filtfile, edges, levs, bands)
- %%------------------------------------------------------------
- %% DEFAULTS:
- % Deterimine whether a MEX version of upConv is available
- is_mex = true;
- finfo = functions( @upConv );
- if( strcmp( finfo.file((end-2):end), '.m') )
- is_mex = false;
- end
- if (exist('filtfile') ~= 1)
- filtfile = 'sp1Filters';
- end
- if (exist('edges') ~= 1)
- edges= 'reflect1';
- end
- if (exist('levs') ~= 1)
- levs = 'all';
- end
- if (exist('bands') ~= 1)
- bands = 'all';
- end
- %%------------------------------------------------------------
- if (isstr(filtfile) & (exist(filtfile) == 2))
- [lo0filt,hi0filt,lofilt,bfilts,steermtx,harmonics] = eval(filtfile);
- nbands = spyrNumBands(pind);
- if ((nbands > 0) & (size(bfilts,2) ~= nbands))
- error('Number of pyramid bands is inconsistent with filter file');
- end
- else
- error('filtfile argument must be the name of an M-file containing SPYR filters.');
- end
- maxLev = 1+spyrHt(pind);
- if strcmp(levs,'all')
- levs = [0:maxLev]';
- else
- if (any(levs > maxLev) | any(levs < 0))
- error(sprintf('Level numbers must be in the range [0, %d].', maxLev));
- end
- levs = levs(:);
- end
- if strcmp(bands,'all')
- bands = [1:nbands]';
- else
- if (any(bands < 1) | any(bands > nbands))
- error(sprintf('Band numbers must be in the range [1,3].', nbands));
- end
- bands = bands(:);
- end
- if (spyrHt(pind) == 0)
- if (any(levs==1))
- res1 = pyrBand(pyr,pind,2);
- else
- res1 = zeros(pind(2,:));
- end
- else
- res1 = reconSpyrLevs(pyr(1+prod(pind(1,:)):size(pyr,1)), ...
- pind(2:size(pind,1),:), ...
- lofilt, bfilts, edges, levs, bands);
- end
- res = upConv(res1, lo0filt, edges);
- %% residual highpass subband
- if any(levs == 0)
- if( is_mex )
- upConv( subMtx(pyr, pind(1,:)), hi0filt, edges, [1 1], [1 1], size(res), res);
- else
- res = upConv( subMtx(pyr, pind(1,:)), hi0filt, edges, [1 1], [1 1], size(res), res);
- end
- end
-
|