Source code for magni.imaging.evaluation
"""
..
Copyright (c) 2014-2017, Magni developers.
All rights reserved.
See LICENSE.rst for further information.
Module providing functions for evaluation of image reconstruction quality.
Routine listings
----------------
calculate_mse(x_org, x_recons)
Function to calcualte Mean Squared Error (MSE).
calculate_psnr(x_org, x_recons, peak)
Function to calculate Peak Signal to Noise Ratio (PSNR).
calculate_retained_energy(x_org, x_recons)
Function to calculate the percentage of energy retained in reconstruction.
"""
from __future__ import division
import numpy as np
from magni.utils.validation import decorate_validation as _decorate_validation
from magni.utils.validation import validate_numeric as _numeric
[docs]def calculate_mse(x_org, x_recons):
r"""
Calculate Mean Squared Error (MSE) between `x_recons` and `x_org`.
Parameters
----------
x_org : ndarray
Array of original values.
x_recons : ndarray
Array of reconstruction values.
Returns
-------
mse : float
Mean Squared Error (MSE).
Notes
-----
The Mean Squared Error (MSE) is calculated as:
.. math::
\frac{1}{N} \cdot \sum(x_{org} - x_{recons})^2
where `N` is the number of entries in `x_org`.
Examples
--------
For example,
>>> import numpy as np
>>> from magni.imaging.evaluation import calculate_mse
>>> x_org = np.arange(4).reshape(2, 2)
>>> x_recons = np.ones((2,2))
>>> print('{:.2f}'.format(calculate_mse(x_org, x_recons)))
1.50
"""
@_decorate_validation
def validate_input():
_numeric('x_org', ('integer', 'floating'), shape=None)
_numeric('x_recons', ('integer', 'floating'), shape=x_org.shape)
validate_input()
return ((x_org - x_recons) ** 2).mean()
[docs]def calculate_psnr(x_org, x_recons, peak):
r"""
Calculate Peak Signal to Noise Ratio (PSNR) between `x_recons` and `x_org`.
Parameters
----------
x_org : ndarray
Array of original values.
x_recons : ndarray
Array of reconstruction values.
peak : int or float
Peak value.
Returns
-------
psnr : float
Peak Signal to Noise Ratio (PSNR) in dB.
Notes
-----
The PSNR is as calculated as
.. math::
10 \cdot \log_{10}\left(\frac{peak^2}{ 1/N \cdot \sum(x_{org} -
x_{recons})^2}\right)
where `N` is the number of entries in `x_org`.
If :math:`|x_{org} - x_{recons}| <= (10^{-8} + 1^{-5} * |x_{recons}|)`
then `np.inf` is returned.
Examples
--------
For example,
>>> import numpy as np
>>> from magni.imaging.evaluation import calculate_psnr
>>> x_org = np.arange(4).reshape(2, 2)
>>> x_recons = np.ones((2,2))
>>> peak = 3
>>> print('{:.2f}'.format(calculate_psnr(x_org, x_recons, peak)))
7.78
"""
@_decorate_validation
def validate_input():
_numeric('x_org', ('integer', 'floating'), shape=None)
_numeric('x_recons', ('integer', 'floating'), shape=x_org.shape)
_numeric('peak', ('integer', 'floating'), range_='(0;inf)')
validate_input()
if np.allclose(x_org, x_recons):
psnr = np.inf
else:
psnr = 10 * np.log10(peak**2 / ((x_org - x_recons) ** 2).mean())
return psnr
[docs]def calculate_retained_energy(x_org, x_recons):
r"""
Calculate percentage of energy retained in reconstruction.
Parameters
----------
x_org : ndarray
Array of original values (must not be all zeros).
x_recons : ndarray
Array of reconstruction values.
Returns
-------
energy : float
Percentage of retained energy in reconstruction.
Notes
-----
The retained energy is as calculated as
.. math::
\frac{\sum x_{recons}^2}{\sum x_{org}^2} \cdot 100\%
Examples
--------
For example,
>>> import numpy as np
>>> from magni.imaging.evaluation import calculate_retained_energy
>>> x_org = np.arange(4).reshape(2, 2)
>>> x_recons = np.ones((2,2))
>>> print('{:.2f}'.format(calculate_retained_energy(x_org, x_recons)))
28.57
"""
@_decorate_validation
def validate_input():
_numeric('x_org', ('integer', 'floating'), shape=None)
if np.count_nonzero(x_org) == 0:
raise ValueError('x_org must not be all zeros')
_numeric('x_recons', ('integer', 'floating'), shape=x_org.shape)
validate_input()
return (x_recons ** 2).sum() / (x_org ** 2).sum() * 100