% Multi-Stage Progressive Image Restoration % Syed Waqas Zamir, Aditya Arora, Salman Khan, Munawar Hayat, Fahad Shahbaz Khan, Ming-Hsuan Yang, and Ling Shao % https://arxiv.org/abs/2102.02808 close all;clear all; datasets = {'Test100', 'Rain100H', 'Rain100L', 'Test2800', 'Test1200'}; num_set = length(datasets); psnr_alldatasets = 0; ssim_alldatasets = 0; tic for idx_set = 1:num_set file_path = strcat('/MATLAB Drive/painter/derain/derain_inference_epoch14_100/', datasets{idx_set}, '/'); gt_path = strcat('/MATLAB Drive/painter/derain/test/', datasets{idx_set}, '/target/'); path_list = [dir(strcat(file_path,'*.jpg')); dir(strcat(file_path,'*.png'))]; gt_list = [dir(strcat(gt_path,'*.jpg')); dir(strcat(gt_path,'*.png'))]; img_num = length(path_list); total_psnr = 0; total_ssim = 0; if img_num > 0 for j = 1:img_num image_name = path_list(j).name; gt_name = gt_list(j).name; input = imread(strcat(file_path,image_name)); gt = imread(strcat(gt_path, gt_name)); ssim_val = compute_ssim(input, gt); psnr_val = compute_psnr(input, gt); total_ssim = total_ssim + ssim_val; total_psnr = total_psnr + psnr_val; end end qm_psnr = total_psnr / img_num; qm_ssim = total_ssim / img_num; fprintf('For %s dataset PSNR: %f SSIM: %f\n', datasets{idx_set}, qm_psnr, qm_ssim); psnr_alldatasets = psnr_alldatasets + qm_psnr; ssim_alldatasets = ssim_alldatasets + qm_ssim; end fprintf('For all datasets PSNR: %f SSIM: %f\n', psnr_alldatasets/num_set, ssim_alldatasets/num_set); toc function ssim_mean=compute_ssim(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 ssim_mean = SSIM_index(img1, img2); end 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); end function [mssim, ssim_map] = SSIM_index(img1, img2, K, window, L) 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); end