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