图像处理中常用的相似度评估指标

Posted 修炼之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像处理中常用的相似度评估指标相关的知识,希望对你有一定的参考价值。

导读

有时候我们想要计算两张图片是否相似,而用来衡量两张图片相似度的算法也有很多,例如:RMSEPSNRSSIMUQISIFT以及深度学习等。这篇文章主要介绍,RMSEPSNRSSIMUQI这些指标的计算和应用,关于SIFT算法来计算图像的相似度在后面的文章中再进行介绍

影响这些算法的结果也有很多因素,图片的噪声平移缩放旋转裁剪透视变换等,都会影响到算法的最终结果,所以我们需要根据不同的应用场景来选择使用不同的算法

MSE和RMSE

MSE(mean squared error):图像像素值的平方误差
RMSE(root mean squared error):图像像素值的平方根误差

  • 缺点
  1. 对比两张图片的size必须要完全一致
  2. 对缩放、旋转、裁剪敏感
  • 优点
  1. 计算速度快
  2. 算法简单
  • 适应场景
  1. 视频中对比前后两帧的差别
  2. 计算图片的相似
  • 代码实现
def mean_squared_error(img1,img2):
    #判断两张图片的shape是否一致
    assert img1.shape == img2.shape,"images have different shape " \\
                                    " and ".format(img1.shape,img2.shape)
    #计算两张图像的MSE
    img_mse = np.mean((img1.astype(np.float64) - img2.astype(np.float64))**2)
    #将图像的MSE量化为相似度
    img_sim = img_mse / (255**2)
    return img_mse,1 - img_sim

def root_mean_squared_error(img1,img2):
    #判断两张图片的shape是否一致
    assert img1.shape == img2.shape,"images have different shape " \\
                                    " and ".format(img1.shape,img2.shape)
    #计算两张图像的MSE
    img_rmse = np.sqrt(np.mean((img1.astype(np.float64) - img2.astype(np.float64))**2))
    #将图像的MSE量化为相似度
    img_sim = img_rmse / 255
    return img_rmse,1 - img_sim

计算两张图片的MSERMSE

print(mean_squared_error(img1,img2))
#(10826.879833697936, 0.8334966576901509)
print(root_mean_squared_error(img1,img2))
#(104.05229374549096, 0.5919517892333688)

PSNR

PSNR(Peak Signal Noise Ratio)也叫峰值信噪比:为了衡量处理后图像的品质,我们经常会使用到PSNR来衡量程序的处理结果是否令人满意。它是原图像与被处理图像之间的均方误差相对于 ( 2 n − 1 ) 2 (2^n-1)^2 (2n1)2的对数值(信号最大值的平方,n是每个采样值的比特数),计算公式如下:
P S N R = 10 ∗ l o g 10 ( 2 n − 1 ) 2 M S E PSNR = 10 * log_10\\frac(2^n-1)^2MSE PSNR=10log10MSE(2n1)2

  • 缺点
    PSNR的分数无法和人眼看到的品质完全一致

  • 优点
    算法简单,应用广泛

  • 适用场景
    用来评价画质客观量的测法,也可以用于图像相似的计算

  • 代码实现

def peak_signal_noise_ratio(img1,img2):
    #判断两张图片的size是否一致
    assert img1.shape == img2.shape,"images hava different shape " \\
                                    " and ".format(img1.shape,img2.shape)
    #获取数据类型所表示的最大值
    MAX = np.iinfo(img1.dtype).max
    #计算两张图片的MSE
    mse,_ = mean_squared_error(img1,img2)
    #计算两张图片的PSNR
    psnr = 10 * np.log10(MAX**2 / mse)

    return psnr


print(peak_signal_noise_ratio(img1,img2))
#49.24985796979349

:由于PSNR的取值范围在(0,inf),PSNR的值越大表示图像越相似。如果想要将PSNR指标量化为相似度,可以基于测试图片上设置一个最大的PSNR值,进行取最大操作来换算成相似度

SSIM

SSIM(structural similarity index)结构相似性:是一种用来衡量两张图像相似程度的指标。当两张图像其中有一张为无失真图像,另一张为失真后的图像,两张图像的结构相似性可以看做是失真图像的品质质量指标。结构相似性相对于峰值信噪比而言,结构相似性指标在图像品质的衡量上更能符合人眼对图像品质的判断

x x x y y y两个信号为例,结构相似性的计算公式如下:
S S I M ( x , y ) = ( l ( x , y ) ) α ( c ( x , y ) ) β ( s ( x , y ) ) γ l ( x , y ) = 2 μ x μ y + C 1 μ x 2 + μ y 2 + C 1 c ( x , y ) = 2 δ x δ y + C 2 δ x 2 + δ y 2 + C 2 s ( x , y ) = δ x y + C 3 δ x δ y + C 3 \\beginaligned SSIM(x,y) &= (l(x,y))^\\alpha(c(x,y))^\\beta(s(x,y))^\\gamma \\\\ l(x,y) &= \\frac2\\mu_x\\mu_y + C_1\\mu_x^2+\\mu_y^2+C_1 \\\\ c(x,y) &= \\frac2\\delta_x\\delta_y + C_2\\delta_x^2+\\delta_y^2+C_2\\\\ s(x,y) &= \\frac\\delta_xy+C_3\\delta_x\\delta_y+C_3 \\endaligned SSIM(x,y)l(x,y)c(x,y)s(x,y)=(l(x,y))α(c(x,y))β(s(x,y))γ=μx2+μy2+C12μxμy+C1=δx2+δy2+C22δxδy+C2=δxδy+C3δxy+C3
上式中的 l ( x , y ) l(x,y) l(x,y)比较的是两个信号之间的亮度, c ( x , y ) c(x,y) c(x,y)比较的是两个信号的对比度, s ( x , y ) s(x,y) s(x,y)比较的是两个信号的结构,其中 α > 0 , β > 0 , γ > 0 \\alpha > 0,\\beta > 0,\\gamma > 0 α>0β>0γ>0主要是用来调整 l ( x , y ) 、 c ( x , y ) 、 s ( x , y ) l(x,y)、c(x,y)、s(x,y) l(x,y)c(x,y)s(x,y)的重要性, μ x 和 μ y \\mu_x和\\mu_y μxμy表示的是信号的平均值, δ x 和 δ y \\delta_x和\\delta_y δxδy表示的是信号的标准差,而 δ x y \\delta_xy δxy为信号的协方差, C 1 、 C 2 、 C 3 C_1、C_2、C_3 C1C2C3皆为常数,用来维持 l ( x , y ) 、 c ( x , y ) 、 s ( x , y ) l(x,y)、c(x,y)、s(x,y) l(x,y)c(x,y)s(x,y)的稳定,SSIM的值越大,表示两个信号之间的相似度越高

在计算图像结构相似性的时候,我们一般会将参数设为 α = β = γ = 1 以 及 C 3 = C 2 / 2 \\alpha=\\beta=\\gamma=1以及C_3=C_2/2 α=β=γ=1C3=以上是关于图像处理中常用的相似度评估指标的主要内容,如果未能解决你的问题,请参考以下文章

图像处理中常用的相似度评估指标

基于特征点匹配的图像相似度算法之SIFT特征

基于特征点匹配的图像相似度算法之SIFT特征

基于特征点匹配的图像相似度算法之SIFT特征

用于在数据库中查找相似图像的指标

在python中测量两个rgb图像之间的相似度