View difference between Paste ID: MmXGK6yf and brH8Ss03
SHOW: | | - or go back to the newest paste.
1
###############################
2-
# FastLineDarken 1.46x MT MOD #
2+
# FastLineDarken 1.47x MT MOD #
3
###############################
4
#
5
# Written by Vectrangle    (http://forum.doom9.org/showthread.php?t=82125)
6
# Didée: - Speed Boost, Updated: 11th May 2007
7
# Dogway - added protection option. 12-May-2011
8
# A.SONY - added high bit support and others. 31-Mar-2017
9
#
10
#  * requires mt_masktools v2 in avs2.5 and masktools 2.2.17 in avs 2.6 or avs+
11
#  * requires yuv input
12
#
13
#
14
#
15
# Parameters are:
16
#  strength (integer)  - Line darkening amount, 0-256. Default 48. Represents the _maximum_ amount
17
#                        that the luma will be reduced by, weaker lines will be reduced by
18
#                        proportionately less.
19
#  prot     (integer)  - Prevents the darkest lines from being darkened. Protection acts as a threshold.
20
#                        Values range from 0 (no prot) to ~50 (protect everything). Default 5.
21
#  luma_cap (integer)  - value from 0 (black) to 255 (white), used to stop the darkening
22
#                        determination from being 'blinded' by bright pixels, and to stop grey
23
#                        lines on white backgrounds being darkened. Any pixels brighter than
24
#                        luma_cap are treated as only being as bright as luma_cap. Lowering
25
#                        luma_cap tends to reduce line darkening. 255 disables capping. Default 191.
26
#  threshold (integer) - any pixels that were going to be darkened by an amount less than
27
#                        threshold will not be touched. setting this to 0 will disable it, setting
28
#                        it to 4 (default) is recommended, since often a lot of random pixels are
29
#                        marked for very slight darkening and a threshold of about 4 should fix
30
#                        them. Note if you set threshold too high, some lines will not be darkened
31
#  thinning (integer)  - optional line thinning amount, 0-256. Setting this to 0 will disable it,
32
#                        which is gives a _big_ speed increase. Note that thinning the lines will
33
#                        inherently darken the remaining pixels in each line a little. Default 0.
34
#
35
# Changelog:
36
#  1.43 - update to masktools 2.2.17
37
#  1.42 - added high bit support in avs+ and others Optmized
38
#  1.4  - added protection option. Prevents darkest lines to be over darkened thus creating artifacts (i.e. aliasing, clipping...)
39
#       - Optmized the code as suggested by Didée for possible faster processing. It also deals with the green screen bug.
40
#  1.3  - added ability to thin lines, now runs much slower unless thinning=0. Changed the defaults (again)
41
#  1.2  - huge speed increase using yv12lutxy =)
42
#       - weird darkening issues gone (they were caused by yv12layer)
43
#       - show option no longer available due to optimizations. Use subtract() instead
44
#  1.1  - added luma_cap option
45
#  1.0  - initial release
46
#
47
48
49
function FastLineDarkenMOD4( clip input, float "strength", float "prot", float "luma_cap", float "threshold", float "thinning")
50
{
51
## parameters ##
52
str        = string(default(strength, 48) /128.)
53
lum        = string(default(luma_cap, 191))
54
protection = default(prot,5)
55
thr        = string(default(threshold, 4))
56
thinning   = default(thinning,0)
57
thn        = string(thinning /16.)
58
59
Assert(!(input.isrgb()), "FastLineDarkenMOD4: RGB Color formats is not supported" )
60
61
sisphbd = AvsPlusVersionNumber > 2294
62
63
sislumaonly = sisphbd ? input.isy() : VersionNumber() < 2.6 ? true : input.isy8()
64
65
c = sislumaonly ? input : sisphbd ? input.converttoy() : input.converttoy8()
66
 
67
## filtering ##
68
exin    = c.mt_expand(thy=255/(protection+1)).mt_inpand()
69
diff    = VersionNumber() < 2.6 ? mt_lutxy(c,exin,yexpr="y "+lum+" < y "+lum+" ? x "+thr+" + > x y "+lum+" < y "+lum+" ? - 0 ? 127 +",uexpr="x",vexpr="x")
70
          \                     : mt_lutxy(c,exin,yexpr="y "+lum+" scalef < y "+lum+" scalef ? x "+thr+" scalef + > x y "+lum+" scalef < y "+lum+" scalef ? - 0 ? 127 scalef +", use_expr=1)
71
linemask= thinning != 0 ? VersionNumber() < 2.6 ? mt_lut(diff.mt_inpand(),"x 127 - "+thn+" * 255 +").RemoveGrain(20,-1)
72-
			\			: mt_lut(diff.mt_inpand(),"x 127 scalef - "+thn+" * range_max +",clamp_float=true,use_expr=3).RemoveGrain(20,-1) : nop()
72+
			\			: mt_lut(diff.mt_inpand(),"x 127 scalef - "+thn+" * range_max +",clamp_float=true,use_expr=2).RemoveGrain(20,-1) : nop()
73
thick   = VersionNumber() < 2.6 ? mt_lutxy(c, exin, yexpr="y "+lum+" < y "+lum+" ? x "+thr+" + > x y "+lum+" < y "+lum+" ? - 0 ? "+str+" * x +",uexpr="x",vexpr="x",u=2, v=2)
74
          \                     : mt_lutxy(c, exin, yexpr="y "+lum+" scalef < y "+lum+" scalef ? x "+thr+" scalef + > x y "+lum+" scalef < y "+lum+" scalef ? - 0 ? "+str+" * x +",clamp_float=true,use_expr=1,u=2, v=2)
75
thin    = thinning != 0 ? VersionNumber() < 2.6 ? mt_lutxy(c.mt_expand(U=2,V=2),diff,yexpr="x y 127 - "+str+" 1 + * +",u=2, v=2)
76
			\ 			: mt_lutxy(c.mt_expand(U=2,V=2),diff,yexpr="x y 127 scalef - "+str+" 1 + * +", scale_inputs="floatf", use_expr=3,u=2, v=2) : nop()
77
 
78
thinning == 0 ? thick : mt_merge(thin,thick,linemask,y=3,u=2,v=2)
79
80
return sislumaonly ? last : sisphbd ? CombinePlanes(last,input,planes="YUV",sample_clip=input) : ytouv(input.utoy8(),input.vtoy8(),last)
81
}
82
83
#############
84
85
86
function FastLineDarkenMOD3( clip c, int "strength", int "prot", int "luma_cap", int "threshold", int "thinning") 
87
{
88
## parameters ##
89
str        = string(default(strength, 50) /128.)
90
lum 	   = string(default(luma_cap, 191))
91
protection = default(prot,5)
92
thr 	   = string(default(threshold, 4))
93
thinning   = default(thinning,0)
94
thn 	   = string(thinning /16.)
95
96
## filtering ##
97
exin	= c.mt_expand(thy=255/(protection+1)).mt_inpand()
98
diff 	= mt_lutxy(c,exin,yexpr="y "+lum+" < y "+lum+" ? x "+thr+" + > x y "+lum+" < y "+lum+" ? - 0 ? 127 +",uexpr="x",vexpr="x")
99
linemask= mt_lut(diff.mt_inpand(),"x 127 - "+thn+" * 255 +").mt_convolution("1 1 1","1 1 1",y=3,u=0,v=0)#".RemoveGrain(20,-1)" gives a little speed boost.
100
thick 	= mt_lutxy(c, exin, yexpr="y "+lum+" < y "+lum+" ? x "+thr+" + > x y "+lum+" < y "+lum+" ? - 0 ? "+str+" * x +",uexpr="x",vexpr="x")
101
thin 	= mt_lutxy(c.mt_expand(),diff,yexpr="x y 127 - "+str+" 1 + * +")
102
103
(thinning == 0) ? thick : mt_merge(thin,thick,linemask,y=3)
104
return mergechroma(c)}
105
106
#############
107
108
109
function FastLineDarkenMOD2( clip c, int "strength", int "luma_cap", int "threshold", int "thinning")
110
{
111
## parameters ##
112
str     = string(default(strength, 48) /128.)
113
lum     = string(default(luma_cap, 191))
114
thr     = string(default(threshold, 4))
115
thinning = default(thinning,24)
116
thn     = string(thinning /16.)
117
 
118
## filtering ##
119
exin    = c.mt_expand().mt_inpand()
120
diff    = mt_lutxy(c,exin,yexpr="y "+lum+" < y "+lum+" ? x "+thr+" + > x y "+lum+" < y "+lum+" ? - 0 ? 127 +",uexpr="x",vexpr="x",u=2, v=2)
121
linemask= mt_lut(diff.mt_inpand(),"x 127 - "+thn+" * 255 +").mt_convolution("1 1 1","1 1 1",y=3,u=0,v=0)#".RemoveGrain(20,-1)" gives a little speed boost.
122
thick   = mt_lutxy(c, exin, yexpr="y "+lum+" < y "+lum+" ? x "+thr+" + > x y "+lum+" < y "+lum+" ? - 0 ? "+str+" * x +",uexpr="x",vexpr="x",u=2, v=2)
123
thin    = mt_lutxy(c.mt_expand(U=2,V=2),diff,yexpr="x y 127 - "+str+" 1 + * +",u=2, v=2)
124
 
125
return (thinning == 0) ? thick : mt_merge(thin,thick,linemask,y=3,u=2,v=2)
126
}