From e49b175092e90d26cccb1ce4921f379b2493eeb7 Mon Sep 17 00:00:00 2001 From: Elian Dib <elian.dib@inria.fr> Date: Sat, 3 Aug 2019 13:08:43 +0200 Subject: [PATCH] Added function to compute image quality metrics (PSNR,SSIM) --- qualityMetrics.m | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 qualityMetrics.m diff --git a/qualityMetrics.m b/qualityMetrics.m new file mode 100644 index 0000000..1c19386 --- /dev/null +++ b/qualityMetrics.m @@ -0,0 +1,47 @@ +function [psnr_y,ssim_y,psnr_yuv,ssim_yuv,psnr_u,ssim_u,psnr_v,ssim_v] = ... + qualityMetrics(rec,ref,varargin) +%QUALITYMETRICS Summary of this function goes here +% Detailed explanation goes here + +if (nargin < 3) + dr = diff(getrangefromclass(rec)); + n = log2(double(dr)+1); +else + n = varargin{1}; + dr = 2^n-1; +end + +numchan = size(rec,3); + +if numchan==1 + psnr_y = psnr(rec(:,:,1),ref(:,:,1),dr); + psnr_u = nan; + psnr_v = nan; + + psnr_yuv = nan; + + ssim_y = ssim(rec(:,:,1),ref(:,:,1),'DynamicRange',dr); + ssim_u = nan; + ssim_v = nan; + + ssim_yuv = nan; +elseif numchan==3 + rec = utils.rgb2ycbcr(rec,n,varargin{2:end}); + ref = utils.rgb2ycbcr(ref,n,varargin{2:end}); + + psnr_y = psnr(rec(:,:,1),ref(:,:,1),dr); + psnr_u = psnr(rec(:,:,2),ref(:,:,2),dr); + psnr_v = psnr(rec(:,:,3),ref(:,:,3),dr); + + psnr_yuv = (6*psnr_y + psnr_u + psnr_v)/8; + + ssim_y = ssim(rec(:,:,1),ref(:,:,1),'DynamicRange',dr); + ssim_u = ssim(rec(:,:,2),ref(:,:,2),'DynamicRange',dr); + ssim_v = ssim(rec(:,:,3),ref(:,:,3),'DynamicRange',dr); + + ssim_yuv = ssim(rec,ref,'DynamicRange',dr); +else + error('Unexpected number of channels'); +end + +end \ No newline at end of file -- GitLab