Mercurial > hg > smallbox
diff Problems/generateImageDenoiseProblem.m @ 10:207a6ae9a76f version1.0
(none)
author | idamnjanovic |
---|---|
date | Mon, 22 Mar 2010 15:06:25 +0000 |
parents | |
children | ec86452113ed |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Problems/generateImageDenoiseProblem.m Mon Mar 22 15:06:25 2010 +0000 @@ -0,0 +1,144 @@ +function data=generateImageDenoiseProblem(im, trainnum, blocksize, dictsize, sigma, gain, maxval, initdict); +%%% Generate Image Denoising Problem +% Ivan Damnjanovic 2010 +% +% generateImageDenoiseProblem is a part of the SMALLbox and generates +% a problem that can be used for comparison of Dictionary Learning/Sparse +% Representation techniques in image denoising scenario. +% The function takes as an input: +% - im - image matrix (if not present function promts user for an +% image file) , +% - trainnum - number of training samples (default - 40000) +% - blocksize - block (patch) vertical/horizontal dimension (default 8), +% - dictsize - dictionary size (default - 256), +% - sigma - noise level (default - 20), +% - noise gain (default - 1.15), +% - maxval - maximum value (default - 255) +% - initdict - initial dictionary (default - 4x overcomlete dct) +% +% The output of the function is stucture with following fields: +% - name - name of the original image (if image is read inside of the +% function) +% - Original - original image matrix, +% - Noisy - image with added noise, +% - b - training patches, +% - m - size of training patches (default 64), +% - n - number of training patches, +% - p - number of dictionary elements to be learned, +% - blocksize - block size (default [8 8]), +% - sigma - noise level, +% - noise gain (default - 1.15), +% - maxval - maximum value (default - 255) +% - initdict - initial dictionary (default - 4x overcomlete dct) +% - signalDim - signal dimension (default - 2) +% +% Based on KSVD denoise demo by Ron Rubinstein +% See also KSVDDENOISEDEMO and KSVDDEMO. +% Ron Rubinstein +% Computer Science Department +% Technion, Haifa 32000 Israel +% ronrubin@cs +% August 2009 +%% +disp(' '); +disp(' ********** Denoising Problem **********'); +disp(' '); +disp(' This function reads an image, adds random Gaussian noise,'); +disp(' that can be later denoised by using dictionary learning techniques.'); +disp(' '); + + +%% prompt user for image %% +%ask for file name +FS=filesep; +TMPpath=pwd; +if ~ exist( 'im', 'var' ) || isempty(im) + [pathstr1, name, ext, versn] = fileparts(which('SMALLboxSetup.m')); + cd([pathstr1,FS,'data',FS,'images']); + [filename,pathname] = uigetfile({'*.png;'},'Select a file containin pre-calculated notes'); + [pathstr, name, ext, versn] = fileparts(filename); + data.name=name; + im = imread(filename); + im = double(im); +end; +cd(TMPpath); + +%% check input parameters %% + +if ~ exist( 'blocksize', 'var' ) || isempty(blocksize),blocksize = 8;end +if ~ exist( 'dictsize', 'var' ) || isempty(dictsize), dictsize = 256;end +if ~ exist( 'trainnum', 'var' ) || isempty(trainnum),trainnum = 40000;end +if ~ exist( 'sigma', 'var' ) || isempty(sigma), sigma = 20; end +if ~ exist( 'gain', 'var' ) || isempty(gain), gain = 1.15; end +if ~ exist( 'maxval', 'var' ) || isempty(maxval), maxval = 255; end +if ~ exist( 'initdict', 'var' ) || isempty(initdict), initdict = 'odct'; end + +%% generate noisy image %% + +disp(' '); +disp('Generating noisy image...'); + +n = randn(size(im)) * sigma; +imnoise = im + n; + +%% set parameters %% + +x = imnoise; +p = ndims(x); + +if (p==2 && any(size(x)==1) && length(blocksize)==1) + p = 1; +end + +% blocksize % + +if (numel(blocksize)==1) + blocksize = ones(1,p)*blocksize; +end + +if (strcmpi(initdict,'odct')) + initdict = odctndict(blocksize,dictsize,p); +elseif (strcmpi(initdict,'data')) + clear initdict; % causes initialization using random examples +else + error('Invalid initial dictionary specified.'); +end + +if exist( 'initdict', 'var' ) + initdict = initdict(:,1:dictsize); +end + +%%%% create training data %%% + +ids = cell(p,1); +if (p==1) + ids{1} = reggrid(length(x)-blocksize+1, trainnum, 'eqdist'); +else + [ids{:}] = reggrid(size(x)-blocksize+1, trainnum, 'eqdist'); +end +X = sampgrid(x,blocksize,ids{:}); + +% remove dc in blocks to conserve memory % + +bsize = 2000; +for i = 1:bsize:size(X,2) + blockids = i : min(i+bsize-1,size(X,2)); + X(:,blockids) = remove_dc(X(:,blockids),'columns'); +end + +%% output structure %% + +data.Original = im; +data.Noisy = imnoise; +data.b = X; +data.m = size(X,1); +data.n = size(X,2); +data.p = dictsize; +data.blocksize=blocksize; +data.sigma = sigma; +data.gain = gain; +data.maxval = maxval; +data.initdict= initdict; +data.signalDim=2; + +end %% end of function \ No newline at end of file