Video Non-Local Bayes denoising plugin for VapourSynth
Project description
VapourSynth-VNLB
Video Non-Local Bayes denoising filter for VapourSynth.
Description
vnlb.Basicbuilds the basic estimate contribution stack.vnlb.Finalbuilds the final estimate contribution stack using a reference clip, usually the aggregated basic estimate.vnlb.Aggregateturns contribution stacks into normal video frames.
Supported input formats:
GraySYUV444PS
Installation
pip install -U vapoursynth-vnlb
Usage
VNLB Functions
basic estimate of VNLB denoising filter
This basic estimate produces a decent estimate of the noise-free image, as a reference for the final estimate.
vnlb.Basic(clip clip, float sigma[, int block_size=8, int block_step=8, int group_size=8, float cap_factor=4.0, float model_cap_factor=1.0, int bm_range=9, int patch_time=1, int radius=1, int search_bwd=1, int search_fwd=1, int rank=8, float beta=1.0, float tau=0.0, float variance_threshold=1.1, float sigma_basic=0.0, float gamma=0.95, int flat_areas=0, int chroma=0, clip mvfw=None, clip mvbw=None])
-
clip: The input clip, the clip to be filtered. It must be constant-format
GraySorYUV444PS. Integer sources should be converted before calling VNLB. -
sigma: The strength of denoising in 8-bit sample units (e.g.,
5.1means about 5.1 luma levels on an 8-bit scale). The plugin divides it by255internally for float clips. Technically, this is the standard deviation of i.i.d. zero mean additive white Gaussian noise in 8 bit scale. -
block_size: The size of a spatial block is block_size x block_size, representing a local patch. A value of
8uses8x8patches. Generally, larger blocks capture broader structure but cost more and can blur small details if the rank is too low. -
block_step: Sliding step to process every next reference block (anchor block spacing). Lower values process more anchor positions and reduce sparse-anchor artifacts; higher values are faster. The default is
8. -
group_size: Maximum number of similar blocks in each group before threshold expansion. More patches improve averaging stability but increase cost and may smooth texture when the search admits weak matches.
-
cap_factor: Soft cap for threshold-expanded groups. VNLB can keep additional patches after the best
group_sizematches whentauis active; this limits the expanded group to at mostceil(group_size * cap_factor)patches. Use0.0to disable this soft cap and keep all candidates admitted by the search threshold. Non-zero values must be at least1.0. -
model_cap_factor: Soft cap for the patches used to estimate the Bayesian model mean and covariance. The model uses at most
ceil(group_size * model_cap_factor)retained patches. The default1.0keeps model construction fast while still allowing extra threshold-expanded patches to be filtered and aggregated. Use0.0to build the model from all retained patches. Non-zero values must be at least1.0. -
bm_range: Length of the side of the search neighborhood for block-matching around the guided center. The size of the search window is
(bm_range * 2 + 1) x (bm_range * 2 + 1).3means candidates are searched inside a7x7window. Larger is slower, with more chances to find similar patches. -
patch_time: Number of consecutive frames in each temporal patch. A value of
2estimates patches spanning the anchor frame and the next frame. -
radius: The temporal radius for denoising. Symmetric temporal search radius. It sets both
search_bwdandsearch_fwd. Explicitsearch_bwdorsearch_fwdvalues override the shorthand for their respective directions. -
search_bwd, search_fwd: Number of previous and next patch origins to search. With
patch_time=2andradius=1, each anchor can use patch origins from one frame before through one frame after, while still reading the extra frame needed by the temporal patch. -
rank: Retained Bayesian model rank. Lower ranks remove more high-frequency variation; higher ranks preserve more detail and noise. For
YUV444PSwithchroma=1, the estimator dimension is3 * block_size * block_size * patch_time, so useful ranks can be higher than Gray-only settings. -
tau: Distance expansion threshold in 8-bit squared-distance units. VNLB first selects the best
group_sizepatches, then keeps any additional candidates whose distance is at or belowmax(kth_distance, tau). Settau=0.0to keep only the nearestgroup_sizepatches. -
beta: Multiplier applied to the noise variance used in Bayesian shrinkage. Higher values increase denoising strength.
-
variance_threshold: Dimensionless cutoff applied to the internal normalized noise variance. Components below
variance_threshold * beta * sigma^2are discarded. Higher values usually smooth more. -
sigma_basic: Final-stage reference noise level in 8-bit sample units. Models residual noise in
ref. Use0.0when treating the Basic/reference clip as clean; increasing it makes Final discount noisy reference variance and can smooth more. -
gamma: Flat-area detector multiplier. It is used only when
flat_areas=1; a group is treated as flat when its variance is belowgamma * sigma^2. -
flat_areas: Enables the flat-area path. Can improve very flat regions, but may smooth low-contrast texture. Basic defaults to
0; Final defaults to1. -
chroma: For
YUV444PS,chroma=1estimates one coupled multi-channel model across Y, U, and V. Withchroma=0, planes are processed independently. Gray clips ignore this setting. -
mvfw, mvbw: Optional MVTools vector clips. They guide temporal search centers but do not replace exhaustive patch search inside
bm_range.mvfwmust come fromisb=False, andmvbwfromisb=True, both withdelta=1and dimensions matchingclip.
final estimate of VNLB denoising filter
It takes the basic estimate as a reference. This final estimate can be realized as a refinement. It can significantly improve the denoising quality, keeping more details and fine structures that were removed in basic estimate.
vnlb.Final(clip clip, clip ref, float sigma[, ...])
-
clip: The input clip, the clip to be filtered.
-
ref: The reference clip, this clip is used in block-matching and as the reference in filtering. It must match
clipformat, dimensions, and frame count. In the usual two-stage chain this is the aggregated Basic estimate. -
Other parameters: Same as those in vnlb.Basic. Final uses different defaults for a few controls:
tau=400.0,variance_threshold=1.7,flat_areas=1.
aggregation of VNLB denoising filter
vnlb.Aggregate(clip clip, clip src[, int patch_time=1, int radius=1, int search_bwd=1, int search_fwd=1])
-
clip: Contribution stack returned by
BasicorFinal. Stack height issrc.height * 2 * (search_bwd + search_fwd + patch_time). -
src: Original input clip used for dimensions and fallback pixels where no VNLB contribution is available.
-
patch_time, radius, search_bwd, search_fwd: Must receive the same temporal settings used to create its contribution stack in
vnlb.Basicorvnlb.Final.
Examples
Basic Example
import vapoursynth as vs
core = vs.core
core.std.LoadPlugin(path="build/release/libvnlb.dylib")
src = core.resize.Bicubic(src, format=vs.GRAYS)
params = dict(
sigma=5.1,
block_size=8,
block_step=8,
patch_time=1,
bm_range=9,
radius=1,
group_size=8,
rank=8,
)
basic_stack = core.vnlb.Basic(src, **params)
basic = core.vnlb.Aggregate(
basic_stack,
src=src,
patch_time=params["patch_time"],
radius=params["radius"],
)
final_stack = core.vnlb.Final(src, ref=basic, **params)
final = core.vnlb.Aggregate(
final_stack,
src=src,
patch_time=params["patch_time"],
radius=params["radius"],
)
final.set_output()
For YUV444PS, set chroma=1 to estimate a coupled multi-channel model. Without it, planes are processed independently.
MVTools Motion Guidance Example
VNLB can run without motion vectors. In that mode each temporal search window is centered at the same (x, y) location. When mvfw and mvbw are passed, the vectors are used as block-motion guidance for block-matching centers.
src = core.resize.Bicubic(src, format=vs.GRAYS)
# MVTools does not operate on float clips.
mvsrc = core.resize.Bicubic(src, format=vs.GRAY8)
sup = core.mv.Super(mvsrc, pel=2, hpad=16, vpad=16)
mvfw = core.mv.Analyse(sup, isb=False, delta=1, blksize=8, overlap=4)
mvbw = core.mv.Analyse(sup, isb=True, delta=1, blksize=8, overlap=4)
params = dict(
sigma=5.1,
block_size=8,
block_step=8,
patch_time=1,
bm_range=9,
radius=1,
group_size=8,
rank=8,
mvfw=mvfw,
mvbw=mvbw,
)
basic_stack = core.vnlb.Basic(src, **params)
basic = core.vnlb.Aggregate(
basic_stack,
src=src,
patch_time=params["patch_time"],
radius=params["radius"],
)
final_stack = core.vnlb.Final(src, ref=basic, **params)
final = core.vnlb.Aggregate(
final_stack,
src=src,
patch_time=params["patch_time"],
radius=params["radius"],
)
Scene Cuts Example
Invalid MVTools vector frames fall back to zero motion automatically. For scene cuts, VNLB checks scene-change props on the clip passed to vnlb.Basic / vnlb.Final: _SceneChangePrev, _SceneChangeNext, Scenechange.
Use mv.SCDetection() on the integer motion source, then copy the props to the float clip used by VNLB:
src = core.resize.Bicubic(src, format=vs.GRAYS)
mvsrc = core.resize.Bicubic(src, format=vs.GRAY8)
sup = core.mv.Super(mvsrc, pel=2, hpad=16, vpad=16)
mvfw = core.mv.Analyse(sup, isb=False, delta=1, blksize=8, overlap=4)
mvbw = core.mv.Analyse(sup, isb=True, delta=1, blksize=8, overlap=4)
mvsrc_sc = core.mv.SCDetection(mvsrc, mvfw)
mvsrc_sc = core.mv.SCDetection(mvsrc_sc, mvbw)
src = core.std.CopyFrameProps(
src,
prop_src=mvsrc_sc,
props=["_SceneChangePrev", "_SceneChangeNext", "Scenechange"], # MVTools does not produce `Scenechange`, but other ones might (vapoursynth-wwxd).
)
basic_stack = core.vnlb.Basic(
src,
sigma=5.1,
patch_time=2,
radius=1,
mvfw=mvfw,
mvbw=mvbw,
)
If _SceneChangePrev or Scenechange is set, mvfw for that frame is ignored. If _SceneChangeNext is set, mvbw for that frame is ignored.
Build
Configure and build the release plugin:
cmake --preset release
cmake --build --preset release
Tests
Run the native and VapourSynth integration tests:
cmake --preset dev
cmake --build --preset dev
ctest --preset dev --output-on-failure
python3 tests/vs/integration_bestsource.py \
build/release/libvnlb.dylib \
. \
build/release/bestsource-cache
Notes
- The implementation does not copy the original VNLB reference source, so output is not bit-exact.
- MVTools support is nearest-block sampling of the finest vector level.
License
AGPL-3.0-or-later
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file vapoursynth_vnlb-0.1.0.tar.gz.
File metadata
- Download URL: vapoursynth_vnlb-0.1.0.tar.gz
- Upload date:
- Size: 42.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4458152104c368a54c2c9863bcb3e03e41c19b9ecd0f3b5a7b28c61f49030b68
|
|
| MD5 |
1ed928213d51121b2b6a6905709eaa4c
|
|
| BLAKE2b-256 |
49cdbb8086b20b1572a568e88c261e9c52dc72cd2cc94375f958f61d9cd1f7a1
|
Provenance
The following attestation bundles were made for vapoursynth_vnlb-0.1.0.tar.gz:
Publisher:
release.yml on yuygfgg/Vapoursynth-VNLB
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
vapoursynth_vnlb-0.1.0.tar.gz -
Subject digest:
4458152104c368a54c2c9863bcb3e03e41c19b9ecd0f3b5a7b28c61f49030b68 - Sigstore transparency entry: 1756612665
- Sigstore integration time:
-
Permalink:
yuygfgg/Vapoursynth-VNLB@5d030738c3fa86eb6b54fc199ccafd71c680a429 -
Branch / Tag:
refs/tags/R0.1 - Owner: https://github.com/yuygfgg
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@5d030738c3fa86eb6b54fc199ccafd71c680a429 -
Trigger Event:
push
-
Statement type:
File details
Details for the file vapoursynth_vnlb-0.1.0-py3-none-win_amd64.whl.
File metadata
- Download URL: vapoursynth_vnlb-0.1.0-py3-none-win_amd64.whl
- Upload date:
- Size: 114.1 kB
- Tags: Python 3, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9243ee00a509a661376efbf707d1c405d71816ed13128c8a8d3f83f9732fcad4
|
|
| MD5 |
4b5bf8d9710e33389a48c53be5a46d3d
|
|
| BLAKE2b-256 |
fdf6cdbf60f5f5d66d8964f887912922b8e9282427113f9e131e7af282b5e296
|
Provenance
The following attestation bundles were made for vapoursynth_vnlb-0.1.0-py3-none-win_amd64.whl:
Publisher:
release.yml on yuygfgg/Vapoursynth-VNLB
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
vapoursynth_vnlb-0.1.0-py3-none-win_amd64.whl -
Subject digest:
9243ee00a509a661376efbf707d1c405d71816ed13128c8a8d3f83f9732fcad4 - Sigstore transparency entry: 1756612941
- Sigstore integration time:
-
Permalink:
yuygfgg/Vapoursynth-VNLB@5d030738c3fa86eb6b54fc199ccafd71c680a429 -
Branch / Tag:
refs/tags/R0.1 - Owner: https://github.com/yuygfgg
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@5d030738c3fa86eb6b54fc199ccafd71c680a429 -
Trigger Event:
push
-
Statement type:
File details
Details for the file vapoursynth_vnlb-0.1.0-py3-none-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: vapoursynth_vnlb-0.1.0-py3-none-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 1.1 MB
- Tags: Python 3, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eea9741ed628729752392d162bdfb6bbe967651d49d0511087e2f9cba5b86652
|
|
| MD5 |
e5593ae1b0b6086e5bf564bfb10d8db0
|
|
| BLAKE2b-256 |
78f740dbccbf689cd238b15477ba17415db3f8ceaa9ea19144f7fc31dd8ac8f8
|
Provenance
The following attestation bundles were made for vapoursynth_vnlb-0.1.0-py3-none-musllinux_1_2_x86_64.whl:
Publisher:
release.yml on yuygfgg/Vapoursynth-VNLB
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
vapoursynth_vnlb-0.1.0-py3-none-musllinux_1_2_x86_64.whl -
Subject digest:
eea9741ed628729752392d162bdfb6bbe967651d49d0511087e2f9cba5b86652 - Sigstore transparency entry: 1756612695
- Sigstore integration time:
-
Permalink:
yuygfgg/Vapoursynth-VNLB@5d030738c3fa86eb6b54fc199ccafd71c680a429 -
Branch / Tag:
refs/tags/R0.1 - Owner: https://github.com/yuygfgg
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@5d030738c3fa86eb6b54fc199ccafd71c680a429 -
Trigger Event:
push
-
Statement type:
File details
Details for the file vapoursynth_vnlb-0.1.0-py3-none-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: vapoursynth_vnlb-0.1.0-py3-none-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 106.1 kB
- Tags: Python 3, manylinux: glibc 2.24+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3c6a4672536b2521d8e80454657f66f076346df38862577201cfce5022a29afd
|
|
| MD5 |
f4b2fa5a5499351b15649bc809e917cf
|
|
| BLAKE2b-256 |
c3d2279ab94a292fe58349b7a8c075da7a1692c3a2b981b69f3439dec2bb9ce5
|
Provenance
The following attestation bundles were made for vapoursynth_vnlb-0.1.0-py3-none-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl:
Publisher:
release.yml on yuygfgg/Vapoursynth-VNLB
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
vapoursynth_vnlb-0.1.0-py3-none-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl -
Subject digest:
3c6a4672536b2521d8e80454657f66f076346df38862577201cfce5022a29afd - Sigstore transparency entry: 1756612746
- Sigstore integration time:
-
Permalink:
yuygfgg/Vapoursynth-VNLB@5d030738c3fa86eb6b54fc199ccafd71c680a429 -
Branch / Tag:
refs/tags/R0.1 - Owner: https://github.com/yuygfgg
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@5d030738c3fa86eb6b54fc199ccafd71c680a429 -
Trigger Event:
push
-
Statement type:
File details
Details for the file vapoursynth_vnlb-0.1.0-py3-none-macosx_12_0_x86_64.whl.
File metadata
- Download URL: vapoursynth_vnlb-0.1.0-py3-none-macosx_12_0_x86_64.whl
- Upload date:
- Size: 102.8 kB
- Tags: Python 3, macOS 12.0+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c091c68ccce534eada3c9e183d12a6553b314797392988c2aa21dc66b4304602
|
|
| MD5 |
8dd22a79bbc18cbfcf2b46a875d47149
|
|
| BLAKE2b-256 |
4d2cfc2e3a03d4b6f434d44564a05a4567add2bd32b9c05c46c2388ca65d43da
|
Provenance
The following attestation bundles were made for vapoursynth_vnlb-0.1.0-py3-none-macosx_12_0_x86_64.whl:
Publisher:
release.yml on yuygfgg/Vapoursynth-VNLB
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
vapoursynth_vnlb-0.1.0-py3-none-macosx_12_0_x86_64.whl -
Subject digest:
c091c68ccce534eada3c9e183d12a6553b314797392988c2aa21dc66b4304602 - Sigstore transparency entry: 1756612803
- Sigstore integration time:
-
Permalink:
yuygfgg/Vapoursynth-VNLB@5d030738c3fa86eb6b54fc199ccafd71c680a429 -
Branch / Tag:
refs/tags/R0.1 - Owner: https://github.com/yuygfgg
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@5d030738c3fa86eb6b54fc199ccafd71c680a429 -
Trigger Event:
push
-
Statement type:
File details
Details for the file vapoursynth_vnlb-0.1.0-py3-none-macosx_12_0_arm64.whl.
File metadata
- Download URL: vapoursynth_vnlb-0.1.0-py3-none-macosx_12_0_arm64.whl
- Upload date:
- Size: 93.6 kB
- Tags: Python 3, macOS 12.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4ac4f23ce9df9f168d00a0fd8bf20270f03507195319a48e931672741d4205a1
|
|
| MD5 |
733c0ecc8eb79e64c64741235c1c3cdc
|
|
| BLAKE2b-256 |
e4325453f92a3842f60e7f9365001cd0fa33057582492d0ac5369351115829de
|
Provenance
The following attestation bundles were made for vapoursynth_vnlb-0.1.0-py3-none-macosx_12_0_arm64.whl:
Publisher:
release.yml on yuygfgg/Vapoursynth-VNLB
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
vapoursynth_vnlb-0.1.0-py3-none-macosx_12_0_arm64.whl -
Subject digest:
4ac4f23ce9df9f168d00a0fd8bf20270f03507195319a48e931672741d4205a1 - Sigstore transparency entry: 1756612856
- Sigstore integration time:
-
Permalink:
yuygfgg/Vapoursynth-VNLB@5d030738c3fa86eb6b54fc199ccafd71c680a429 -
Branch / Tag:
refs/tags/R0.1 - Owner: https://github.com/yuygfgg
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@5d030738c3fa86eb6b54fc199ccafd71c680a429 -
Trigger Event:
push
-
Statement type: