FFmpeg BM3D Filter: Block Size, Step, and Search Range
The FFmpeg bm3d (Block-Matching and 3D filtering) filter
is a highly effective denoising tool that reduces image and video noise
while preserving edge details. To optimize this filter for your specific
video source, you need to understand and adjust its three critical
parameters: block size, step size, and search range. This guide explains
what these parameters do and provides practical command-line examples to
help you configure them for the best balance between processing speed
and visual quality.
Understanding the Core Parameters
The bm3d filter works by grouping similar blocks of
pixels in a 3D array and collaborative-filtering them. You can control
this process using the following settings:
- Block Size (
block): This parameter sets the width and height of the square pixel blocks used for matching.- Default:
8 - Usage: Larger block sizes (like
16) can reduce noise in flat areas more effectively but may blur fine details. Smaller block sizes (like4) preserve sharp details but are less effective at removing heavy, low-frequency noise.
- Default:
- Step Size (
step): This defines the step size (in pixels) between sliding blocks during the block-matching process.- Default:
4 - Usage: A smaller step size (like
1or2) creates more overlapping blocks, resulting in higher-quality denoising and fewer blocky artifacts, but it significantly increases processing time. A larger step size (like6or8) speeds up encoding at the cost of denoising quality.
- Default:
- Search Range (
range): This defines the radius of the search window (in pixels) around the current block where the filter will look for matching blocks.- Default:
9 - Usage: A larger search range (like
16) is useful for finding similar patterns across a wider area, which is ideal for high-resolution videos (like 4K). However, larger ranges exponentially increase CPU usage. Smaller ranges (like5) speed up the process but may miss matching blocks in high-motion or high-detail scenes.
- Default:
How to Configure the Parameters in FFmpeg
To apply the bm3d filter, you must specify the
parameters inside the -vf (video filter) flag. The basic
syntax for configuring the block size, step size, and search range
is:
ffmpeg -i input.mp4 -vf "bm3d=block=8:step=4:range=9" output.mp4Configuration Examples
Depending on your hardware capability and your priority (speed vs. quality), you can use one of the configurations below:
1. High-Quality Denoising (Slow Processing)
If you want the best possible visual output and do not mind long render times, decrease the step size and increase the search range:
ffmpeg -i input.mp4 -vf "bm3d=block=8:step=2:range=16" -c:v libx264 -crf 18 output.mp42. Fast Processing (Draft/Preview Mode)
If you need to quickly test the filter or have limited computing power, increase the step size and lower the search range:
ffmpeg -i input.mp4 -vf "bm3d=block=8:step=6:range=5" -c:v libx264 -crf 18 output.mp43. Handling Fine Details in High-Resolution Video
For 4K videos or content with fine textures where you want to avoid a “plastic” or overly smoothed look, reduce the block size:
ffmpeg -i input.mp4 -vf "bm3d=block=4:step=2:range=12" -c:v libx264 -crf 18 output.mp4Tips for Best Results
- Combine with
sigma: Thebm3dfilter also relies on thesigmaparameter (noise standard deviation). If your video is highly noisy, you must increasesigma(e.g.,sigma=10or higher) alongside your block and range adjustments to see a noticeable difference. - Test on short segments: Because
bm3dis computationally expensive, use the-ssand-tflags in FFmpeg to test your configurations on a 5-second clip before processing an entire video.