GeneralConvolution
From Avisynth wiki
(Difference between revisions)
Raffriff42 (Talk | contribs) m (added category) |
Raffriff42 (Talk | contribs) (formatting, links, phrasing) |
||
Line 1: | Line 1: | ||
− | + | Performs a matrix convolution on an [[RGB32]] clip. | |
− | + | == Syntax and Parameters == | |
+ | {{Template:FuncDef | ||
+ | |GeneralConvolution (clip ''clip'', [ int ''bias'', string ''matrix'', float ''divisor'', bool ''auto'' ] ) | ||
+ | }} | ||
− | + | :{{Par2|clip|clip|}} | |
− | {| | + | ::Source clip. Must be [[RGB32]]. |
− | | | + | |
− | + | :{{Par2|bias|int|0}} | |
− | + | ::Additive bias to adjust the total output intensity. | |
− | + | ||
− | | | + | :{{Par2|matrix|string|"0 0 0 0 1 0 0 0 0"}} |
− | + | ::A 3×3 or 5×5 matrix with 3<sup>2</sup> (9) or 5<sup>2</sup> (25) integer values. | |
− | + | ||
− | | | + | :{{Par2|divisor|float|1.0}} |
− | + | ::Divides the output of the convolution before adding {{FuncArg|bias}}. | |
− | + | ||
− | | | + | :{{Par2|auto|bool|true}} |
− | + | ::Enables ''auto scaling''. Auto scaling divides the output of the convolution by the sum of the elements of the matrix. The value of {{FuncArg|divisor}} is applied in addition to this auto scaling factor. If the sum of elements is zero, auto scaling is disabled. | |
− | + | ||
− | | | + | |
− | + | ||
− | + | ||
− | The | + | The {{FuncArg|divisor}} is usually the sum of the elements of the matrix. But when the sum is zero, you can leave {{FuncArg|divisor}}=1 and use the {{FuncArg|bias}} setting to correct the pixel values. The {{FuncArg|bias}} could be useful if the pixel values are negative due to the convolution. After adding {{FuncArg|bias}}, the pixels are clipped to the range 0-255. |
Around the borders the edge pixels are simply repeated to service the matrix. | Around the borders the edge pixels are simply repeated to service the matrix. | ||
Line 28: | Line 27: | ||
== Examples == | == Examples == | ||
− | + | * Blur: | |
− | + | <div {{BoxWidthIndent|28|2}} > | |
GeneralConvolution(0, " | GeneralConvolution(0, " | ||
10 10 10 10 10 | 10 10 10 10 10 | ||
Line 36: | Line 35: | ||
10 10 10 10 10 | 10 10 10 10 10 | ||
10 10 10 10 10 ", 256, false) | 10 10 10 10 10 ", 256, false) | ||
− | + | </div> | |
− | + | {{HalfBreak}} | |
+ | * Horizontal (Sobel) edge detection: | ||
+ | <div {{BoxWidthIndent|28|2}} > | ||
GeneralConvolution(0, " | GeneralConvolution(0, " | ||
1 2 1 | 1 2 1 | ||
0 0 0 | 0 0 0 | ||
-1 -2 -1 ", 8) | -1 -2 -1 ", 8) | ||
− | + | </div> | |
− | + | {{HalfBreak}} | |
+ | * Vertical (Sobel) Edge Detection: | ||
+ | <div {{BoxWidthIndent|28|2}} > | ||
GeneralConvolution(0, " | GeneralConvolution(0, " | ||
1 0 -1 | 1 0 -1 | ||
2 0 -2 | 2 0 -2 | ||
1 0 -1 ", 8) | 1 0 -1 ", 8) | ||
− | + | </div> | |
− | + | {{HalfBreak}} | |
+ | * Displacement (simply move the position of the "1" for left, right, up, down) | ||
+ | <div {{BoxWidthIndent|28|2}} > | ||
GeneralConvolution(0, " | GeneralConvolution(0, " | ||
0 1 0 | 0 1 0 | ||
0 0 0 | 0 0 0 | ||
0 0 0 ") | 0 0 0 ") | ||
− | + | </div> | |
− | + | {{HalfBreak}} | |
+ | * Displacement by half pixel up (auto scaling): | ||
+ | <div {{BoxWidthIndent|28|2}} > | ||
GeneralConvolution(0, " | GeneralConvolution(0, " | ||
0 1 0 | 0 1 0 | ||
0 1 0 | 0 1 0 | ||
0 0 0 ") | 0 0 0 ") | ||
− | + | </div> | |
− | + | {{HalfBreak}} | |
+ | * Displacement by half pixel to the right (manual scaling): | ||
+ | <div {{BoxWidthIndent|28|2}} > | ||
GeneralConvolution(0, " | GeneralConvolution(0, " | ||
0 0 0 | 0 0 0 | ||
0 128 128 | 0 128 128 | ||
0 0 0 ", 256, false) | 0 0 0 ", 256, false) | ||
− | + | </div> | |
− | + | {{HalfBreak}} | |
+ | * Sharpness filter: | ||
+ | <div {{BoxWidthIndent|28|2}} > | ||
GeneralConvolution(0, " | GeneralConvolution(0, " | ||
0 -1 0 | 0 -1 0 | ||
-1 5 -1 | -1 5 -1 | ||
0 -1 0 ", 0, true) | 0 -1 0 ", 0, true) | ||
− | + | </div> | |
− | + | :In this case, the new pixel values <span style="font-family:times,georgia,serif;">y(m,n)</span> are given by | |
− | + | :<span style="font-family:times,georgia,serif;">y(m,n) = ( -1*x(m-1,n) - 1*x(m,n-1) + 5*x(m,n) - 1*x(m,n+1) - 1*x(m+1,n) )/1.0 + 0</span> | |
− | + | {{HalfBreak}} | |
− | + | * Slight blur filter with black level clipping and 25% brightening: | |
+ | <div {{BoxWidthIndent|28|2}} > | ||
GeneralConvolution(-16, " | GeneralConvolution(-16, " | ||
0 12 0 | 0 12 0 | ||
12 256 12 | 12 256 12 | ||
0 12 0 ", 0.75 ,true) | 0 12 0 ", 0.75 ,true) | ||
− | + | </div> | |
− | + | :In this case, the new pixel values <span style="font-family:times,georgia,serif;">y(m,n)</span> are given by | |
− | + | :<span style="font-family:times,georgia,serif;">y(m,n) = ( 12*x(m-1,n) + 12*x(m,n-1) + 256*x(m,n) + 12*x(m,n+1) + 12*x(m+1,n) )/(12+12+256+12+12)/0.75 - 16</span> | |
− | + | {{HalfBreak}} | |
− | + | * Emboss filter (3D relief effect) | |
+ | <div {{BoxWidthIndent|28|2}} > | ||
GeneralConvolution(128, " | GeneralConvolution(128, " | ||
-1 0 0 | -1 0 0 | ||
0 0 0 | 0 0 0 | ||
0 0 1") | 0 0 1") | ||
+ | </div> | ||
− | Some other examples can be found [http://web.archive.org/web/20100105183639/http://www.gamedev.net/reference/programming/features/imageproc/page2.asp here]. | + | == External Links == |
− | + | * [http://web.archive.org/web/20120802031716/http://jeanbruenn.info/2011/03/13/avisynths-convolution-stuff-explained/ ''AviSynth’s GeneralConvolution explained''] | |
+ | * Some other examples can be found [http://web.archive.org/web/20100105183639/http://www.gamedev.net/reference/programming/features/imageproc/page2.asp here]. | ||
− | + | == Changelog == | |
{| border="1" | {| border="1" | ||
|- | |- | ||
Line 103: | Line 118: | ||
| Initial Release | | Initial Release | ||
|} | |} | ||
− | + | ||
− | + | ||
− | + | ||
[[Category:Internal filters]] | [[Category:Internal filters]] | ||
[[Category:Blurring]] | [[Category:Blurring]] | ||
[[Category:Sharpeners]] | [[Category:Sharpeners]] |
Revision as of 14:13, 14 February 2016
Performs a matrix convolution on an RGB32 clip.
Contents |
Syntax and Parameters
GeneralConvolution (clip clip, [ int bias, string matrix, float divisor, bool auto ] )
- clip clip =
- Source clip. Must be RGB32.
- int bias = 0
- Additive bias to adjust the total output intensity.
- string matrix = "0 0 0 0 1 0 0 0 0"
- A 3×3 or 5×5 matrix with 32 (9) or 52 (25) integer values.
- float divisor = 1.0
- Divides the output of the convolution before adding bias.
- bool auto = true
- Enables auto scaling. Auto scaling divides the output of the convolution by the sum of the elements of the matrix. The value of divisor is applied in addition to this auto scaling factor. If the sum of elements is zero, auto scaling is disabled.
The divisor is usually the sum of the elements of the matrix. But when the sum is zero, you can leave divisor=1 and use the bias setting to correct the pixel values. The bias could be useful if the pixel values are negative due to the convolution. After adding bias, the pixels are clipped to the range 0-255.
Around the borders the edge pixels are simply repeated to service the matrix.
Examples
- Blur:
GeneralConvolution(0, " 10 10 10 10 10 10 10 10 10 10 10 10 16 10 10 10 10 10 10 10 10 10 10 10 10 ", 256, false)
- Horizontal (Sobel) edge detection:
GeneralConvolution(0, " 1 2 1 0 0 0 -1 -2 -1 ", 8)
- Vertical (Sobel) Edge Detection:
GeneralConvolution(0, " 1 0 -1 2 0 -2 1 0 -1 ", 8)
- Displacement (simply move the position of the "1" for left, right, up, down)
GeneralConvolution(0, " 0 1 0 0 0 0 0 0 0 ")
- Displacement by half pixel up (auto scaling):
GeneralConvolution(0, " 0 1 0 0 1 0 0 0 0 ")
- Displacement by half pixel to the right (manual scaling):
GeneralConvolution(0, " 0 0 0 0 128 128 0 0 0 ", 256, false)
- Sharpness filter:
GeneralConvolution(0, " 0 -1 0 -1 5 -1 0 -1 0 ", 0, true)
- In this case, the new pixel values y(m,n) are given by
- y(m,n) = ( -1*x(m-1,n) - 1*x(m,n-1) + 5*x(m,n) - 1*x(m,n+1) - 1*x(m+1,n) )/1.0 + 0
- Slight blur filter with black level clipping and 25% brightening:
GeneralConvolution(-16, " 0 12 0 12 256 12 0 12 0 ", 0.75 ,true)
- In this case, the new pixel values y(m,n) are given by
- y(m,n) = ( 12*x(m-1,n) + 12*x(m,n-1) + 256*x(m,n) + 12*x(m,n+1) + 12*x(m+1,n) )/(12+12+256+12+12)/0.75 - 16
- Emboss filter (3D relief effect)
GeneralConvolution(128, " -1 0 0 0 0 0 0 0 1")
External Links
- AviSynth’s GeneralConvolution explained
- Some other examples can be found here.
Changelog
v2.55 | Added divisor, auto. |
v2 | Initial Release |