mirror of
https://github.com/wassname/scikit-image.git
synced 2026-06-28 04:39:13 +08:00
af95784ac9
Solving white space + Correcting code Solving white spaces Solving white spaces Solving white spaces Answering comments Correcting silly mistakes Solving white spaces Trying again... now with Travis enabled
77 lines
2.4 KiB
Python
77 lines
2.4 KiB
Python
"""
|
|
===========================
|
|
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.
|
|
"""
|
|
|
|
import numpy as np
|
|
import matplotlib.pyplot as plt
|
|
|
|
from skimage import data, img_as_float
|
|
from skimage.measure import structural_similarity as ssim
|
|
|
|
img = img_as_float(data.camera())
|
|
rows, cols = img.shape
|
|
|
|
noise = np.ones_like(img) * 0.2 * (img.max() - img.min())
|
|
noise[np.random.random(size=noise.shape) > 0.5] *= -1
|
|
|
|
|
|
def mse(x, y):
|
|
return np.linalg.norm(x - y)
|
|
|
|
img_noise = img + noise
|
|
img_const = img + abs(noise)
|
|
|
|
fig, (ax0, ax1, ax2) = plt.subplots(nrows=1, ncols=3, figsize=(16, 6),
|
|
sharex=True, sharey=True,
|
|
subplot_kw={'adjustable': 'box-forced'})
|
|
plt.tight_layout()
|
|
|
|
mse_none = mse(img, img)
|
|
ssim_none = ssim(img, img, dynamic_range=img.max() - img.min())
|
|
|
|
mse_noise = mse(img, img_noise)
|
|
ssim_noise = ssim(img, img_noise,
|
|
dynamic_range=img_const.max() - img_const.min())
|
|
|
|
mse_const = mse(img, img_const)
|
|
ssim_const = ssim(img, img_const,
|
|
dynamic_range=img_noise.max() - img_noise.min())
|
|
|
|
label = 'MSE: %2.f, SSIM: %.2f'
|
|
|
|
ax0.imshow(img, cmap=plt.cm.gray, vmin=0, vmax=1)
|
|
ax0.set_xlabel(label % (mse_none, ssim_none))
|
|
ax0.set_title('Original image')
|
|
ax0.axes.get_yaxis().set_visible(False)
|
|
|
|
ax1.imshow(img_noise, cmap=plt.cm.gray, vmin=0, vmax=1)
|
|
ax1.set_xlabel(label % (mse_noise, ssim_noise))
|
|
ax1.set_title('Image with noise')
|
|
ax1.axes.get_yaxis().set_visible(False)
|
|
|
|
ax2.imshow(img_const, cmap=plt.cm.gray, vmin=0, vmax=1)
|
|
ax2.set_xlabel(label % (mse_const, ssim_const))
|
|
ax2.set_title('Image plus constant')
|
|
ax2.axes.get_yaxis().set_visible(False)
|
|
|
|
plt.show()
|