Mercurial > hg > smallbox
changeset 126:db5a7fe1a404 ivand_dev
Merge from branch "sup_158_IMG_Processing_toolbox_"
author | Ivan Damnjanovic lnx <ivan.damnjanovic@eecs.qmul.ac.uk> |
---|---|
date | Wed, 25 May 2011 15:30:34 +0100 |
parents | 5ded5e2e7d07 (current diff) 002ec1b2ceff (diff) |
children | 6f78b069e541 8e660fd14774 |
files | util/ssim_index.m util/vmrse_type2.m |
diffstat | 13 files changed, 455 insertions(+), 288 deletions(-) [+] |
line wrap: on
line diff
--- a/DL/RLS-DLA/SMALL_rlsdla.m Wed May 25 13:33:47 2011 +0100 +++ b/DL/RLS-DLA/SMALL_rlsdla.m Wed May 25 15:30:34 2011 +0100 @@ -133,8 +133,8 @@ end if (show_dictionary) - dictimg = showdict(D,[8 8],round(sqrt(size(D,2))),round(sqrt(size(D,2))),'lines','highcontrast'); - figure(2); imshow(imresize(dictimg,2,'nearest')); + dictimg = SMALL_showdict(D,[8 8],round(sqrt(size(D,2))),round(sqrt(size(D,2))),'lines','highcontrast'); + figure(2); imagesc(dictimg);colormap(gray);axis off; axis image; end % Forgetting factor @@ -193,9 +193,9 @@ C = C - (alfa * u)* u'; if (show_dictionary &&(mod(i,show_iter)==0)) - dictimg = showdict(D,[8 8],... + dictimg = SMALL_showdict(D,[8 8],... round(sqrt(size(D,2))),round(sqrt(size(D,2))),'lines','highcontrast'); - figure(2); imshow(imresize(dictimg,2,'nearest')); + figure(2); imagesc(dictimg);colormap(gray);axis off; axis image; pause(0.02); end end
--- a/Problems/ImgDenoise_reconstruct.m Wed May 25 13:33:47 2011 +0100 +++ b/Problems/ImgDenoise_reconstruct.m Wed May 25 15:30:34 2011 +0100 @@ -56,10 +56,10 @@ % nnzy=sum(y,1); % figure(200);plot(sort(numD)); % figure(201);plot(sort(nnzy)); -[v.RMSErn, v.RMSEcd, v.rn_im, v.cd_im]=vmrse_type2(Problem.Original, Problem.Noisy, im); +[v.RMSErn, v.RMSEcd, v.rn_im, v.cd_im]=SMALL_vmrse_type2(Problem.Original, Problem.Noisy, im); %% output structure image+psnr %% reconstructed.Image=im; reconstructed.psnr = 20*log10(Problem.maxval * sqrt(numel(Problem.Original(:))) / norm(Problem.Original(:)-im(:))); reconstructed.vmrse=v; -reconstructed.ssim=ssim_index(Problem.Original, im); +reconstructed.ssim=SMALL_ssim_index(Problem.Original, im); end \ No newline at end of file
--- a/Problems/Pierre_Problem.m Wed May 25 13:33:47 2011 +0100 +++ b/Problems/Pierre_Problem.m Wed May 25 15:30:34 2011 +0100 @@ -1,14 +1,5 @@ function data=Pierre_Problem(src, trg, blocksize, dictsize); -%%% Generate Pierre Problem -% -% Centre for Digital Music, Queen Mary, University of London. -% This file copyright 2010 Ivan Damnjanovic. -% -% This program is free software; you can redistribute it and/or -% modify it under the terms of the GNU General Public License as -% published by the Free Software Foundation; either version 2 of the -% License, or (at your option) any later version. See the file -% COPYING included with this distribution for more information. +%% Generate Pierre Problem % % Pierre_Problem is a part of the SMALLbox and generates the problem % suggested by Professor Pierre Vandergheynst on the SMALL meeting in @@ -38,6 +29,15 @@ % - sparse - if 1 SMALL_solve will keep solution matrix in sparse form, % due to memory constrains. +% +% Centre for Digital Music, Queen Mary, University of London. +% This file copyright 2010 Ivan Damnjanovic. +% +% This program is free software; you can redistribute it and/or +% modify it under the terms of the GNU General Public License as +% published by the Free Software Foundation; either version 2 of the +% License, or (at your option) any later version. See the file +% COPYING included with this distribution for more information. %% prompt user for images %% % ask for source file name @@ -91,7 +91,7 @@ %% %% create dictionary data %% -S=im2col(src,blocksize,'sliding'); +S=im2colstep(src,blocksize); for j= 1:size(S,2) S(:,j)=S(:,j)./norm(S(:,j)); @@ -99,7 +99,7 @@ %% create measurement matrix %% -T=im2col(trg,blocksize, 'distinct'); +T=im2colstep(trg,blocksize, blocksize); %% output structure %%
--- a/Problems/generateImageDenoiseProblem.m Wed May 25 13:33:47 2011 +0100 +++ b/Problems/generateImageDenoiseProblem.m Wed May 25 15:30:34 2011 +0100 @@ -1,14 +1,5 @@ function data=generateImageDenoiseProblem(im, trainnum, blocksize, dictsize, sigma, gain, maxval, initdict); -%%% Generate Image Denoising Problem -% -% Centre for Digital Music, Queen Mary, University of London. -% This file copyright 2010 Ivan Damnjanovic. -% -% This program is free software; you can redistribute it and/or -% modify it under the terms of the GNU General Public License as -% published by the Free Software Foundation; either version 2 of the -% License, or (at your option) any later version. See the file -% COPYING included with this distribution for more information. +%% Generate Image Denoising Problem % % generateImageDenoiseProblem is a part of the SMALLbox and generates % a problem that can be used for comparison of Dictionary Learning/Sparse @@ -39,6 +30,16 @@ % - maxval - maximum value (default - 255) % - initdict - initial dictionary (default - 4x overcomlete dct) % - signalDim - signal dimension (default - 2) + +% +% Centre for Digital Music, Queen Mary, University of London. +% This file copyright 2010 Ivan Damnjanovic. +% +% This program is free software; you can redistribute it and/or +% modify it under the terms of the GNU General Public License as +% published by the Free Software Foundation; either version 2 of the +% License, or (at your option) any later version. See the file +% COPYING included with this distribution for more information. % % Based on KSVD denoise demo by Ron Rubinstein % See also KSVDDENOISEDEMO and KSVDDEMO. @@ -136,7 +137,7 @@ end % Noisy image blocks -xcol=im2col(x,blocksize,'sliding'); +xcol=im2colstep(x,blocksize); [b1, dc] = remove_dc(xcol,'columns'); %% output structure %%
--- a/examples/Pierre Villars/Pierre_Villars_Example.m Wed May 25 13:33:47 2011 +0100 +++ b/examples/Pierre Villars/Pierre_Villars_Example.m Wed May 25 15:30:34 2011 +0100 @@ -28,10 +28,10 @@ % Show original image and image that is used as a dictionary figure('Name', 'Original and Dictionary Image'); -subplot(1,2,1); imshow(SMALL.Problem.imageTrg/SMALL.Problem.maxval); -title('Original Image'); -subplot(1,2,2); imshow(SMALL.Problem.imageSrc/SMALL.Problem.maxval); -title('Dictionary image:'); +subplot(1,2,1); imagesc(SMALL.Problem.imageTrg/SMALL.Problem.maxval); +title('Original Image');colormap(gray);axis off; axis image; +subplot(1,2,2); imagesc(SMALL.Problem.imageSrc/SMALL.Problem.maxval); +title('Dictionary image:');colormap(gray);axis off; axis image; % Using ten different dictionary sizes. First dictionary will contain all % patches from the source image and last one will have only @@ -80,10 +80,10 @@ %% show reconstructed image %% figure('Name', sprintf('dictsize=%d', dictsize(1,i))); - imshow(SMALL.solver(i).reconstructed.image/SMALL.Problem.maxval); + imagesc(SMALL.solver(i).reconstructed.image/SMALL.Problem.maxval); title(sprintf('Reconstructed image, PSNR: %.2f dB in %.2f s',... SMALL.solver(i).reconstructed.psnr, SMALL.solver(i).time )); - + colormap(gray);axis off; axis image; end
--- a/examples/SMALL_solver_test.m Wed May 25 13:33:47 2011 +0100 +++ b/examples/SMALL_solver_test.m Wed May 25 15:30:34 2011 +0100 @@ -1,6 +1,5 @@ function SMALL_solver_test -% Example test of solvers from different toolboxes on Sparco compressed -% sensing problems +%% Example test of solvers from different toolboxes on Sparco problem 6 % % The main purpose of this example is to show how to use SMALL structure % to solve SPARCO compressed sensing problems (1-11) and compare results
--- a/util/Pierre_reconstruct.m Wed May 25 13:33:47 2011 +0100 +++ b/util/Pierre_reconstruct.m Wed May 25 15:30:34 2011 +0100 @@ -1,5 +1,11 @@ function reconstructed=Pierre_reconstruct(y, Problem) -%%% Pierre Villars Example - reconstruction function +%% Pierre Villars Example - reconstruction function +% +% using sparse representation y in dictionary Problem.A reconstruct the +% patches from the target image +% This example is based on the experiment suggested by Professor Pierre +% Vandergheynst on the SMALL meeting in Villars. + % % Centre for Digital Music, Queen Mary, University of London. % This file copyright 2009 Ivan Damnjanovic. @@ -10,17 +16,12 @@ % License, or (at your option) any later version. See the file % COPYING included with this distribution for more information. % -% This example is based on the experiment suggested by Professor Pierre -% Vandergheynst on the SMALL meeting in Villars. - -% using sparse representation y in dictionary Problem.A reconstruct the -% patches from the target image - +%% imout=Problem.A*y; % combine the patches into reconstructed image -im=col2im(imout,Problem.blocksize,size(Problem.imageTrg),'disctint'); +im=col2imstep(imout,size(Problem.imageTrg),Problem.blocksize,Problem.blocksize); % bound the pixel values to [0,255] range im(im<0)=0;
--- a/util/SMALL_ImgDeNoiseResult.m Wed May 25 13:33:47 2011 +0100 +++ b/util/SMALL_ImgDeNoiseResult.m Wed May 25 15:30:34 2011 +0100 @@ -1,5 +1,11 @@ -function SMALL_ImgDeNoiseResult(SMALL) +function SMALL_ImgDeNoiseResult(SMALL) +%% Represents the results of Dictionary Learning for Image denoising % +% Function gets as input SMALL structure and plots Image Denoise +% results: Original Image, Noisy Image and for learned dictionaries and +% denoised images +% + % Centre for Digital Music, Queen Mary, University of London. % This file copyright 2010 Ivan Damnjanovic. % @@ -8,10 +14,7 @@ % published by the Free Software Foundation; either version 2 of the % License, or (at your option) any later version. See the file % COPYING included with this distribution for more information. -% -% Function gets as input SMALL structure and plots Image Denoise -% results: Original Image, Noisy Image and for learned dictionaries and -% denoised images +%% figure('Name', sprintf('Image %s (training set size- %d, sigma - %d)',SMALL.Problem.name, SMALL.Problem.n, SMALL.Problem.sigma)); @@ -37,7 +40,7 @@ else D = SMALL.DL(i-1).D; end - dictimg = showdict(D,SMALL.Problem.blocksize,... + dictimg = SMALL_showdict(D,SMALL.Problem.blocksize,... round(sqrt(size(D,2))),round(sqrt(size(D,2))),'lines','highcontrast'); subplot(2,m,m+i);imagesc(dictimg);axis off; axis image;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/util/SMALL_showdict.m Wed May 25 15:30:34 2011 +0100 @@ -0,0 +1,119 @@ +function x = SMALL_showdict(D,sz,n,m,varargin) +%% SMALL_SHOWDICT Display a dictionary of image patches. +%% Reimplementation of showdict function from KSVD toolbox with Image +%% Processing toolbox dependecies removed +% +% SMALL_SHOWDICT(D,SZ,N,M) displays the contents of the dictionary D, whos +% columns are 2-D image patches (in column-major order). SZ = [SX SY] is +% the size of the image patches. SHOWDICT displays the atoms on an N x M +% grid. If there are more atoms in D then only the first N*M are +% displayed. +% +% SMALL_SHOWDICT(...,'lines') separates the dictionary atoms by black lines. +% SMALL_SHOWDICT(...,'whitelines') separates the dictionary atoms by white +% lines. +% +% SMALL_SHOWDICT(...,'linewidth',W) when used with either 'lines' or +% 'whitelines' sets the width of the lines to W pixels (default=1). +% +% SMALL_SHOWDICT(...,'highcontrast') increases the contrast of the figure by +% normalizing the intensity values of each atom individually to the range +% of [0,1] (the default behavior is to normalize the values of the entire +% figure to [0,1] as one image). Note that in this way, the relative +% intensities of the atoms are not maintained. +% +% X = SMALL_SHOWDICT(...) returns a bitmat of the dictionary image without +% displaying the figure. + + +% Centre for Digital Music, Queen Mary, University of London. +% This file copyright 2011 Ivan Damnjanovic. +% +% This program is free software; you can redistribute it and/or +% modify it under the terms of the GNU General Public License as +% published by the Free Software Foundation; either version 2 of the +% License, or (at your option) any later version. See the file +% COPYING included with this distribution for more information. +% +%% + +if (size(D,2) < n*m) + D = [D zeros(size(D,1),n*m-size(D,2))]; +end + + +%%% parse input arguments %%% + +linewidth = 1; +highcontrast = 0; +drawlines = 0; +linecolor = 0; + +for i = 1:length(varargin) + if (~ischar(varargin{i})) + continue; + end + switch(varargin{i}) + case 'highcontrast' + highcontrast = 1; + case 'lines' + drawlines = 1; + case 'whitelines' + drawlines = 1; + linecolor = 1; + case 'linewidth' + linewidth = varargin{i+1}; + end +end + + + +%%% create dictionary image %%% + + +if (drawlines) + + D = [D ; nan(sz(1)*linewidth,size(D,2))]; + sz(2) = sz(2)+linewidth; + x = col2imstep(D(:,1:n*m),[n m].*sz, sz, sz); + sz = [sz(2) sz(1)]; + D = im2colstep(x',sz, sz); + D = [D ; nan(sz(1)*linewidth,size(D,2))]; + sz(2) = sz(2)+linewidth; + x = col2imstep(D(:,1:n*m),[m n].*sz,sz,sz); + x = x'; + x = x(1:end-linewidth,1:end-linewidth); + + if (highcontrast) + for i = 0:n-1 + for j = 0:m-1 + x(i*sz(1)+1:i*sz(1)+sz(1)-linewidth, j*sz(2)+1:j*sz(2)+sz(2)-linewidth) = ... + imnormalize(x(i*sz(1)+1:i*sz(1)+sz(1)-linewidth, j*sz(2)+1:j*sz(2)+sz(2)-linewidth)); + end + end + else + x = imnormalize(x); + end + + x(isnan(x)) = linecolor; + +else + + x = col2imstep(D(:,1:n*m),[n m].*sz, sz, sz); + + if (highcontrast) + for i = 0:n-1 + for j = 0:m-1 + x(i*sz(1)+1:i*sz(1)+sz(1), j*sz(2)+1:j*sz(2)+sz(2)) = ... + imnormalize(x(i*sz(1)+1:i*sz(1)+sz(1), j*sz(2)+1:j*sz(2)+sz(2))); + end + end + else + x = imnormalize(x); + end +end + + +if (nargout==0) + imagesc(dictimg);colormap(gray);axis off; axis image; +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/util/SMALL_ssim_index.m Wed May 25 15:30:34 2011 +0100 @@ -0,0 +1,238 @@ +function [mssim, ssim_map] = SMALL_ssim_index(img1, img2, K, window, L) + +%======================================================================== +%SSIM Index, Version 1.0 +%Copyright(c) 2003 Zhou Wang +%All Rights Reserved. +% +%The author is with Howard Hughes Medical Institute, and Laboratory +%for Computational Vision at Center for Neural Science and Courant +%Institute of Mathematical Sciences, New York University. +% +%---------------------------------------------------------------------- +%Permission to use, copy, or modify this software and its documentation +%for educational and research purposes only and without fee is hereby +%granted, provided that this copyright notice and the original authors' +%names appear on all copies and supporting documentation. This program +%shall not be used, rewritten, or adapted as the basis of a commercial +%software or hardware product without first obtaining permission of the +%authors. The authors make no representations about the suitability of +%this software for any purpose. It is provided "as is" without express +%or implied warranty. +%---------------------------------------------------------------------- +% +%This is an implementation of the algorithm for calculating the +%Structural SIMilarity (SSIM) index between two images. Please refer +%to the following paper: +% +%Z. Wang, A. C. Bovik, H. R. Sheikh, and E. P. Simoncelli, "Image +%quality assessment: From error measurement to structural similarity" +%IEEE Transactios on Image Processing, vol. 13, no. 1, Jan. 2004. +% +%Kindly report any suggestions or corrections to zhouwang@ieee.org +% +%---------------------------------------------------------------------- +% +%Input : (1) img1: the first image being compared +% (2) img2: the second image being compared +% (3) K: constants in the SSIM index formula (see the above +% reference). defualt value: K = [0.01 0.03] +% (4) window: local window for statistics (see the above +% reference). default widnow is Gaussian given by +% window = fspecial('gaussian', 11, 1.5); +% (5) L: dynamic range of the images. default: L = 255 +% +%Output: (1) mssim: the mean SSIM index value between 2 images. +% If one of the images being compared is regarded as +% perfect quality, then mssim can be considered as the +% quality measure of the other image. +% If img1 = img2, then mssim = 1. +% (2) ssim_map: the SSIM index map of the test image. The map +% has a smaller size than the input images. The actual size: +% size(img1) - size(window) + 1. +% +%Default Usage: +% Given 2 test images img1 and img2, whose dynamic range is 0-255 +% +% [mssim ssim_map] = ssim_index(img1, img2); +% +%Advanced Usage: +% User defined parameters. For example +% +% K = [0.05 0.05]; +% window = ones(8); +% L = 100; +% [mssim ssim_map] = ssim_index(img1, img2, K, window, L); +% +%See the results: +% +% mssim %Gives the mssim value +% imshow(max(0, ssim_map).^4) %Shows the SSIM index map +% + +% Removed dependency on Image Processing Toolbox - +% Centre for Digital Music, Queen Mary, University of London. +% This file copyright 2011 Ivan Damnjanovic. +%======================================================================== + + +if (nargin < 2 || nargin > 5) + ssim_index = -Inf; + ssim_map = -Inf; + return; +end + +if (size(img1) ~= size(img2)) + ssim_index = -Inf; + ssim_map = -Inf; + return; +end + +[M N] = size(img1); + +if (nargin == 2) + if ((M < 11) || (N < 11)) + ssim_index = -Inf; + ssim_map = -Inf; + return + end +% window = fspecial('gaussian', 11, 1.5); % +% +% Image Processing toolboxdependency +% - fspecial function is from IMP toolbox +% 2 - ways to do +% a) +% [wx,wy] = meshgrid(-5:5, -5:5); +% window = exp(-(wx.*wx + wy.*wy)/4.5); +% window = window/sum(window(:)); +% b) + window = [1.05756559815326e-06,7.81441153305360e-06,3.70224770827489e-05,0.000112464355116679,0.000219050652866017,0.000273561160085806,0.000219050652866017,0.000112464355116679,3.70224770827489e-05,7.81441153305360e-06,1.05756559815326e-06;... + 7.81441153305360e-06,5.77411251978637e-05,0.000273561160085806,0.000831005429087199,0.00161857756253439,0.00202135875836257,0.00161857756253439,0.000831005429087199,0.000273561160085806,5.77411251978637e-05,7.81441153305360e-06;... + 3.70224770827489e-05,0.000273561160085806,0.00129605559384320,0.00393706926284679,0.00766836382523672,0.00957662749024029,0.00766836382523672,0.00393706926284679,0.00129605559384320,0.000273561160085806,3.70224770827489e-05;... + 0.000112464355116679,0.000831005429087199,0.00393706926284679,0.0119597604100370,0.0232944324734871,0.0290912256485504,0.0232944324734871,0.0119597604100370,0.00393706926284679,0.000831005429087199,0.000112464355116679;... + 0.000219050652866017,0.00161857756253439,0.00766836382523672,0.0232944324734871,0.0453713590956603,0.0566619704916846,0.0453713590956603,0.0232944324734871,0.00766836382523672,0.00161857756253439,0.000219050652866017;... + 0.000273561160085806,0.00202135875836257,0.00957662749024029,0.0290912256485504,0.0566619704916846,0.0707622377639470,0.0566619704916846,0.0290912256485504,0.00957662749024029,0.00202135875836257,0.000273561160085806;... + 0.000219050652866017,0.00161857756253439,0.00766836382523672,0.0232944324734871,0.0453713590956603,0.0566619704916846,0.0453713590956603,0.0232944324734871,0.00766836382523672,0.00161857756253439,0.000219050652866017;... + 0.000112464355116679,0.000831005429087199,0.00393706926284679,0.0119597604100370,0.0232944324734871,0.0290912256485504,0.0232944324734871,0.0119597604100370,0.00393706926284679,0.000831005429087199,0.000112464355116679;... + 3.70224770827489e-05,0.000273561160085806,0.00129605559384320,0.00393706926284679,0.00766836382523672,0.00957662749024029,0.00766836382523672,0.00393706926284679,0.00129605559384320,0.000273561160085806,3.70224770827489e-05;... + 7.81441153305360e-06,5.77411251978637e-05,0.000273561160085806,0.000831005429087199,0.00161857756253439,0.00202135875836257,0.00161857756253439,0.000831005429087199,0.000273561160085806,5.77411251978637e-05,7.81441153305360e-06;... + 1.05756559815326e-06,7.81441153305360e-06,3.70224770827489e-05,0.000112464355116679,0.000219050652866017,0.000273561160085806,0.000219050652866017,0.000112464355116679,3.70224770827489e-05,7.81441153305360e-06,1.05756559815326e-06]; + K(1) = 0.01; % default settings + K(2) = 0.03; % + L = 255; % +end + +if (nargin == 3) + if ((M < 11) || (N < 11)) + ssim_index = -Inf; + ssim_map = -Inf; + return + end +% window = fspecial('gaussian', 11, 1.5); % +% +% Image Processing toolboxdependency +% - fspecial function is from IMP toolbox +% 2 - ways to do +% a) +% [wx,wy] = meshgrid(-5:5, -5:5); +% window = exp(-(wx.*wx + wy.*wy)/4.5); +% window = window/sum(window(:)); +% b) + window = [1.05756559815326e-06,7.81441153305360e-06,3.70224770827489e-05,0.000112464355116679,0.000219050652866017,0.000273561160085806,0.000219050652866017,0.000112464355116679,3.70224770827489e-05,7.81441153305360e-06,1.05756559815326e-06;... + 7.81441153305360e-06,5.77411251978637e-05,0.000273561160085806,0.000831005429087199,0.00161857756253439,0.00202135875836257,0.00161857756253439,0.000831005429087199,0.000273561160085806,5.77411251978637e-05,7.81441153305360e-06;... + 3.70224770827489e-05,0.000273561160085806,0.00129605559384320,0.00393706926284679,0.00766836382523672,0.00957662749024029,0.00766836382523672,0.00393706926284679,0.00129605559384320,0.000273561160085806,3.70224770827489e-05;... + 0.000112464355116679,0.000831005429087199,0.00393706926284679,0.0119597604100370,0.0232944324734871,0.0290912256485504,0.0232944324734871,0.0119597604100370,0.00393706926284679,0.000831005429087199,0.000112464355116679;... + 0.000219050652866017,0.00161857756253439,0.00766836382523672,0.0232944324734871,0.0453713590956603,0.0566619704916846,0.0453713590956603,0.0232944324734871,0.00766836382523672,0.00161857756253439,0.000219050652866017;... + 0.000273561160085806,0.00202135875836257,0.00957662749024029,0.0290912256485504,0.0566619704916846,0.0707622377639470,0.0566619704916846,0.0290912256485504,0.00957662749024029,0.00202135875836257,0.000273561160085806;... + 0.000219050652866017,0.00161857756253439,0.00766836382523672,0.0232944324734871,0.0453713590956603,0.0566619704916846,0.0453713590956603,0.0232944324734871,0.00766836382523672,0.00161857756253439,0.000219050652866017;... + 0.000112464355116679,0.000831005429087199,0.00393706926284679,0.0119597604100370,0.0232944324734871,0.0290912256485504,0.0232944324734871,0.0119597604100370,0.00393706926284679,0.000831005429087199,0.000112464355116679;... + 3.70224770827489e-05,0.000273561160085806,0.00129605559384320,0.00393706926284679,0.00766836382523672,0.00957662749024029,0.00766836382523672,0.00393706926284679,0.00129605559384320,0.000273561160085806,3.70224770827489e-05;... + 7.81441153305360e-06,5.77411251978637e-05,0.000273561160085806,0.000831005429087199,0.00161857756253439,0.00202135875836257,0.00161857756253439,0.000831005429087199,0.000273561160085806,5.77411251978637e-05,7.81441153305360e-06;... + 1.05756559815326e-06,7.81441153305360e-06,3.70224770827489e-05,0.000112464355116679,0.000219050652866017,0.000273561160085806,0.000219050652866017,0.000112464355116679,3.70224770827489e-05,7.81441153305360e-06,1.05756559815326e-06]; + L = 255; + if (length(K) == 2) + if (K(1) < 0 || K(2) < 0) + ssim_index = -Inf; + ssim_map = -Inf; + return; + end + else + ssim_index = -Inf; + ssim_map = -Inf; + return; + end +end + +if (nargin == 4) + [H W] = size(window); + if ((H*W) < 4 || (H > M) || (W > N)) + ssim_index = -Inf; + ssim_map = -Inf; + return + end + L = 255; + if (length(K) == 2) + if (K(1) < 0 || K(2) < 0) + ssim_index = -Inf; + ssim_map = -Inf; + return; + end + else + ssim_index = -Inf; + ssim_map = -Inf; + return; + end +end + +if (nargin == 5) + [H W] = size(window); + if ((H*W) < 4 || (H > M) || (W > N)) + ssim_index = -Inf; + ssim_map = -Inf; + return + end + if (length(K) == 2) + if (K(1) < 0 || K(2) < 0) + ssim_index = -Inf; + ssim_map = -Inf; + return; + end + else + ssim_index = -Inf; + ssim_map = -Inf; + return; + end +end + +C1 = (K(1)*L)^2; +C2 = (K(2)*L)^2; +window = window/sum(sum(window)); +img1 = double(img1); +img2 = double(img2); + +mu1 = filter2(window, img1, 'valid'); +mu2 = filter2(window, img2, 'valid'); +mu1_sq = mu1.*mu1; +mu2_sq = mu2.*mu2; +mu1_mu2 = mu1.*mu2; +sigma1_sq = filter2(window, img1.*img1, 'valid') - mu1_sq; +sigma2_sq = filter2(window, img2.*img2, 'valid') - mu2_sq; +sigma12 = filter2(window, img1.*img2, 'valid') - mu1_mu2; + +if (C1 > 0 & C2 > 0) + ssim_map = ((2*mu1_mu2 + C1).*(2*sigma12 + C2))./((mu1_sq + mu2_sq + C1).*(sigma1_sq + sigma2_sq + C2)); +else + numerator1 = 2*mu1_mu2 + C1; + numerator2 = 2*sigma12 + C2; + denominator1 = mu1_sq + mu2_sq + C1; + denominator2 = sigma1_sq + sigma2_sq + C2; + ssim_map = ones(size(mu1)); + index = (denominator1.*denominator2 > 0); + ssim_map(index) = (numerator1(index).*numerator2(index))./(denominator1(index).*denominator2(index)); + index = (denominator1 ~= 0) & (denominator2 == 0); + ssim_map(index) = numerator1(index)./denominator1(index); +end + +mssim = sum(ssim_map(:), [], 'double')/numel(ssim_map); + +return \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/util/SMALL_vmrse_type2.m Wed May 25 15:30:34 2011 +0100 @@ -0,0 +1,43 @@ +function [RMSErn, RMSEcd, rn_im, cd_im] = SMALL_vmrse_type2(orig, corr, recon) +%% Implementation of VectorRMSE type2 +% +% +% Input: +% - Original image +% - Corrupted image +% - Reconstructed Image +% +% Output: +% - RMSErn - RMSE from residual noise (noise not completely removed) +% - RMSEcd - RMSE from collateral distortion - excessive filtering +% - rn_im - image of residual noise +% - cd_im - image of collateral distortion +% +% F. Russo, "New Method for Performance Evaluation of Grayscale Image +% Denoising filters", IEEE Signal Processing Letters, vol. 17, no. 5, +% pp.417-420, May 2010 + +% Centre for Digital Music, Queen Mary, University of London. +% This file copyright 2011 Ivan Damnjanovic. +% +% This program is free software; you can redistribute it and/or +% modify it under the terms of the GNU General Public License as +% published by the Free Software Foundation; either version 2 of the +% License, or (at your option) any later version. See the file +% COPYING included with this distribution for more information. +%% + + recon_int = round(recon); + + RN1 = ((orig<recon_int)&(recon_int<=corr)); + RN2 = ((orig>recon_int)&(recon_int>=corr)); + CD1 = ((orig<recon_int)&(recon_int>corr)); + CD2 = ((orig>recon_int)&(recon_int<corr)); + + RMSErn = sqrt(sum(sum((RN1+RN2).*(orig-recon).^2)))/512; + RMSEcd = sqrt(sum(sum((CD1+CD2).*(orig-recon).^2)))/512; + rn_im=RN1+RN2; + cd_im=CD1+CD2; + +end +
--- a/util/ssim_index.m Wed May 25 13:33:47 2011 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,194 +0,0 @@ -function [mssim, ssim_map] = ssim_index(img1, img2, K, window, L) - -%======================================================================== -%SSIM Index, Version 1.0 -%Copyright(c) 2003 Zhou Wang -%All Rights Reserved. -% -%The author is with Howard Hughes Medical Institute, and Laboratory -%for Computational Vision at Center for Neural Science and Courant -%Institute of Mathematical Sciences, New York University. -% -%---------------------------------------------------------------------- -%Permission to use, copy, or modify this software and its documentation -%for educational and research purposes only and without fee is hereby -%granted, provided that this copyright notice and the original authors' -%names appear on all copies and supporting documentation. This program -%shall not be used, rewritten, or adapted as the basis of a commercial -%software or hardware product without first obtaining permission of the -%authors. The authors make no representations about the suitability of -%this software for any purpose. It is provided "as is" without express -%or implied warranty. -%---------------------------------------------------------------------- -% -%This is an implementation of the algorithm for calculating the -%Structural SIMilarity (SSIM) index between two images. Please refer -%to the following paper: -% -%Z. Wang, A. C. Bovik, H. R. Sheikh, and E. P. Simoncelli, "Image -%quality assessment: From error measurement to structural similarity" -%IEEE Transactios on Image Processing, vol. 13, no. 1, Jan. 2004. -% -%Kindly report any suggestions or corrections to zhouwang@ieee.org -% -%---------------------------------------------------------------------- -% -%Input : (1) img1: the first image being compared -% (2) img2: the second image being compared -% (3) K: constants in the SSIM index formula (see the above -% reference). defualt value: K = [0.01 0.03] -% (4) window: local window for statistics (see the above -% reference). default widnow is Gaussian given by -% window = fspecial('gaussian', 11, 1.5); -% (5) L: dynamic range of the images. default: L = 255 -% -%Output: (1) mssim: the mean SSIM index value between 2 images. -% If one of the images being compared is regarded as -% perfect quality, then mssim can be considered as the -% quality measure of the other image. -% If img1 = img2, then mssim = 1. -% (2) ssim_map: the SSIM index map of the test image. The map -% has a smaller size than the input images. The actual size: -% size(img1) - size(window) + 1. -% -%Default Usage: -% Given 2 test images img1 and img2, whose dynamic range is 0-255 -% -% [mssim ssim_map] = ssim_index(img1, img2); -% -%Advanced Usage: -% User defined parameters. For example -% -% K = [0.05 0.05]; -% window = ones(8); -% L = 100; -% [mssim ssim_map] = ssim_index(img1, img2, K, window, L); -% -%See the results: -% -% mssim %Gives the mssim value -% imshow(max(0, ssim_map).^4) %Shows the SSIM index map -% -%======================================================================== - - -if (nargin < 2 || nargin > 5) - ssim_index = -Inf; - ssim_map = -Inf; - return; -end - -if (size(img1) ~= size(img2)) - ssim_index = -Inf; - ssim_map = -Inf; - return; -end - -[M N] = size(img1); - -if (nargin == 2) - if ((M < 11) || (N < 11)) - ssim_index = -Inf; - ssim_map = -Inf; - return - end - window = fspecial('gaussian', 11, 1.5); % - K(1) = 0.01; % default settings - K(2) = 0.03; % - L = 255; % -end - -if (nargin == 3) - if ((M < 11) || (N < 11)) - ssim_index = -Inf; - ssim_map = -Inf; - return - end - window = fspecial('gaussian', 11, 1.5); - L = 255; - if (length(K) == 2) - if (K(1) < 0 || K(2) < 0) - ssim_index = -Inf; - ssim_map = -Inf; - return; - end - else - ssim_index = -Inf; - ssim_map = -Inf; - return; - end -end - -if (nargin == 4) - [H W] = size(window); - if ((H*W) < 4 || (H > M) || (W > N)) - ssim_index = -Inf; - ssim_map = -Inf; - return - end - L = 255; - if (length(K) == 2) - if (K(1) < 0 || K(2) < 0) - ssim_index = -Inf; - ssim_map = -Inf; - return; - end - else - ssim_index = -Inf; - ssim_map = -Inf; - return; - end -end - -if (nargin == 5) - [H W] = size(window); - if ((H*W) < 4 || (H > M) || (W > N)) - ssim_index = -Inf; - ssim_map = -Inf; - return - end - if (length(K) == 2) - if (K(1) < 0 || K(2) < 0) - ssim_index = -Inf; - ssim_map = -Inf; - return; - end - else - ssim_index = -Inf; - ssim_map = -Inf; - return; - end -end - -C1 = (K(1)*L)^2; -C2 = (K(2)*L)^2; -window = window/sum(sum(window)); -img1 = double(img1); -img2 = double(img2); - -mu1 = filter2(window, img1, 'valid'); -mu2 = filter2(window, img2, 'valid'); -mu1_sq = mu1.*mu1; -mu2_sq = mu2.*mu2; -mu1_mu2 = mu1.*mu2; -sigma1_sq = filter2(window, img1.*img1, 'valid') - mu1_sq; -sigma2_sq = filter2(window, img2.*img2, 'valid') - mu2_sq; -sigma12 = filter2(window, img1.*img2, 'valid') - mu1_mu2; - -if (C1 > 0 & C2 > 0) - ssim_map = ((2*mu1_mu2 + C1).*(2*sigma12 + C2))./((mu1_sq + mu2_sq + C1).*(sigma1_sq + sigma2_sq + C2)); -else - numerator1 = 2*mu1_mu2 + C1; - numerator2 = 2*sigma12 + C2; - denominator1 = mu1_sq + mu2_sq + C1; - denominator2 = sigma1_sq + sigma2_sq + C2; - ssim_map = ones(size(mu1)); - index = (denominator1.*denominator2 > 0); - ssim_map(index) = (numerator1(index).*numerator2(index))./(denominator1(index).*denominator2(index)); - index = (denominator1 ~= 0) & (denominator2 == 0); - ssim_map(index) = numerator1(index)./denominator1(index); -end - -mssim = mean2(ssim_map); - -return \ No newline at end of file
--- a/util/vmrse_type2.m Wed May 25 13:33:47 2011 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ -function [RMSErn, RMSEcd, rn_im, cd_im] = vmrse_type2(orig, corr, recon) - -%%% Implementation of VectorRMSE type2 -% -% Centre for Digital Music, Queen Mary, University of London. -% This file copyright 2011 Ivan Damnjanovic. -% -% This program is free software; you can redistribute it and/or -% modify it under the terms of the GNU General Public License as -% published by the Free Software Foundation; either version 2 of the -% License, or (at your option) any later version. See the file -% COPYING included with this distribution for more information. -% -% Input: -% - Original image -% - Corrupted image -% - Reconstructed Image -% -% Output: -% - RMSErn - RMSE from residual noise (noise not completely removed) -% - RMSEcd - RMSE from collateral distortion - excessive filtering -% - rn_im - image of residual noise -% - cd_im - image of collateral distortion -% -% F. Russo, "New Method for Performance Evaluation of Grayscale Image -% Denoising filters", IEEE Signal Processing Letters, vol. 17, no. 5, -% pp.417-420, May 2010 -%% - - recon_int = round(recon); - - RN1 = ((orig<recon_int)&(recon_int<=corr)); - RN2 = ((orig>recon_int)&(recon_int>=corr)); - CD1 = ((orig<recon_int)&(recon_int>corr)); - CD2 = ((orig>recon_int)&(recon_int<corr)); - - RMSErn = sqrt(sum(sum((RN1+RN2).*(orig-recon).^2)))/512; - RMSEcd = sqrt(sum(sum((CD1+CD2).*(orig-recon).^2)))/512; - rn_im=RN1+RN2; - cd_im=CD1+CD2; - -end -