www.gusucode.com > matlab非局部均值工具箱 > matlab非局部均值工具箱/matlab非局部均值工具箱/toolbox_nlmeans/perform_lowdim_embedding.m
function [H,P,Psi] = perform_lowdim_embedding(M,options) % perform_lowdim_embedding - perform a patch wise dimension extension % % [H,options.P, options.Psi] = perform_lowdim_embedding(M,options); % % M = perform_lowdim_embedding(H,options); % % This function lift each pixel of an image (can be a color image) % to a vector that incorporate neighboorhood relationship. % % Each pixel is replaced by the vector containing the values of the % neighbooring pixels and then dimension reduction is applyed to % avoid manipulating very high dimensional vectors. % % options.ndims gives the dimensionality for PCA. % % Copyright (c) 2006 Gabriel Peyr? dir = 1; if size(M,3)>5 dir = -1; end options.null = 0; k = getoptions(options, 'k', 2); mask = getoptions(options, 'mask', 'cst'); switch mask case 'cst' phi = ones(2*k+1); case 'linear' x = 1-abs(linspace(-1,1,2*k+3)); x = x(2:end-1); phi = x'*x; end [m,n,s] = size(M); if dir==1 ndims = getoptions(options, 'ndims', 25); % perform patch wise embedding s = size(M,3); % extract patches options.sampling = 'uniform'; H = compute_patch_library(M,k,options); H = H .* repmat( phi, [1 1 s n*m] ); % turn into collection of vectors H = reshape(H, [s*(2*k+1)^2 n*m]); end ndims = min(ndims,size(H,1)); if dir==-1 if not(isfield(options, 'P')) || not(isfield(options, 'Psi')) error('You must provide options.P and options.Psi.'); end P = options.P; Psi = options.Psi; ndims = size(P,2); % do un-projection M = reshape(M, [n^2 ndims]); M = shiftdim(M,1); M = (P*M) + repmat( Psi, [1 n^2] ); % sample at center s = size(M,1)/(2*k+1)^2; % number of colors M = reshape( M, [s (2*k+1) (2*k+1) n n] ); M = M(:,(end+1)/2,(end+1)/2,:,:); H = squeeze(M); elseif dir==1 % compute PCA projection if not(isfield(options, 'P')) || not(isfield(options, 'Psi')) || isempty(options.P) || isempty(options.Psi) nbexemplars = min(n*m,5000); sel = randperm(n*m); sel = sel(1:nbexemplars); [P,X1,v,Psi] = pca(H(:,sel),ndims); else P = options.P; Psi = options.Psi; end ndims = size(P,2); % perform actual PCA projection H = H - repmat( Psi, [1 n*m] ); H = P'*H; % reshape matrix H = reshape(H, [ndims m n]); H = shiftdim(H,1); end