使用FFmpeg计算和VMAF开源软件计算SSIM的结果,最终发现对同一个序列,FFmpeg和VMAF计算得到的SSIM值却不同。ffmetric的SSIM结果包含了Y,U,V三个分量的SSIM值以及它们的加权平均值,而VMAF计算的仅是亮度Y的SSIM结果。 但SSIM计算的公式是确定的,为什么两个软件会计算出不相同的亮度Y的SSIm结果呢?
因此去查了下FFmpeg和VMAF里面计算SSIM的有关资料。VMAF计算SSIM的源码是开源,链接:
https://github.com/Netflix/vmaf
vmafossexec 调用的是https://github.com/Netflix/vmaf/blob/master/libvmaf/src/feature/inteinteger_ssim.c,这种计算方式对图像进行了 downsample。 因为人眼看图片时,与图片有一定距离(相当于图片缩小),一些细节可被忽略,如果进行downsample,除了减低运算复杂度,还能更贴合人的主观观看感受。可参考原始算法文章:
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.
对图像downsample计算的SSIM的影响:
由于Zhou Wang版ssim对比时,原图与失真图都做了downsample(缩小),其产生的影响是:
1、downsample后的相似度 比 不做downsample的相似度 要高;
损失程度不同2张失真图,在downsample后进行ssim,2者相似度差距减少;
2、downsample是导致 Zhou Wang版本 与 matlab官方版本计算结果相差较大的主要原因。

FFmpeg计算源码链接 :
https://github.com/FFmpeg/FFmpeg/tree/master/tests/
FFmpeg/tests/tiny_ssim.c
1、没有对图像downsample;
2、为了提高计算速度,FFMPEG没有使用计算高斯加权后的均值和方差、协方差,而是直接使用8x8重叠像素块直接计算这三个统计量。
这就是两者计算SSIM值有差别的主要原因
参考:
https://github.com/FFmpeg/FFmpeg/tree/master/tests
https://ece.uwaterloo.ca/~z70wang/research/ssim/
https://github.com/Netflix/vmaf/issues/22
https://cloud.tencent.com/developer/article/1438942

更多推荐