Skip to main content

A Python package for volumetric image quality assessment.

Project description

Logo for vIQA: A cube with three slices colored in red, green and blue in one direction and three slices colored in black, gray and white in another direction.

vIQA — volumetric Image Quality Assessment


Project Status: Active – The project has reached a stable, usable state and is being actively developed. PyPI - Version PyPI - Python Version PyPI - License PyPI - Downloads Release pre-commit pre-commit.ci status Ruff Binder Contributor Covenant

Table of Contents

vIQA provides an extensive assessment suite for image quality of 2D-images or 3D-volumes as a python package. Image Quality Assessment (IQA) is a field of research that aims to quantify the quality of an image. This is usually done by comparing the image to a reference image (full-reference metrics), but can also be done by evaluating the image without a reference (no-reference metrics). The reference image is usually the original image, but can also be another image that is considered to be of high quality. The comparison is done by calculating a metric that quantifies the difference between the two images or for the image itself. These quality metrics are used in various fields, such as medical imaging, computer vision, and image processing. For example the efficiency of image compression algorithms can be evaluated by comparing the compressed image to the original image. This package implements several metrics to compare two images or volumes using different IQA metrics. In addition, some metrics are implemented that can be used to evaluate a single image or volume.

The metrics used are:

  • Peak Signal to Noise Ratio (PSNR)
  • Root Mean Square Error (RMSE)
  • Universal Quality Index (UQI) [^1]
  • Structural Similarity (SSIM) [^2]
  • Multi-Scale Structural Similarity (MS-SSIM) [^3]
  • Feature Similarity Index (FSIM) [^4]
  • Visual Information Fidelity in pixel domain (VIFp) [^5]

[!CAUTION] The calculated values for VIFp are probably not correct in this implementation. Those values should be treated with caution as further testing is required.

  • Visual Saliency Index (VSI) [^6]

[!WARNING] The original metric supports RGB images only. This implementation can work with grayscale images by copying the luminance channel 3 times.

  • Most Apparent Distortion (MAD) [^7]
  • Gradient Similarity Measure (GSM) [^8]

[!CAUTION] This metric is not yet tested. The metric should be only used for experimental purposes.

  • Contrast to Noise Ratio (CNR) [^9]
  • Signal to Noise Ratio (SNR)
  • Q-Measure [^10]

Overview

Metric Name Type Dimensional behaviour Colour Behaviour Range (different/worst - identical/best) Tested Validated Reference
PSNR Peak Signal to Noise Ratio FR 3D native ✔️ $[0, \infty)$ ✔️ ✔️
RMSE Root Mean Square Error FR 3D native ✔️ $(\infty, 0]$ ✔️ ✔️
UQI [^a] Universal Quality Index FR 3D native (✔️) [^b] $[-1, 1]$ (✔️) [^c] [^1]
SSIM Structural Similarity FR 3D native (✔️) [^b] $[-1, 1]$ [^d] ✔️ ✔️ [^2]
MS-SSIM Multi-Scale Structural Similarity FR 3D slicing $[0, 1]$ ✔️ [^3]
FSIM Feature Similarity Index FR 3D slicing ✔️ $[0, 1]$ ✔️ ✔️ [^4]
VIFp Visual Information Fidelity in pixel domain FR 3D slicing $[0, \infty)$ [^e] [^5]
VSI Visual Saliency Index FR 3D slicing ✔️ [^f] $[0, 1]$ [^6]
MAD Most Apparent Distortion FR 3D slicing $[0, \infty)$ ✔️ [^7]
GSM Gradient Similarity FR 3D native or slicing $[0, 1]$ [^8]
CNR Contrast to Noise Ratio NR 3D native $[0, \infty)$ ✔️ [^9]
SNR Signal to Noise Ratio NR 3D native ✔️ $[0, \infty)$ ✔️
Q-Measure Q-Measure NR 3D only [^g] $[0, \infty)$ [^10]

