MATLAB Answers

need SSIM.m code

149 views (last 30 days)
Talat
Talat on 10 Jun 2011
Commented: Farzin Matin on 12 Apr 2020
Hello! Is there any body has SSIM.m file plz upload it.. I have SSIM_index.m file downloaded from net but em getting error when i run that program... error comes at "nargin" . i understand all coding but not getting where this "nargin" comes from. Here the code plz... and plz help me what value should i assign to "nargin" not to get an error...thanks in advance
{function [mssim, ssim_map] = ssim(img1, img2, K, window, L)
% ========================================================================
% SSIM Index with automatic downsampling, Version 1.0
% Copyright(c) 2009 Zhou Wang
% All Rights Reserved.
%
% ----------------------------------------------------------------------
% 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 and the website with suggested usage
%
% Z. Wang, A. C. Bovik, H. R. Sheikh, and E. P. Simoncelli, "Image
% quality assessment: From error visibility to structural similarity,"
% IEEE Transactios on Image Processing, vol. 13, no. 4, pp. 600-612,
% Apr. 2004.
%
% http://www.ece.uwaterloo.ca/~z70wang/research/ssim/
%
% Note: This program is different from ssim_index.m, where no automatic
% downsampling is performed. (downsampling was done in the above paper
% and was described as suggested usage in the above website.)
%
% 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
% depends on the window size and the downsampling factor.
%
%Basic Usage:
% Given 2 test images img1 and img2, whose dynamic range is 0-255
%
% [mssim, ssim_map] = ssim(img1, img2);
%
%Advanced Usage:
% User defined parameters. For example
%
% K = [0.05 0.05];
% window = ones(8);
% L = 100;
% [mssim, ssim_map] = ssim(img1, img2, K, window, L);
%
%Visualize 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
img1 = double(img1);
img2 = double(img2);
% automatic downsampling
f = max(1,round(min(M,N)/256));
%downsampling by f
%use a simple low-pass filter
if(f>1)
lpf = ones(f,f);
lpf = lpf/sum(lpf(:));
img1 = imfilter(img1,lpf,'symmetric','same');
img2 = imfilter(img2,lpf,'symmetric','same');
img1 = img1(1:f:end,1:f:end);
img2 = img2(1:f:end,1:f:end);
end
C1 = (K(1)*L)^2;
C2 = (K(2)*L)^2;
window = window/sum(sum(window));
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

  3 Comments

hiren koringa
hiren koringa on 8 Mar 2014
where is function [mssim, ssim_map] = ssim(img1, img2, K, window, L)???
hiren koringa
hiren koringa on 8 Mar 2014
if run this program then please mail me.... hiren14791@gmail.com
Ali Noori
Ali Noori on 29 Apr 2015
just put this m file with your code

Sign in to comment.

Answers (7)

Kaustubha Govind
Kaustubha Govind on 10 Jun 2011
nargin returns the number of input arguments passed into the function - you should not assign it yourself. How are you executing the function, and what error do you see? Please post exact text.

  3 Comments

Talat
Talat on 10 Jun 2011
I pass two arguments image1 and image2 during call this function, and get error
"Error in ==> ssim_index at 75
if (nargin < 2 || nargin > 5)
{??? Output argument "mssim" (and maybe others) not assigned during call "
Please guide me... is it necessary to pass other arguments too, as given in code???????
Kaustubha Govind
Kaustubha Govind on 10 Jun 2011
Make a backup of this file and change all occurrences of ssim_index to mssim and see if that helps.
Also, please format the code in your question using the "Code" button - it is very hard to read.
Talat
Talat on 10 Jun 2011
I don't give user defined parameters during call this function.. I give two images only... I did some change in function
{function [mssim, ssim_map] = ssim(img1, img2)}
instead of writing other parameters(windows, L, K) too, and left the other code of SSIM.m unchanged.. now as em calling this function in my program with passing only two parameters (img1, img2).. there is no error any more... Thanks for telling me about "nargin". Thanks for your suggestions also.

Sign in to comment.


sara
sara on 29 Jul 2013
why we use filter2 to calculate average and variance???

  0 Comments

Sign in to comment.


sara
sara on 29 Jul 2013
can someone explain line mu1= filter2(window, img1,'valid')and sigma_sq=filter2(window, img1.*img1, 'valid')-mu1_sq

  1 Comment

hiren koringa
hiren koringa on 8 Mar 2014
if run this program then please mail me.... hiren14791@gmail.com

Sign in to comment.


hiren koringa
hiren koringa on 8 Mar 2014
if run this program then please mail me.... hiren14791@gmail.com

  0 Comments

Sign in to comment.


Alaa
Alaa on 22 Mar 2015
I suggest to use the following code to call the main function
K = [0.03 0.03]; window = ones(8); L = 100; img1=im2bw(imread(filepath)); img2=im2bw(imread(filepath)); [mssim,ssim_map] = ssim_index(img1,img2,K,window,L);

  1 Comment

aliya
aliya on 27 May 2015
Did the same but get the following error "Indexing cannot yield multiple results"

Sign in to comment.


Ritika Sobti
Ritika Sobti on 25 Jan 2020
Hi everyone! Can u tell me how to get mean ssim from ssim..I m beginner in this

  1 Comment

Farzin Matin
Farzin Matin on 12 Apr 2020
Structural similarity (SSIM) index. The SSIM metric combines local image structure, luminance, and contrast into a single local quality score. In this metric, structures are patterns of pixel intensities, especially among neighboring pixels, after normalizing for luminance and contrast. Because the human visual system is good at perceiving structure, the SSIM quality metric agrees more closely with the subjective quality score.

Sign in to comment.


Ritika Sobti
Ritika Sobti on 25 Jan 2020
Hi!! & laplaciAn mse code

  0 Comments

Sign in to comment.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!