OpenCvSharp使用SSIM指数衡量图片相似度

在自动化测试时,经常需要截图和标准图片对比,以此判断测试是否成功,那么用什么来判断测试图片与标准图片是相似的呢?这里需要使用SSIM (Structual Similarity, 结构相似性) 用来判断图片相似度

一、SSIM

结构相似性指数(Structural Similarity Index,SSIM index)是一种用以衡量两张数位影像相似程度的指标。当两张影像其中一张为无失真影像,另一张为失真后的影像,二者的结构相似性可以看成是失真影像的影像品质衡量指标。相较于传统所使用的影像品质衡量指标,像是峰值信噪比,由于SSIM是基于局部图案的亮度、对比度进行计算的,所以其在影像品质的衡量上更能符合人眼对影像品质的判断

Wikipedia-结构相似性
图像质量评价之结构相似性SSIM(上)

二、代码实现

我的所有测试脚本都是基于C#编写的,这里需要用到开源图像处理库OpenCvSharp4.Windows,它是在Window系统中对OpenCv库的C#封装。这个库有依赖于其他的库,所以在调用该库前,请确保自己电脑正确安装以下依赖:
在这里插入图片描述
在项目Nuget中安装以下OpenCvSharp4.Windows
在这里插入图片描述
全部代码位于这里,请自取 Image.Similarity

三、测试效果

在这里插入图片描述
测试的五张图片说明(图片的长宽都相同)
在这里插入图片描述
在这里插入图片描述
测试结果
在这里插入图片描述
所以经过测试我们可以得出以下结论

  • SSIM值大于或等于0.999999时,可以认为两张图片"完全一致"。事实上在测试的时候,由于网络波动或者CPU性能原因,图片有时内容完全一致但Size有细微差别,比如标准图片为1478KB,而测试结果图片为1462KB,这个时候我们应该认为这两张图片是一样的,而经过测试显然SSIM指标完全符合这个要求
  • SSIM值小于0.999999时,可以认为两张图片不一致。显然,无论是几个像素的修改还是大范围修改,甚至是不同的图片,SSIM指标都能检测出来,也符合我们的要求