Skip to main content

VapourSynth wrappers for denoising, masking and edge fixing

Project description

vs-dirty

A collection of VapourSynth wrappers and utility functions focused on advanced denoising, masking, and edge fixing.

Follow the docstring for more information about the parameters.

Installation

You can install vsdirty via pip:

pip install vsdirty

Or build from source:

git clone https://github.com/r74mi/vs-dirty.git
cd vs-dirty
pip install .

Dependencies

This package relies on several external VapourSynth plugins. Ensure these are installed and available in your VapourSynth plugins folder.

Plugin URL
fmtc GitLab
akarin GitHub
cas GitHub
bore GitHub
mvtools GitHub
BM3DCuda GitHub
nlm-cuda GitHub
vsmlrt GitHub

adenoise

Designed specifically for film content, this intensive adaptive denoiser removes noise while carefully preserving fine textures and small elements. It combines mc_degrain (luma), NLMeans/CBM3D (chroma), and BM3D (luma), all modulated by adaptive masking.

Presets:

  • scan65mm (Light)
  • scan35mm (Medium)
  • scan16mm (Heavy)
  • scan8mm (Very Heavy)
  • digital (Optimized for digital sources)
  • default (Generic)

Parameters:

adenoise.default(
  clip: vs.VideoNode, 
  thsad: int = 500, 
  tr: int = 2, 
  sigma: float = 6, 
  luma_mask_weaken: float = 0.75, 
  luma_mask_thr: float = 0.196, 
  chroma_denoise: float | str | tuple[float, str] = [1.0, "nlm"], 
  precision: bool = True, 
  chroma_masking: bool = False, 
  luma_over_texture: float = 0.4, 
  kwargs_flatmask: dict = {},
  show_mask: int = 0
)
  • clip: Clip to process (YUV or GRAY).

  • thsad: Luma and chroma ref denoise strength. Recommended values: 300-800

  • tr: Temporal radius for temporal consistency. Recommended values: 2-3 (1 means no temporal denoise).

  • sigma: Sigma for BM3D (luma denoise strength). Recommended values: 2-10.

  • luma_mask_weaken: Controls how much dark spots should be denoised. Lower values mean stronger overall denoise. Recommended values: 0.6-0.9

  • luma_mask_thr: Threshold that determines what is considered bright and what is dark in the luma mask. Recommended values: 0.15-0.25

  • chroma_denoise: Denoiser strength and type for chroma. NLMeans/CBM3D/ArtCNN. Reccomended strength values: 0.5-2. Accepted denoiser types: "nlm", "cbm3d", "artcnn".

  • precision: If True, a flat mask is created to enhance the denoise strenght avoiding textured area.

  • chroma_masking: If True, enables specific chroma masking for U/V planes.

  • luma_over_texture: Lower value means more importance to textured areas, higher value means more importance to luma levels. Accepted values: 0.0-1.0

  • kwargs_flatmask: Additional arguments. dict values (check hd_flatmask's docstring for more info):

    • sigma1: This value should be decided based on the details level of the clip and how much grain and noise is present. Recommended values: 1-5
    • texture_strength: Texture strength for mask (0-inf). Values above 1 decrease the strength of the texture in the mask.
    • edges_strength: Edges strength for mask (0-1). Basic multiplier for edges strength.
  • show_mask: 1 = First luma mask, 2 = Textured luma mask, 3 = Complete luma mask, 4 = Show the Chroma U Plane mask (if chroma_masking = True), 5 = Show the Chroma V Plane mask (if chroma_masking = True).

  • return: 16bit denoised clip. If show_mask is set, returns a tuple (denoised_clip, mask).

Usage:

from vsdirty import adenoise

denoised = adenoise.scan16mm(clip)

bore

A powerful edge cleaner (dirty line fixer) that processes borders at their native resolution to avoid scaling artifacts.

Parameters:

def bore(
  clip : vs.VideoNode,
  ythickness: List[int] = None,
  uthickness: List[int] = None,
  vthickness: List[int] = None,
  planes: PlanesT = 0,
  singlePlane = True
)
  • clip: Input clip (YUV or GRAY).
  • ythickness: Luma border thicknesses to process. [top, bottom, left, right].
  • uthickness: Chroma U border thicknesses to process. [top, bottom, left, right].
  • vthickness: Chroma V border thicknesses to process. [top, bottom, left, right]. If None, uses ythickness or uthickness.
  • planes: Plane(s) to process.
  • singlePlane: If True uses bore.SinglePlane, otherwise bore.MultiPlane. MultiPlane works only on 444 clips.
  • return: Processed clip with corrected borders, same format as input.

Usage:

from vsdirty import bore

# Fix dirty lines: Top=1px, Bottom=1px, Left=2px, Right=2px
clean = bore(clip, ythickness=[1, 1, 2, 2])

msaa2x

An antialiaser based on ArtCNN that targets edges.

Parameters:

def msaa2x(
    clip: vs.VideoNode,
    ref: Optional[vs.VideoNode] = None,
    mask: bool = False,
    sigma: float = 2,
    thr: float = None,
    planes: PlanesT = 0,
    **kwargs
)
  • clip: Clip to process (YUV or GRAY).
  • ref: Reference clip used to create the edgemask (clean and denoised).
  • mask: If True will return the mask used.
  • sigma: Sigma used for edge fixing during antialiasing only if ref is None.
  • thr: Threshold used for Binarize the clip, only 0-1 value area allowed. If None, no Binarize will be applied.
  • planes: Which planes to process. Defaults to Y.
  • kwargs: Accepts advanced_edgemask arguments.

Usage:

from vsdirty import msaa2x

aa_clip = msaa2x(clip)

advanced_edgemask

Generates a high-quality edge mask by combining Retinex preprocessing with multiple edge detectors (Kirsch, Sobel) to capture faint and complex edges.

from vsdirty import admask

emask = admask.advanced_edgemask(clip, luma_scaling=10)

hd_flatmask

A specialized mask for flat areas, useful for protecting textures or targeting specific flat regions for filtering.

from vsdirty import admask

flat_mask = admask.hd_flatmask(clip)

diff_and_swap

A utility to repair damaged frames in a "base" clip using a "correction" clip. It compares frames and swaps them if the difference exceeds a threshold.

from vsdirty import adutils

# automated patching
repaired, _ = adutils.diff_and_swap(correction_clip, base_clip, thr=30000)

License

MIT License

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

vsdirty-0.2.1.tar.gz (20.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

vsdirty-0.2.1-py3-none-any.whl (21.1 kB view details)

Uploaded Python 3

File details

Details for the file vsdirty-0.2.1.tar.gz.

File metadata

  • Download URL: vsdirty-0.2.1.tar.gz
  • Upload date:
  • Size: 20.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for vsdirty-0.2.1.tar.gz
Algorithm Hash digest
SHA256 4d67a53fdb3ad3f1792c911cf76ea9e6056d63ab8bb75e77af4a254ea5484cac
MD5 a225165f6d483d126fac8b978f42a25f
BLAKE2b-256 15eb671ce4759e85becb3943f783aa777a5938e52c321cc25c3268cfa8945138

See more details on using hashes here.

File details

Details for the file vsdirty-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: vsdirty-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 21.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for vsdirty-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 adcde73cfadb3605c1bac0140ab20bea5bb39d7a610edf4f3648de3bfa3ef2c2
MD5 df5d3bd1f4786f2b0cbaa2edbe68f533
BLAKE2b-256 879e1269e5f99ad5b8451b9d8a29a2e958a376acba1a8b6c15985844aa8a7b74

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page