import numpy as np from skimage.measure import compare_ssim import matlab_wrapper import os import cv2 as cv from PIL import Image def FSIM(matlab, gt_img, test_img): """Calculate FSIM score. ------------------------- Use matlab wrapper to calculate fsim score. Codes come from: https://github.com/gregfreeman/image_quality_toolbox """ test_img = np.array(test_img) gt_img = np.array(gt_img) matlab.eval("addpath('./utils')") matlab.put('imageRef', gt_img) matlab.put('imageDis', test_img) matlab.eval('[score, fsimc] = FeatureSIM(imageRef, imageDis)') tmp_score = matlab.get('score') return tmp_score def SSIM(gt_img, test_img): """Calculate ssim score using skimage toolkit. """ test_img = np.array(test_img).astype(np.uint8) gt_img = np.array(gt_img).astype(np.uint8) tmp_score = compare_ssim(gt_img, test_img, gaussian_weights=True, sigma=1.5, use_sample_covariance=False) return tmp_score def avg_score(test_dir, gt_dir, metric_name='ssim', smooth=False, sigma=75, verbose=False): """ Read images from two folders and calculate the average score. """ metric_name = metric_name.lower() all_score = [] if metric_name == 'fsim': matlab = matlab_wrapper.MatlabSession() for name in sorted(sorted(os.listdir(gt_dir))): test_img = Image.open(os.path.join(test_dir, name)).convert('L') gt_img = Image.open(os.path.join(gt_dir, name)).convert('L') if smooth: test_img = cv.bilateralFilter(np.array(test_img),7,sigma,sigma) if metric_name == 'ssim': tmp_score = SSIM(gt_img, test_img) elif metric_name == 'fsim': tmp_score = FSIM(matlab, gt_img, test_img) if verbose: print('Image: {}, Metric: {}, Smooth: {}, Score: {}'.format(name, metric_name, smooth, tmp_score)) all_score.append(tmp_score) return np.mean(np.array(all_score))