Highlight Video Differences with FFmpeg lut2
This article explains how to use the FFmpeg lut2
(Look-Up Table 2D) filter to visually compare and highlight the
differences between two similar video files. By evaluating the pixel
values of two video inputs simultaneously, you can easily identify
compression loss, editing variations, or rendering discrepancies. You
will learn the exact FFmpeg commands required to generate a difference
map and how to amplify subtle changes so they are clearly visible.
Understanding the lut2 Filter
The lut2 filter in FFmpeg allows you to merge two video
streams by applying a mathematical expression to every corresponding
pixel.
In the expression:
val(0)represents the pixel value from the first input video.val(1)represents the pixel value from the second input video.c0,c1, andc2represent the color channels (Y, U, and V for YUV videos, or R, G, and B for RGB videos).
By subtracting the pixel values of the second video from the first, you can isolate the differences.
Method 1: Absolute Difference (Black Background)
To highlight differences as bright pixels on a black background, use the absolute difference formula. Because subtle compression differences might be too dark to see with the naked eye, you can multiply the result to amplify the differences.
Run the following command in your terminal:
ffmpeg -i video1.mp4 -i video2.mp4 -filter_complex "[0:v][1:v]lut2=c0='abs(val(0)-val(1))*8':c1='abs(val(0)-val(1))*8':c2='abs(val(0)-val(1))*8'[diff]" -map "[diff]" difference_output.mp4How it works:
abs(val(0)-val(1))calculates the absolute difference between the two frames, ensuring negative values become positive.*8is the multiplier. This amplifies the differences by a factor of eight. If the output is still too dark, you can increase this multiplier (e.g.,*16or*32).- Identical pixels will result in
0(pure black), while any differences will appear as colored or grey pixels.
Method 2: Offset Difference (Grey Background)
If you want to see which video is brighter or darker at a specific pixel, you can use an offset comparison. This places identical pixels on a neutral grey background, with positive differences showing as lighter and negative differences showing as darker.
Run this command:
ffmpeg -i video1.mp4 -i video2.mp4 -filter_complex "[0:v][1:v]lut2=c0='(val(0)-val(1))*4+128':c1='(val(0)-val(1))*4+128':c2='(val(0)-val(1))*4+128'[diff]" -map "[diff]" offset_output.mp4How it works:
(val(0)-val(1))subtracts the second video's pixel value from the first.*4amplifies the difference.+128offsets the baseline to mid-grey. If there is no difference between the pixels, the output pixel will be exactly grey (128).
Prerequisites for Best Results
For the lut2 filter to work correctly, both input videos
must have:
- The exact same resolution: If they differ, resize
one input first using the
scalefilter. - The exact same framerate: Ensure both videos are synchronized frame-for-frame to prevent false positives caused by timing mismatches.