使用SSIM量化评价视频编码质量
Lee-7723
2020年10月16日 15:21

SSIM是什么

    SSIM(Structural Similarity),结构相似性,是一种衡量两幅图像相似度的指标。SSIM使用的两张图像中,一张为未经压缩的无失真图像,另一张为失真后的图像。

    给定两个图像x和y, 两张图像的结构相似性可按照以下方式求出

计算公式

结构相似性的范围为0到1。当两张图像一模一样时,SSIM的值等于1。

以上内容只是搬运百度百科,那么

如何使用SSIM来量化评比压制质量

    当然,如果你有一定编程基础,想从头理解SSIM,可以用MATLAB自行编写计算,而且这并不算特别难写的算法。

    如果只是想用一用,简单评比一下,我目前知道的有两种方法:

1.FFmpeg自带的SSIM滤镜

官方说明:http://ffmpeg.org/ffmpeg-all.html#ssim

去 http://ffmpeg.org/download.html -> Get packages & executable files ->Windows EXE Files 下载。

添加为系统环境路径(或者直接使用),注意这类软件不带有GUI图形界面,请用命令行调用(能看到这里的人应该都知道怎么用这类CLI软件吧)

命令:

ffmpeg -i "INPUT_1&#​34;  -i "INPUT_2&#​34;  -lavfi ssim="stats_file=ssim.log&#​34; -f null -

注意这里stats_file=后面是相对路径(这里我不知道应该怎么使用绝对路径)

例如:

在E盘根目录下运行命令行,将E:\SSIM_test\clips下的两个视频进行对比,生成名为prores.log的文件,这是个文本类文件,可以直接查看。

为了方便数据处理,建议使用Excel->数据->从文本/CSV,加载数据到表格

每一行是两个输入文件的每帧之间的对比,分为Y、U、V三个色度和所有(ALL)。可以做一张折线图来看看哪些地方较好,哪些地方画质损失较大,一般来说画面越简单,变化越小的地方损失越小。用两种不同的编码后跑出来的两个log信息对比某一列的平均值或者对比折线图的高低来判定哪种编码最接近源。

x264可以加入命令来在编码的同时进行ssim计算

请确保两个输入文件有相同的帧数和色彩格式

ProRes

qsv 4Mbps

x264 slower 4Mbps

Adobe 硬件加速 4Mbps

2.使用AviSynth插件SSIM

官方说明:http://avisynth.nl/index.php/SSIM

先将AviSynth+安装到系统滤镜

将插件下载并放在相应位置(安装目录下的plugins或plugins64文件夹),当然需要读取文件的插件,如FFmpegSource或LSMASH。

建议使用AvsPmod进行脚本编写及预览

avs脚本:

SSIM(clip1, clip2, "results.csv&#​34;, "globalSSIM.txt&#​34;, lumimask=1, scaled=1)

clip1和clip2为读取后的视频文件,后面两个引号里分别写输出的逐帧对比的csv和总的数值的txt的路径。

例如:

(这种写法可能是不输出globalSSIM.txt的)

最后保存avs文件,用编码器完整编码(我用的ffmpeg,命令:ffmpeg -i "C:\Users\19816\Documents\Video Encoding\SSIM.avs" -f null -)

图中写法生成的文件为"E:\SSIM_test\prores.csv&#​34;

同样用Excel之类进行数据处理

可能只支持YV12色彩格式

ProRes

qsv 4Mbps

x264 slower 4Mbps

Adobe 硬件加速 4Mbps

cut-off

用例为迪士尼片头,米老鼠+城堡,两处最高的SSIM值为1的地方为黑场,最低的地方为放烟花处

两种方法之间不可比,不能用ffmpeg的SSIM滤镜跑出来的数据与Avs跑出来的数据进行对比

这种视频编码评价方法很片面,因为人眼感知的高质量画面与SSIM并不完全一样,如果编码中有主观调整,SSIM基本就没有价值了,如加入一定的锐化,可能观感更好了,但是SSIM更差了。可以用来比一比如NVENC与QSV那个好,不同编码软件哪个好之类。

所有相关脚本和命令可以在这里找到:https://github.com/Lijingze2019/Video-Encoding