.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "auto_examples/transform/plot_ssim.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note :ref:`Go to the end ` to download the full example code or to run this example in your browser via Binder .. rst-class:: sphx-glr-example-title .. _sphx_glr_auto_examples_transform_plot_ssim.py: =========================== Structural similarity index =========================== When comparing images, the mean squared error (MSE)--while simple to implement--is not highly indicative of perceived similarity. Structural similarity aims to address this shortcoming by taking texture into account [1]_, [2]_. The example shows two modifications of the input image, each with the same MSE, but with very different mean structural similarity indices. .. [1] Zhou Wang; Bovik, A.C.; ,"Mean squared error: Love it or leave it? A new look at Signal Fidelity Measures," Signal Processing Magazine, IEEE, vol. 26, no. 1, pp. 98-117, Jan. 2009. .. [2] Z. Wang, A. C. Bovik, H. R. Sheikh and E. P. Simoncelli, "Image quality assessment: From error visibility to structural similarity," IEEE Transactions on Image Processing, vol. 13, no. 4, pp. 600-612, Apr. 2004. .. GENERATED FROM PYTHON SOURCE LINES 23-68 .. image-sg:: /auto_examples/transform/images/sphx_glr_plot_ssim_001.png :alt: Original image, Image with noise, Image plus constant :srcset: /auto_examples/transform/images/sphx_glr_plot_ssim_001.png :class: sphx-glr-single-img .. code-block:: Python import numpy as np import matplotlib.pyplot as plt from skimage import data, img_as_float from skimage.metrics import structural_similarity as ssim from skimage.metrics import mean_squared_error img = img_as_float(data.camera()) rows, cols = img.shape noise = np.ones_like(img) * 0.2 * (img.max() - img.min()) rng = np.random.default_rng() noise[rng.random(size=noise.shape) > 0.5] *= -1 img_noise = img + noise img_const = img + abs(noise) fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(10, 4), sharex=True, sharey=True) ax = axes.ravel() mse_none = mean_squared_error(img, img) ssim_none = ssim(img, img, data_range=img.max() - img.min()) mse_noise = mean_squared_error(img, img_noise) ssim_noise = ssim(img, img_noise, data_range=img_noise.max() - img_noise.min()) mse_const = mean_squared_error(img, img_const) ssim_const = ssim(img, img_const, data_range=img_const.max() - img_const.min()) ax[0].imshow(img, cmap=plt.cm.gray, vmin=0, vmax=1) ax[0].set_xlabel(f'MSE: {mse_none:.2f}, SSIM: {ssim_none:.2f}') ax[0].set_title('Original image') ax[1].imshow(img_noise, cmap=plt.cm.gray, vmin=0, vmax=1) ax[1].set_xlabel(f'MSE: {mse_noise:.2f}, SSIM: {ssim_noise:.2f}') ax[1].set_title('Image with noise') ax[2].imshow(img_const, cmap=plt.cm.gray, vmin=0, vmax=1) ax[2].set_xlabel(f'MSE: {mse_const:.2f}, SSIM: {ssim_const:.2f}') ax[2].set_title('Image plus constant') plt.tight_layout() plt.show() .. rst-class:: sphx-glr-timing **Total running time of the script:** (0 minutes 0.599 seconds) .. _sphx_glr_download_auto_examples_transform_plot_ssim.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: binder-badge .. image:: images/binder_badge_logo.svg :target: https://mybinder.org/v2/gh/scikit-image/scikit-image/v0.23.2?filepath=notebooks/auto_examples/transform/plot_ssim.ipynb :alt: Launch binder :width: 150 px .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_ssim.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_ssim.py ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_