Skip to content
Sharpens by warping
Branch: master
Clone or download
Type Name Latest commit message Commit time
Failed to load latest commit information.
src Stop using -Wno-unused-parameter Jun 14, 2018
.gitignore Add .gitignore Oct 4, 2015 Stop using -Wno-unused-parameter Jun 14, 2018 Add build system Oct 4, 2015 Fix corruption in the right half with 16 bit input Aug 28, 2016 Add alternative build system Jun 14, 2018
readme.rst Add alternative build system Jun 14, 2018



AWarpSharp2 sharpens edges by warping them. This is a rewrite of the Avisynth filter (re)written by SEt.


warp.AWarpSharp2(clip clip[, int thresh=128, int blur=2, int type=0, int[] depth=[16, 8, 8], int chroma=0, int[] planes=<all>, bint opt=True, string cplace="mpeg1"])

warp.ASobel(clip clip[, int thresh=128, int[] planes=<all>, bint opt=True])

warp.ABlur(clip clip[, int blur=3, int type=1, int[] planes=<all>, bint opt=True])

warp.AWarp(clip clip, clip mask[, int[] depth=[3, 1, 1], int chroma=0, int[] planes=<all>, bint opt=True, string cplace="mpeg1"])

AWarpSharp2 performs edge detection, blurring, and warping, all in one.

ASobel performs edge detection, with an algorithm that might resemble the one used by std.Sobel.

ABlur blurs.

AWarp warps.


Clip to process. Must have constant format and dimensions, 8..16 bit integer pixels, and it must not be RGB.

For the AWarp filter, clip must be either the same size as mask, or four times the size of mask in each dimension. The latter can be useful if better subpixel interpolation is desired, e.g. using nnedi3_rpow2.

If clip is upscaled to four times the original size, it must be top-left aligned. See the examples below.

Edge mask. Must have the same format as clip.

No pixel in the edge mask will have a value greater than thresh. Decrease for weaker sharpening.

Range: 0..255. It will be scaled internally for bit depths greater than 8.

Default: 128.


Controls the number of times to blur the edge mask. Increase for weaker sharpening.

Range: 0..+infinity.

Default: 2 for type 0, 3 for type 1.


Controls the type of blur to use. 0 means some kind of 13x13 average. 1 means some kind of 5x5 average. 1 is better, but requires more passes for similar sharpening strength as 0.

Default: 0.


Controls how far to warp. Negative values warp in the other direction, i.e. will blur the image instead of sharpening.

Range: -128..127

Default for depth[0]: 16 for AWarpSharp2, 3 for AWarp. Default for depth[1]: depth[0] // 2. Default for depth[2]: depth[1].


Controls the chroma handling method. 0 will use the edge mask from the luma to warp the chroma. 1 will create an edge mask from each chroma channel and use those to warp each chroma channel individually.

Default: 0.


Controls which planes are processed. Planes that are not processed are simply copied from the source frame, except in the AWarp filter, when clip is four times the size of mask, in which case the unprocessed planes will contain uninitialised memory.

Default: all.


If True, the best functions supported by your CPU will be used. If False, plain C++ functions will be used.

Default: True.


Chroma placement. Must be either "mpeg1" or "mpeg2".

Only relevant when chroma is 0 and the input is 4:2:0 or 4:2:2.

Default: "mpeg1".


import vapoursynth as vs

c = vs.get_core()

src = c.d2v.Source("d2v.d2v")

mask = c.warp.ASobel(src)
mask = c.warp.ABlur(mask)

# Use sx=0.375 sy=0.375 for top-left alignment.
src4 = c.fmtc.resample(src, w=src.width * 4, h=src.height * 4, sx=0.375, sy=0.375)
src4 = c.fmtc.bitdepth(src4, bits=8)

warp = c.warp.AWarp(src4, mask)


mkdir build && cd build
meson ../



Meson runs faster than and configure.



You can’t perform that action at this time.