[^a]: UQI is a special case of SSIM. Also see [^2]. [^b]: The metric is calculated channel-wise for color images. The values are then averaged after weighting. [^c]: As UQI is a special case of SSIM, the validation of SSIM is also valid for UQI. [^d]: The range for SSIM is given as $[-1, 1]$, but is usually $[0, 1]$ in practice. [^e]: Normally $[0, 1]$, but can be higher than 1 for modified images with higher contrast than reference images. [^f]: The original metric supports RGB images only. This implementation can work with grayscale images by copying the luminance channel 3 times. [^g]: The Q-Measure is a special metric designed for CT images. Therefore it only works with 3D volumes.

Documentation

The API documentation can be found here.

Requirements

The following packages have to be installed:

  • matplotlib
  • nibabel
  • numpy
  • piq
  • pytorch
  • scikit-image
  • scipy
  • tqdm
  • (jupyter) if you want to use the provided notebook

Installation

Use either pip

pip install viqa

or conda

conda install -c conda-forge viqa

[!IMPORTANT] The package is currently in development and not yet available on conda-forge.

Usage

Workflow

Images are first loaded from .raw files or .mhd files and their corresponding .raw file, normalized to the chosen data range (if the parameter normalize=True is set) and then compared. The scores are then calculated and can be printed. If using paths file names need to be given with the bit depth denoted as a suffix (e.g. _8ubit.raw, _16fbit.mhd; u and f denoting unsigned integer or float respectively) and the dimensions of the images need to be given in the file name (e.g. 512x512x512). The images are assumed to be grayscale. Treatment of color images is planned for later versions. The metrics are implemented to calculate the scores for an 8-bit data range (0-255) per default. For some metrics the resulting score is different for different data ranges. When calculating several metrics for the same image, the same data range should be used for all metrics. The data range can be changed by setting the parameter data_range for each metric. This parameter primarily affects the loading behavior of the class instances when not using the vIQA.utils.load_data function directly as described further below, but for some metrics setting the data range is necessary to calculate the score (e.g. PSNR).

Examples

Better:

import viqa
from viqa import load_data, normalize_data

## load images
file_path_img_r = 'path/to/reference_image_8ubit_512x512x512.raw'
file_path_img_m = 'path/to/modified_image_8ubit_512x512x512.raw'
img_r = load_data(
  file_path_img_r,
  data_range=1,
  normalize=False,
)  # data_range ignored due to normalize=False
img_m = load_data(file_path_img_m)  # per default: normalize=False
# --> both images are loaded as 8-bit images

# calculate and print RMSE score
rmse = viqa.RMSE()
score_rmse = rmse.score(img_r, img_m)  # RMSE does not need any parameters
rmse.print_score(decimals=2)

# normalize to 16-bit
img_r = normalize_data(img_r, data_range_output=(0, 65535))
img_m = load_data(img_m, data_range=65535, normalize=True)
# --> both functions have the same effect

# calculate and print PSNR score
psnr = viqa.PSNR(data_range=65535)  # PSNR needs data_range to calculate the score
score_psnr = psnr.score(img_r, img_m)
psnr.print_score(decimals=2)

# set optional parameters for MAD as dict
calc_parameters = {
    'block_size': 16,
    'block_overlap': 0.75,
    'beta_1': 0.467,
    'beta_2': 0.130,
    'luminance_function': {'b': 0, 'k': 0.02874, 'gamma': 2.2},
    'orientations_num': 4,
    'scales_num': 5,
    'weights': [0.5, 0.75, 1, 5, 6]
}

# calculate and print MAD score
mad = viqa.MAD(data_range=65535)  # MAD needs data_range to calculate the score
score_mad = mad.score(img_r, img_m, dim=2, **calc_parameters)
mad.print_score(decimals=2)

Possible, but worse (recommended only if you want to calculate a single metric):

import viqa

file_path_img_r = 'path/to/reference_image_512x512x512_16ubit.raw'
file_path_img_m = 'path/to/modified_image_512x512x512_16ubit.raw'

