From f618466c25d43f3bae9e40920273bf77de1e1149 Mon Sep 17 00:00:00 2001 From: leochanj105 Date: Mon, 19 Oct 2020 23:09:30 -0400 Subject: initial sd-vbs initial sd-vbs add sd-vbs sd-vbs --- .../texture_synthesis/src/matlab/buildSCFpyr.m | 90 ++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100755 SD-VBS/benchmarks/texture_synthesis/src/matlab/buildSCFpyr.m (limited to 'SD-VBS/benchmarks/texture_synthesis/src/matlab/buildSCFpyr.m') diff --git a/SD-VBS/benchmarks/texture_synthesis/src/matlab/buildSCFpyr.m b/SD-VBS/benchmarks/texture_synthesis/src/matlab/buildSCFpyr.m new file mode 100755 index 0000000..101b6d2 --- /dev/null +++ b/SD-VBS/benchmarks/texture_synthesis/src/matlab/buildSCFpyr.m @@ -0,0 +1,90 @@ +% [PYR, INDICES, STEERMTX, HARMONICS] = buildSCFpyr(IM, HEIGHT, ORDER, TWIDTH) +% +% This is a modified version of buildSFpyr, that constructs a +% complex-valued steerable pyramid using Hilbert-transform pairs +% of filters. Note that the imaginary parts will *not* be steerable. +% +% To reconstruct from this representation, either call reconSFpyr +% on the real part of the pyramid, *or* call reconSCFpyr which will +% use both real and imaginary parts (forcing analyticity). +% +% Description of this transform appears in: Portilla & Simoncelli, +% Int'l Journal of Computer Vision, 40(1):49-71, Oct 2000. +% Further information: http://www.cns.nyu.edu/~eero/STEERPYR/ + +% Original code: Eero Simoncelli, 5/97. +% Modified by Javier Portilla to return complex (quadrature pair) channels, +% 9/97. + +function [pyr,pind,steermtx,harmonics] = buildSCFpyr(im, ht, order, twidth) + +%----------------------------------------------------------------- +%% DEFAULTS: + +max_ht = floor(log2(min(size(im)))) - 2; + +if (exist('ht') ~= 1) + ht = max_ht; +else + if (ht > max_ht) + error(sprintf('Cannot build pyramid higher than %d levels.',max_ht)); + end +end + +if (exist('order') ~= 1) + order = 3; +elseif ((order > 15) | (order < 0)) + fprintf(1,'Warning: ORDER must be an integer in the range [0,15]. Truncating.\n'); + order = min(max(order,0),15); +else + order = round(order); +end +nbands = order+1; + +if (exist('twidth') ~= 1) + twidth = 1; +elseif (twidth <= 0) + fprintf(1,'Warning: TWIDTH must be positive. Setting to 1.\n'); + twidth = 1; +end + +%----------------------------------------------------------------- +%% Steering stuff: + +if (mod((nbands),2) == 0) + harmonics = [0:(nbands/2)-1]'*2 + 1; +else + harmonics = [0:(nbands-1)/2]'*2; +end + +steermtx = steer2HarmMtx(harmonics, pi*[0:nbands-1]/nbands, 'even'); + +%----------------------------------------------------------------- + +dims = size(im); +ctr = ceil((dims+0.5)/2); + +[xramp,yramp] = meshgrid( ([1:dims(2)]-ctr(2))./(dims(2)/2), ... + ([1:dims(1)]-ctr(1))./(dims(1)/2) ); +angle = atan2(yramp,xramp); +log_rad = sqrt(xramp.^2 + yramp.^2); +log_rad(ctr(1),ctr(2)) = log_rad(ctr(1),ctr(2)-1); +log_rad = log2(log_rad); + +%% Radial transition function (a raised cosine in log-frequency): +[Xrcos,Yrcos] = rcosFn(twidth,(-twidth/2),[0 1]); +Yrcos = sqrt(Yrcos); + +YIrcos = sqrt(1.0 - Yrcos.^2); +lo0mask = pointOp(log_rad, YIrcos, Xrcos(1), Xrcos(2)-Xrcos(1), 0); +imdft = fftshift(fft2(im)); +lo0dft = imdft .* lo0mask; + +[pyr,pind] = buildSCFpyrLevs(lo0dft, log_rad, Xrcos, Yrcos, angle, ht, nbands); + +hi0mask = pointOp(log_rad, Yrcos, Xrcos(1), Xrcos(2)-Xrcos(1), 0); +hi0dft = imdft .* hi0mask; +hi0 = ifft2(ifftshift(hi0dft)); + +pyr = [real(hi0(:)) ; pyr]; +pind = [size(hi0); pind]; -- cgit v1.2.2