Source code for cbi_toolbox.reconstruct

"""
The reconstruct package provides reconstruction algorithms,
as well as preprocessing tools and performance scores.
"""

# Copyright (c) 2020 Idiap Research Institute, http://www.idiap.ch/
# Written by François Marelli <francois.marelli@idiap.ch>
#
# This file is part of CBI Toolbox.
#
# CBI Toolbox is free software: you can redistribute it and/or modify
# it under the terms of the 3-Clause BSD License.
#
# CBI Toolbox is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# 3-Clause BSD License for more details.
#
# You should have received a copy of the 3-Clause BSD License along
# with CBI Toolbox. If not, see https://opensource.org/licenses/BSD-3-Clause.
#
# SPDX-License-Identifier: BSD-3-Clause

import numpy as np


[docs]def psnr(ref, target, norm=None, limit=None): """ Computes the Peak Signal-to-Noise Ratio: PSNR = 10 log( limit ^ 2 / MSE(ref, target) ) Parameters ---------- ref : numpy.ndarray The ground-truth reference array. target : numpy.ndarray The reconstructed array. norm : str Normalize the images before computing snr, default is None. limit: float, optional The maximum pixel value used for PSNR computation, default is None (max(ref)). Returns ------- float The PSNR. """ if norm is None: pass elif norm == 'mse': scale_to_mse(ref, target) else: normalize(ref) normalize(target) if limit is None: limit = ref.max() return 10 * np.log10(limit**2 / mse(ref, target))
[docs]def mse(ref, target): """ Computes the Mean Squared Error between two arrays Parameters ---------- ref : numpy.ndarray Reference array. target : numpy.ndarray Target array. Returns ------- float The MSE. """ return np.square(np.subtract(ref, target)).mean()
[docs]def normalize(image, mode='std'): """ Normalize an image according to the given criterion. Parameters ---------- image : numpy.ndarray Image to normalize, will be modified. mode : str, optional Type of normalization to use, by default 'std'. Allowed: ['std', 'max', 'sum'] Returns ------- array The normalized image (same as input). Raises ------ ValueError For unknown mode. """ if mode == 'std': f = np.std(image) elif mode == 'max': f = np.max(image) elif mode == 'sum': f = np.sum(image) else: raise ValueError('Invalid norm: {}'.format(mode)) image /= f return image
[docs]def scale_to_mse(ref, target): """ Scale a target array to minimise MSE with reference Parameters ---------- ref : numpy.ndarray The reference for MSE. target : numpy.ndarray The array to rescale (will be done in-place). Returns ------- numpy.ndarray The rescaled target. """ w = np.sum(ref * target) / np.sum(target ** 2) target *= w return target