load_parameters = {'data_range': 1, 'normalize': True}
# data_range is set to 1 to normalize the images
# to 0-1 and for calculation, if not set 255 would
# be used as default for loading and calculating
# the score

psnr = viqa.PSNR(**load_parameters)  # load_parameters necessary due to direct loading by class
# also PSNR needs data_range to calculate the score
# if images would not be normalized, data_range should be
# 65535 for 16-bit images for correct calculation
score = psnr.score(file_path_img_r, file_path_img_m)
# --> images are loaded as 16-bit images and normalized to 0-1 via the `load_data` function
#     called by the score method
psnr.print_score(decimals=2)

[!TIP] It is recommended to load the images directly with the vIQA.utils.load_data function first and then pass the image arrays to the metrics functions. You can also pass the image paths directly to the metrics functions. In this case, the images will be loaded with the given parameters. This workflow is only recommended if you want to calculate a single metric.

[!IMPORTANT] The current recommended usage files are: Image_Comparison.ipynb and Image_comparison_batch.ipynb.

For more examples, see the provided Jupyter notebooks and the documentation under API Reference.

Container Images

Container images to use this package in a JupyterHub or Daskhub environment as a single user notebook can be found under ./containers.

TODO

  • Add metrics
    • Add SFF/IFS
    • Add Ma
    • Add PI
    • Add NIQE
  • Add tests
    • Add tests for RMSE
    • Add tests for PSNR
    • Add tests for SSIM
    • Add tests for MSSSIM
    • Add tests for FSIM
    • Add tests for VSI
    • Add tests for VIF
    • Add tests for MAD
    • Add tests for GSM
    • Add tests for CNR
    • Add tests for SNR
    • Add tests for Q-Measure
  • Add support for different data ranges
  • Validate metrics
  • Add color image support
  • Add support for printing values
    • Add support for .txt files
    • Add support for .csv files
  • Add support for fusions
    • Add support for linear combination
    • Add support for decision fusion

Contributing

See CONTRIBUTING.md for information on how to contribute to the project and development guide for further information.

License

BSD 3-Clause

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

  3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Contacts

Lukas Behammer, lukas.behammer@fh-wels.at

References

[^1]: Wang, Z., & Bovik, A. C. (2002). A Universal Image Quality Index. IEEE SIGNAL PROCESSING LETTERS, 9(3). https://doi.org/10.1109/97.995823 [^2]: Wang, Z., Bovik, A. C., Sheikh, H. R., & Simoncelli, E. P. (2004). Image quality assessment: From error visibility to structural similarity. IEEE Transactions on Image Processing, 13(4), 600–612. https://doi.org/10.1109/TIP.2003.819861 [^3]: Wang, Z., Simoncelli, E. P., & Bovik, A. C. (2003). Multi-scale structural similarity for image quality assessment. The Thirty-Seventh Asilomar Conference on Signals, Systems & Computers, 1298–1402. https://doi.org/10.1109/ACSSC.2003.1292216 [^4]: Zhang, L., Zhang, L., Mou, X., & Zhang, D. (2011). FSIM: A feature similarity index for image quality assessment. IEEE Transactions on Image Processing, 20(8). https://doi.org/10.1109/TIP.2011.2109730 [^5]: Sheikh, H. R., & Bovik, A. C. (2006). Image information and visual quality. IEEE Transactions on Image Processing, 15(2), 430–444. https://doi.org/10.1109/TIP.2005.859378 [^6]: Zhang, L., Shen, Y., & Li, H. (2014). VSI: A visual saliency-induced index for perceptual image quality assessment. IEEE Transactions on Image Processing, 23(10), 4270–4281. https://doi.org/10.1109/TIP.2014.2346028 [^7]: Larson, E. C., & Chandler, D. M. (2010). Most apparent distortion: full-reference image quality assessment and the role of strategy. Journal of Electronic Imaging, 19 (1), 011006. https://doi.org/10.1117/1.3267105 [^8]: Liu, A., Lin, W., & Narwaria, M. (2012). Image quality assessment based on gradient similarity. IEEE Transactions on Image Processing, 21(4), 1500–1512. https://doi.org/10.1109/TIP.2011.2175935 [^9]: Desai, N., Singh, A., & Valentino, D. J. (2010). Practical evaluation of image quality in computed radiographic (CR) imaging systems. Medical Imaging 2010: Physics of Medical Imaging, 7622, 76224Q. https://doi.org/10.1117/12.844640 [^10]: Reiter, M., Weiß, D., Gusenbauer, C., Erler, M., Kuhn, C., Kasperl, S., & Kastner, J. (2014). Evaluation of a Histogram-based Image Quality Measure for X-ray computed Tomography. 5th Conference on Industrial Computed Tomography (iCT) 2014, 25-28 February 2014, Wels, Austria. e-Journal of Nondestructive Testing Vol. 19(6). https://www.ndt.net/?id=15715

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

