【OpenCvSharp】使用SSIM指数衡量图片相似度
在自动化测试时,经常需要截图和标准图片对比,以此判断测试是否成功,那么用什么来判断测试图片与标准图片是相似的呢?这里需要使用SSIM
(Structual Similarity, 结构相似性) 用来判断图片相似度
一、SSIM
结构相似性指数(Structural Similarity Index,SSIM index)是一种用以衡量两张数位影像相似程度的指标。当两张影像其中一张为无失真影像,另一张为失真后的影像,二者的结构相似性可以看成是失真影像的影像品质衡量指标。相较于传统所使用的影像品质衡量指标,像是峰值信噪比,由于SSIM
是基于局部图案的亮度、对比度进行计算的,所以其在影像品质的衡量上更能符合人眼对影像品质的判断
二、代码实现
我的所有测试脚本都是基于C#
编写的,这里需要用到开源图像处理库OpenCvSharp4.Windows,它是在Window系统中对OpenCv库的C#封装。这个库有依赖于其他的库,所以在调用该库前,请确保自己电脑正确安装以下依赖:
在项目Nuget
中安装OpenCvSharp4.Windows
全部代码位于这里,请自取 Image.Similarity
三、测试效果
测试的五张图片说明(图片的长宽都相同)
测试结果
所以经过测试我们可以得出以下结论
- SSIM值大于或等于0.999999时,可以认为两张图片"完全一致"。事实上在测试的时候,由于网络波动或者CPU性能原因,图片有时内容完全一致但Size有细微差别,比如标准图片为1478KB,而测试结果图片为1462KB,这个时候我们应该认为这两张图片是一样的,而经过测试显然SSIM指标完全符合这个要求
- SSIM值小于0.999999时,可以认为两张图片不一致。显然,无论是几个像素的修改还是大范围修改,甚至是不同的图片,SSIM指标都能检测出来,也符合我们的要求