kuijiang94 / MSPFN

Multi-Scale Progressive Fusion Network for Single Image Deraining
162 stars 32 forks source link

About SSIM and PSNR #19

Open yunhengzi opened 3 years ago

yunhengzi commented 3 years ago

Hello, thank you for sharing this wonderful work. I have a question. How are the metrics of PSNR and SSIM are computed? And the value of the corresponding parameter is? Thanks.

kuijiang94 commented 3 years ago

Thanks for your attention! For the PSNR test, we transform the RGB to Ycbcr firstly, and then calculate the RMSE and PSNR on the "Y" channel with the following script, returning the result of 32 (PSNR). ###################################### function psnr=compute_psnr(img1,img2) if size(img1, 3) == 3, img1 = rgb2ycbcr(img1); img1 = img1(:, :, 1); end

if size(img2, 3) == 3, img2 = rgb2ycbcr(img2); img2 = img2(:, :, 1); end

imdff = double(img1) - double(img2); imdff = imdff(:);

rmse = sqrt(mean(imdff.^2)); psnr = 20*log10(255/rmse); ######################################

In addition, we also adopt the script used in NTIRE2017, which uses full RGB channels and ignores the (6 + scale) pixels from the border for comparison. The PSNR score is 30.338. The detailed script is shown as ###################################### function res = NTIRE_PeakSNR_imgs(F, G, scale) % NTIRE 2017 image super-resolution challenge scoring function % % F - original image % G - distorted image % scale factor - determins the number of boundary pixels to ignore (6+scale) % % returns res, the PSNR over all pixel values

if ischar(F) F = imread(F); end if ischar(G) G = imread(G); end

boundarypixels = 0; if exist('scale','var') boundarypixels = 6+scale; F = F(boundarypixels+1:end-boundarypixels,boundarypixels+1:end-boundarypixels,:); G = G(boundarypixels+1:end-boundarypixels,boundarypixels+1:end-boundarypixels,:); end

if max(F(:)) > 1 F = im2double(F); end if max(G(:)) > 1 G = im2double(G); end E = F - G; % error signal N = numel(E); % Assume the original signal is at peak (|F|=1) res = 10*log10( N / sum(E(:).^2) ); ###################################### You can try it! Best wishes!

kuijiang94 commented 3 years ago

For SSIM evaluation, we adopt the commonly used codes provided by Z. Wang. ############################## function [mssim, ssim_map] = SSIM(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 ap pearon 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 visibility to structural similarity" %IEEE Transactios on Image Processing, vol. 13, no. 4, pp.600-612, %Apr. 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); % 参数一个标准偏差1.5,11*11的高斯低通滤波。消除窗口映射矩阵的分块效应 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

if size(img1,3)~=1 %判断图像时不是彩色图,如果是,结果为3,否则为1 org=rgb2ycbcr(img1); test=rgb2ycbcr(img2); y1=org(:,:,1); y2=test(:,:,1); y1=double(y1); y2=double(y2); else y1=double(img1); y2=double(img2); end img1 = double(y1); img2 = double(y2); % 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; % 计算C1参数,给亮度L(x,y)用。 C1=6.502500 C2 = (K(2)L)^2; % 计算C2参数,给对比度C(x,y)用。 C2=58.522500 window = window/sum(sum(window)); %滤波器归一化操作。

mu1 = filter2(window, img1, 'valid'); % 对图像进行滤波因子加权 valid改成same结果会低一丢丢 mu2 = filter2(window, img2, 'valid'); % 对图像进行滤波因子加权

mu1_sq = mu1.mu1; % 计算出Ux平方值。 mu2_sq = mu2.mu2; % 计算出Uy平方值。 mu1_mu2 = mu1.mu2; % 计算UxUy值。

sigma1_sq = filter2(window, img1.img1, 'valid') - mu1_sq; % 计算sigmax (标准差) sigma2_sq = filter2(window, img2.img2, 'valid') - mu2_sq; % 计算sigmay (标准差) sigma12 = filter2(window, img1.*img2, 'valid') - mu1_mu2; % 计算sigmaxy(标准差)

if (C1 > 0 & C2 > 0) ssim_map = ((2mu1_mu2 + C1).(2sigma12 + C2))./((mu1_sq + mu2_sq + C1).(sigma1_sq + sigma2_sq + C2)); else numerator1 = 2mu1_mu2 + C1; numerator2 = 2sigma12 + 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

yunhengzi commented 3 years ago

For SSIM evaluation, we adopt the commonly used codes provided by Z. Wang. ############################## function [mssim, ssim_map] = SSIM(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 ap pearon 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 visibility to structural similarity" %IEEE Transactios on Image Processing, vol. 13, no. 4, pp.600-612, %Apr. 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); % 参数一个标准偏差1.5,11*11的高斯低通滤波。消除窗口映射矩阵的分块效应 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

if size(img1,3)~=1 %判断图像时不是彩色图,如果是,结果为3,否则为1 org=rgb2ycbcr(img1); test=rgb2ycbcr(img2); y1=org(:,:,1); y2=test(:,:,1); y1=double(y1); y2=double(y2); else y1=double(img1); y2=double(img2); end img1 = double(y1); img2 = double(y2); % 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; % 计算C1参数,给亮度L(x,y)用。 C1=6.502500 C2 = (K(2)L)^2; % 计算C2参数,给对比度C(x,y)用。 C2=58.522500 window = window/sum(sum(window)); %滤波器归一化操作。

mu1 = filter2(window, img1, 'valid'); % 对图像进行滤波因子加权 valid改成same结果会低一丢丢 mu2 = filter2(window, img2, 'valid'); % 对图像进行滤波因子加权

mu1_sq = mu1.mu1; % 计算出Ux平方值。 mu2_sq = mu2.mu2; % 计算出Uy平方值。 mu1_mu2 = mu1._mu2; % 计算Ux_Uy值。

sigma1_sq = filter2(window, img1.img1, 'valid') - mu1_sq; % 计算sigmax (标准差) sigma2_sq = filter2(window, img2.img2, 'valid') - mu2_sq; % 计算sigmay (标准差) sigma12 = filter2(window, img1.*img2, 'valid') - mu1_mu2; % 计算sigmaxy(标准差)

if (C1 > 0 & C2 > 0) ssim_map = ((2_mu1mu2 + C1).(2_sigma12 + C2))./((mu1_sq + mu2sq + 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

Thank you for your reply. Did you use the default K(K = [0.01 0.03]) and window( window = fspecial('gaussian', 11, 1.5)) to calculate the SSIM value?