viqa-2.2.3.tar.gz (167.2 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

viqa-2.2.3-cp312-cp312-win_amd64.whl (207.9 kB view details)

Uploaded CPython 3.12Windows x86-64

viqa-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

viqa-2.2.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (268.0 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

viqa-2.2.3-cp312-cp312-macosx_13_3_x86_64.whl (150.8 kB view details)

Uploaded CPython 3.12macOS 13.3+ x86-64

viqa-2.2.3-cp312-cp312-macosx_13_3_arm64.whl (144.5 kB view details)

Uploaded CPython 3.12macOS 13.3+ ARM64

viqa-2.2.3-cp311-cp311-win_amd64.whl (207.9 kB view details)

Uploaded CPython 3.11Windows x86-64

viqa-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

viqa-2.2.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (268.0 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

viqa-2.2.3-cp311-cp311-macosx_13_3_x86_64.whl (150.8 kB view details)

Uploaded CPython 3.11macOS 13.3+ x86-64

viqa-2.2.3-cp311-cp311-macosx_13_3_arm64.whl (144.5 kB view details)

Uploaded CPython 3.11macOS 13.3+ ARM64

File details

Details for the file viqa-2.2.3.tar.gz.

File metadata

  • Download URL: viqa-2.2.3.tar.gz
  • Upload date:
  • Size: 167.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.11.9

File hashes

Hashes for viqa-2.2.3.tar.gz
Algorithm Hash digest
SHA256 db54f43d2bd9ff0412a7378ae5cc2d6c4037e6efbc2b8cafa42fe20c19b0e5e2
MD5 c0ad0722700ebb91eccd6035b6fc7dfa
BLAKE2b-256 76d31d309a1511f0cc8c2eb416efca525d8439d7579d8eaf5fda3a8193ffbf18

See more details on using hashes here.

File details

Details for the file viqa-2.2.3-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: viqa-2.2.3-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 207.9 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.11.9

File hashes

Hashes for viqa-2.2.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 0720dd16fc79776693afe2835eea868e33600b6c5b7d1e088e403a076ef4b02c
MD5 3d7ca91d1ad35bf55b4f6d5f131d85d6
BLAKE2b-256 0224f4c31c96c2c7d19f50ac4df3dca5c1bfcc36535c39da101a7a8756d51ec6

See more details on using hashes here.

File details

Details for the file viqa-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for viqa-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 86c8a5d2b76c3393c0877fa6a95ecaa5dd6af2a64e9b6c58dfdba75bbc5fef9c
MD5 114da36e4f3ceeecf2e64061cdbd377f
BLAKE2b-256 ae11fd7867bb109758d589568d12e6c698a2d53c74845f5ec90485280319d26c

See more details on using hashes here.

File details

Details for the file viqa-2.2.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for viqa-2.2.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d8fd66cac76e4005af0a26589dfbecee718aabe5011914dc7c17133eb40a4eec
MD5 f9f09f9a934ddadeb2078199a4a0bb8a
BLAKE2b-256 00e4de25a8e8c1b0aed2eb3c0a3759737d42a766bc4fbc6938463ebdc7aab4d2

See more details on using hashes here.

File details

Details for the file viqa-2.2.3-cp312-cp312-macosx_13_3_x86_64.whl.

File metadata

File hashes

Hashes for viqa-2.2.3-cp312-cp312-macosx_13_3_x86_64.whl
Algorithm Hash digest
SHA256 80971424b1dc667e4342620a80f4189a7d3ba7709c6755ffda87b355d9aa20a3
MD5 32ec232eaf36387b3188a0cae9e9ea5a
BLAKE2b-256 e10795e7e860d9be7c660ec93a94fb1d08f0b1574f5aaf89369d0c17bfc15170

See more details on using hashes here.

File details

Details for the file viqa-2.2.3-cp312-cp312-macosx_13_3_arm64.whl.

File metadata

File hashes

Hashes for viqa-2.2.3-cp312-cp312-macosx_13_3_arm64.whl
Algorithm Hash digest
SHA256 00b8f35e726100321bd7b6f186c4e8dd423d9e8642fc451514fc5dda9741a88d
MD5 2431555782d3eef724033ecceaf81df8
BLAKE2b-256 d1780f28b676ed1e9b95e7eefde3e3c5993973b50edf714e24d89845b9dfb40e

See more details on using hashes here.

File details

Details for the file viqa-2.2.3-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: viqa-2.2.3-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 207.9 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.11.9

File hashes

Hashes for viqa-2.2.3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 61b4e6a4e44320fb484eb08988be11fc036ac913f8b13f54678cf39d24c1f0a1
MD5 c0860e7c61d0bd972a7f6fae88e9be76
BLAKE2b-256 e85da21551bcf106f0118c3d5741e4d29e3da5c645ee6038384ad78206964be4

See more details on using hashes here.

File details

Details for the file viqa-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for viqa-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c1376f3beb0ea3f0cf4aaac9498d2607d46e0d105a97e3fa2d177005dbf63ada
MD5 2108b1424d336645b3140f0285de9068
BLAKE2b-256 18955f123691c7926d81ef0f82e2520e53bb5ff9c5b2d7c868059b2fb7a3bf31

See more details on using hashes here.

File details

Details for the file viqa-2.2.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for viqa-2.2.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 612a52f12c3f4fbdfaabc85f77eb3bf0ead92fe6fac0841a39b3a97471a1a88d
MD5 7ebaaa05b58fe11325db18c3106e852c
BLAKE2b-256 cd24b9c3a0a26858d172053ee5831d161b6b5f9ae36c55146aeb51dbd6a3d55e

See more details on using hashes here.

File details

Details for the file viqa-2.2.3-cp311-cp311-macosx_13_3_x86_64.whl.

File metadata

File hashes

Hashes for viqa-2.2.3-cp311-cp311-macosx_13_3_x86_64.whl
Algorithm Hash digest
SHA256 d7a0b9958c1ec1d4e96c4822b4707a7f639a61f1f3be68ff5dba9ee6c5b5d42f
MD5 b638ed789271b90768155d2fc7647a03
BLAKE2b-256 ed7ff6c32216b3ca6782f2fe6e5ca1384f5b1e43ae7e4fd879ae127978305485

See more details on using hashes here.

File details

Details for the file viqa-2.2.3-cp311-cp311-macosx_13_3_arm64.whl.

File metadata

File hashes

Hashes for viqa-2.2.3-cp311-cp311-macosx_13_3_arm64.whl
Algorithm Hash digest
SHA256 1cf54da541ecb03cca6be7e4660b06e8bf160f357946d3b993378d54ad028201
MD5 34b96fff39262bbcc42fa4af9d645857
BLAKE2b-256 b571e8a055caa10ac0833c5798905de996d32de0693049021d5edeed6a321dcb

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page