|
function PP_Evaluate_Demosaic_RGB_PSNR_SSIM()
|
|
clear all; close all; clc
|
|
tic
|
|
|
|
path_HR = 'HQ';
|
|
methods = {'Test_RNAN'};
|
|
method_name = 'RNAN';
|
|
|
|
sigma_current = 1;
|
|
dataset = {'Kodak24', 'CBSD68', 'McMaster18', 'Urban100'};
|
|
ext = {'*.jpg', '*.png', '*.bmp'};
|
|
num_method = length(methods);
|
|
num_set = length(dataset);
|
|
|
|
|
|
for idx_method = 1:num_method
|
|
|
|
for idx_set = 1
|
|
fprintf('**********************\n');
|
|
fprintf('Method_%d: %s; Set: %s\n', idx_method, methods{idx_method}, dataset{idx_set});
|
|
for sigma = sigma_current
|
|
filepaths = [];
|
|
for idx_ext = 1:length(ext)
|
|
filepaths = cat(1, filepaths, dir(fullfile(path_HR, dataset{idx_set}, ['N', num2str(sigma)], ext{idx_ext})));
|
|
end
|
|
PSNR_all = zeros(1, length(filepaths));
|
|
SSIM_all = zeros(1, length(filepaths));
|
|
for idx_im = 1:length(filepaths)
|
|
name_HR = filepaths(idx_im).name;
|
|
name_SR = strrep(name_HR, 'HQ', method_name);
|
|
im_HR = imread(fullfile(path_HR, dataset{idx_set}, ['N', num2str(sigma)], name_HR));
|
|
im_SR = imread(fullfile([methods{idx_method}, '/results'], dataset{idx_set}, ['N', num2str(sigma)], name_SR));
|
|
im_HR = double(im_HR);
|
|
im_SR = double(im_SR);
|
|
|
|
PSNR_all(idx_im) = csnr(im_HR, im_SR, 0, 0);
|
|
[~, SSIM_all(idx_im)] = Cal_PSNRSSIM(im_HR, im_SR, 0, 0);
|
|
fprintf('x%d %d %s: PSNR= %f SSIM= %f\n', sigma, idx_im, name_HR, PSNR_all(idx_im), SSIM_all(idx_im));
|
|
|
|
end
|
|
fprintf('--------Mean--------\n');
|
|
fprintf('x%d: PSNR= %f, SSIM= %f \n', sigma, mean(PSNR_all), mean(SSIM_all));
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|
|
function s=csnr(A,B,row,col)
|
|
|
|
[n,m,ch]=size(A);
|
|
|
|
if ch==1
|
|
e=A-B;
|
|
e=e(row+1:n-row,col+1:m-col);
|
|
me=mean(mean(e.^2));
|
|
s=10*log10(255^2/me);
|
|
else
|
|
e=A-B;
|
|
e=e(row+1:n-row,col+1:m-col,:);
|
|
e1=e(:,:,1);e2=e(:,:,2);e3=e(:,:,3);
|
|
me1=mean(mean(e1.^2));
|
|
me2=mean(mean(e2.^2));
|
|
me3=mean(mean(e3.^2));
|
|
mse=(me1+me2+me3)/3;
|
|
s = 10*log10(255^2/mse);
|
|
|
|
|
|
|
|
end
|
|
end
|
|
|
|
function [psnr_cur, ssim_cur] = Cal_PSNRSSIM(A,B,row,col)
|
|
|
|
|
|
[n,m,ch]=size(B);
|
|
A = A(row+1:n-row,col+1:m-col,:);
|
|
B = B(row+1:n-row,col+1:m-col,:);
|
|
A=double(A);
|
|
B=double(B);
|
|
|
|
e=A(:)-B(:);
|
|
mse=mean(e.^2);
|
|
psnr_cur=10*log10(255^2/mse);
|
|
|
|
if ch==1
|
|
[ssim_cur, ~] = ssim_index(A, B);
|
|
else
|
|
ssim_cur = (ssim_index(A(:,:,1), B(:,:,1)) + ssim_index(A(:,:,2), B(:,:,2)) + ssim_index(A(:,:,3), B(:,:,3)))/3;
|
|
end
|
|
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;
|
|
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 |