结构相似指数

在比较图像时,均方误差(MSE)--虽然实现起来很简单--并不能很好地反映出感知到的相似性。结构相似性旨在通过考虑纹理来解决这一缺点 1, 2.

该示例显示了输入图像的两个修改,每个修改具有相同的MSE,但具有非常不同的平均结构相似性指数。

1

周旺;Bovik,A.C.;“均方误差:爱它还是离开它?信号保真度测量的新视角”,IEEE信号处理杂志,第26卷,第1期,第98-117页,2009年1月。

2

Z.Wang,A.C.Bovik,H.R.Sheikh和E.P.Simoncelli,<图像质量评估:从错误可见性到结构相似性>,IEEE图像处理学报,第13卷,第4期,第600-612页,2004年4月。

Original image, Image with noise, Image plus constant
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())
noise[np.random.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())

label = 'MSE: {:.2f}, SSIM: {:.2f}'

ax[0].imshow(img, cmap=plt.cm.gray, vmin=0, vmax=1)
ax[0].set_xlabel(label.format(mse_none, ssim_none))
ax[0].set_title('Original image')

ax[1].imshow(img_noise, cmap=plt.cm.gray, vmin=0, vmax=1)
ax[1].set_xlabel(label.format(mse_noise, ssim_noise))
ax[1].set_title('Image with noise')

ax[2].imshow(img_const, cmap=plt.cm.gray, vmin=0, vmax=1)
ax[2].set_xlabel(label.format(mse_const, ssim_const))
ax[2].set_title('Image plus constant')

plt.tight_layout()
plt.show()

脚本的总运行时间: (0分0.352秒)

Gallery generated by Sphinx-Gallery