FFmpeg如何实现类似Photoshop/Affinity Photo差值叠加滤镜效果
FFmpeg实现差值叠加效果的方法
完全可以,FFmpeg原生滤镜就能实现和Photoshop、Affinity Photo完全一致的差值叠加效果,不需要额外安装插件。
实现原理
Photoshop/Affinity Photo里的差值叠加核心逻辑是对上下两个图层的对应像素做绝对值差运算,公式为输出像素值 = abs(上层像素值 - 下层像素值),和FFmpeg blend滤镜内置的difference混合模式逻辑完全匹配。
常用场景命令
- 两段同规格视频逐帧做差值(常用于视频压缩差异对比、帧内容变动检测)
执行命令前请确认两段视频分辨率、帧率、时长完全匹配,命令如下:ffmpeg -i 基础层视频.mp4 -i 叠加层视频.mp4 -filter_complex "[0:v][1:v]blend=all_mode=difference[out]" -map "[out]" 差值输出结果.mp4 - 差值结果提亮(模拟压缩差异图的可视化效果)
如果要观察非常细微的像素差异,可以在差值运算后叠加亮度、灰度调整,把微弱差异放大:
其中ffmpeg -i 原始无损视频.mp4 -i 压缩后视频.mp4 -filter_complex "[0:v][1:v]blend=all_mode=difference,eq=brightness=0.35:saturation=0[out]" -map "[out]" 压缩差异可视化视频.mp4brightness参数可根据需求在0~1区间调整,数值越大画面越亮;saturation=0是将差值结果转为灰度,更符合差异查看的使用习惯。 - 固定参考图和整段视频做差值(常用于固定水印检测、静态背景变动排查)
直接将第二个输入替换为静态参考图即可:ffmpeg -i 待检测视频.mp4 -i 静态参考底图.png -filter_complex "[0:v][1:v]blend=all_mode=difference[out]" -map "[out]" 差值结果.mp4
注意事项
两个输入源的分辨率必须完全一致才能正常运算,如果分辨率不匹配,可以先对其中一个输入做缩放对齐,例:将叠加层缩放到和基础层相同分辨率再做混合,滤镜串修改为:[1:v]scale=width='[0:v]w':height='[0:v]h'[1scaled];[0:v][1scaled]blend=all_mode=difference[out]
内容的提问来源于stack exchange,提问作者Owen Quinlan
相关产品推荐
相关产品推荐

