View difference between Paste ID: 8EaSTAA9 and A1YMFGJK
SHOW: | | - or go back to the newest paste.
1
# FineDehalo
2-
# 1.1 mod6
2+
# 1.1 mod7
3
#
4
# This program is free software. It comes without any warranty, to
5
# the extent permitted by applicable law. You can redistribute it
6
# and/or modify it under the terms of the Do What The Fuck You Want
7
# To Public License, Version 2, as published by Sam Hocevar.
8
9
Function FineDehalo (clip src, float "rx", float "ry", int "thmi", int "thma", int "thlimi", int "thlima", float "darkstr", float "brightstr", int "showmask", float "contra", bool "excl", float "edgeproc", val "exdehalo", clip "exedgesm")
10
{
11
	rx        = Default (rx,          2)
12
	ry        = Default (ry,         rx)
13
	thmi      = Default (thmi,       80)
14
	thma      = Default (thma,      128)
15
	thlimi    = Default (thlimi,     50)
16
	thlima    = Default (thlima,    100)
17
	darkstr   = Default (darkstr,   1.0)
18
	brightstr = Default (brightstr, 1.0)
19
	showmask  = Default (showmask,    0)
20
	contra    = Default (contra,    0.0)
21
	excl      = Default (excl,     true)
22
	edgeproc  = Default (edgeproc,  0.0)
23
24
	rx_i = Round (rx)
25
	ry_i = Round (ry)
26
27
	src
28
29
30
	### Dehaloing ###
31
32
	dehaloed = defined(exdehalo) ? isclip(exdehalo) ? exdehalo : eval("last." + exdehalo) : DeHalo_alpha (rx=rx, ry=ry, darkstr=darkstr, brightstr=brightstr)
33
34
	# Contrasharpening
35
	dehaloed =   (contra > 0)
36
\	           ? dehaloed.FineDehalo_contrasharp (src, contra)
37
\	           : dehaloed
38
39
	edgesm = defined(exedgesm) ? exedgesm : FineDehaloedges(rx=rx, ry=ry, thmi=thmi, thma=thma, thlimi=thlimi, thlima=thlima, showmask=showmask, excl=excl, edgeproc=edgeproc)
40
41
	### Masking ###
42
43
		  (showmask != 0) ? edgesm
44
	\	:                   mt_merge (last, dehaloed, edgesm, y=3, u=2, v=2)
45
}
46
47
# level == 1.0 : normal contrasharp
48
Function FineDehalo_contrasharp (clip dehaloed, clip src, float level)
49
{
50
	bb  = dehaloed.RemoveGrain (11, -1)
51
	bb2 = bb.Repair (bb.Repair (bb.Medianblur (2, -256, -256), 1), 1)
52
	xd  = mt_makediff (bb, bb2)
53
	xd  = xd.mt_lut ("x 128 - 2.49 * "+String(level)+" * 128 +")
54
	xdd = mt_lutxy (
55
\		xd,
56
\		mt_makediff (src, dehaloed),
57
\		"x 128 - y 128 - * 0 < 128 x 128 - abs y 128 - abs < x y ? ?"
58
\	)
59
60
	dehaloed.mt_adddiff (xdd, y=3, u=2, v=2)
61
}
62
63
64
65
66
# Try to remove 2nd order halos.
67
Function FineDehalo2 (clip src, string "hconv", string "vconv", int "showmask")
68
{
69
	hconv    = Default (hconv, "-1 -2 0 0 40 0 0 -2 -1")
70
	vconv    = Default (vconv, "-2 -1 0 0 40 0 0 -1 -2")
71
	showmask = Default (showmask, 0)
72
73
	src
74
	fix_h = mt_convolution (horizontal="1", vertical=vconv, y=3, u=2, v=2)
75
	fix_v = mt_convolution (horizontal=hconv, vertical="1", y=3, u=2, v=2)
76
	edges_h = mt_edge (mode="1 2 1 0 0 0 -1 -2 -1", thY1=0, thY2=255)
77
	edges_v = mt_edge (mode="1 0 -1 2 0 -2 1 0 -1", thY1=0, thY2=255)
78
	mask_h = edges_h	#.mt_lut (expr="x 2 *")
79
	mask_v = edges_v	#.mt_lut (expr="x 2 *")
80
	temp_h = mt_lutxy (mask_h, mask_v, expr="x 3 * y -")
81
	temp_v = mt_lutxy (mask_v, mask_h, expr="x 3 * y -")
82
	mask_h = temp_h
83
	mask_v = temp_v
84
85
	mask_h = mask_h.FineDehalo2_grow_mask ("vertical")
86
	mask_v = mask_v.FineDehalo2_grow_mask ("horizontal")
87
88
	src
89
	mt_merge (last, fix_h, mask_h, y=3, u=2, v=2)
90
	mt_merge (last, fix_v, mask_v, y=3, u=2, v=2)
91
92
	  (showmask == 1) ? mt_logic (mask_h, mask_v, mode="max").GreyScale ()
93
\	:                   last
94
}
95
96
Function FineDehalo2_grow_mask (clip mask, string mode)
97
{
98
	Assert ((mode == "horizontal" || mode == "vertical"), "Wrong mode")
99
100
	mask
101
	mt_expand (mode=mode).mt_inpand (mode=mode)
102
	mask_1 = mt_expand (mode=mode)
103
	mask_2 = mask_1.mt_expand (mode=mode).mt_expand (mode=mode)
104
	mt_lutxy (mask_2, mask_1, expr="x y -")
105
	RemoveGrain (12, -1).mt_lut (expr="x 1.8 *")
106
}
107
108-
Function FineDehaloanalog (clip src, string "exdehalo", clip "fexedgesm")
108+
Function FineDehaloanalog (clip src, int "radius", string "exdehalo", clip "fexedgesm", clip "linesm")
109
{
110-
exdehalo=Default (exdehalo, "VHSHaloremover(2,2,200,100,0.5)")
110+
exdehalo = Default (exdehalo, "VHSHaloremover(2,2,200,100,0.5)")
111
edgm     = Defined(linesm) ? linesm : src.slinesm()
112-
edgm = EMask_dhh(ColorYUV(autogain=true), 3, 255,true)
112+
radius   = Default(radius, 2)
113
114-
RM2  = DR_Radius_dhh(edgm.mt_inflate(),2,0).mt_inflate()
114+
115
hfil = DeHalo_alpha_mt(darkstr=0.2,brightstr=0.8).FineDehalo(exdehalo=DeHaloHmod(2,exdehalo=exdehalo,extmask=edgm), exedgesm=fexedgesm)
116
RM2  = DR_Radius_dhh(edgm.mt_inflate(),radius,0).mt_inflate()
117
DeRinging = mt_Merge(hfil, src, edgm.mt_inflate(155,155))
118
mt_Merge(src, DeRinging, RM2, u=2, v=2)
119
}
120
121
Function FineDehaloedges (clip src, float "rx", float "ry", int "thmi", int "thma", int "thlimi", int "thlima", int "showmask", bool "excl", float "edgeproc")
122
{
123
	rx        = Default (rx,          2)
124
	ry        = Default (ry,         rx)
125
	thmi      = Default (thmi,       80)
126
	thma      = Default (thma,      128)
127
	thlimi    = Default (thlimi,     50)
128
	thlima    = Default (thlima,    100)
129
	showmask  = Default (showmask,    0)
130
	excl      = Default (excl,     true)
131
	edgeproc  = Default (edgeproc,  0.0)
132
133
	rx_i = Round (rx)
134
	ry_i = Round (ry)
135
136
	src
137
138
	### Main edges ###
139
140
	# Basic edge detection, thresholding will be applied later.
141
	edges = mt_edge (mode="prewitt", thY1=0, thY2=255)
142
143
	# Keeps only the sharpest edges (line edges)
144
	strong = edges.mt_lut (expr="x "+String(thmi)+" - "+String(thma-thmi)+" / 255 *")
145
146
	# Extends them to include the potential halos
147
	large = strong.mt_expand_multi (sw=rx_i, sh=ry_i)
148
149
150
	### Exclusion zones ###
151
152
	# When two edges are close from each other (both edges of a single
153
	# line or multiple parallel color bands), the halo removal
154
	# oversmoothes them or makes seriously bleed the bands, producing
155
	# annoying artifacts. Therefore we have to produce a mask to exclude
156
	# these zones from the halo removal.
157
158
	# Includes more edges than previously, but ignores simple details
159
	light = edges.mt_lut (expr="x "+String(thlimi)+" - "+String(thlima-thlimi)+" / 255 *")
160
161
	# To build the exclusion zone, we make grow the edge mask, then shrink
162
	# it to its original shape. During the growing stage, close adjacent
163
	# edge masks will join and merge, forming a solid area, which will
164
	# remain solid even after the shrinking stage.
165
166
	# Mask growing
167
	shrink = light.mt_expand_multi (sw=rx_i, sh=ry_i, mode="ellipse")
168
169
	# At this point, because the mask was made of a shades of grey, we may
170
	# end up with large areas of dark grey after shrinking. To avoid this,
171
	# we amplify and saturate the mask here (actually we could even
172
	# binarize it).
173
	shrink = shrink.mt_lut ("x 4 *")
174
175
	# Mask shrinking
176
	shrink = shrink.mt_inpand_multi (sw=rx_i, sh=ry_i, mode="ellipse")
177
178
	# This mask is almost binary, which will produce distinct
179
	# discontinuities once applied. Then we have to smooth it.
180
	shrink = shrink.RemoveGrain (20, -1)
181
	shrink = shrink.RemoveGrain (20, -1)
182
183
184
	### Final mask building ###
185
186
	# Previous mask may be a bit weak on the pure edge side, so we ensure
187
	# that the main edges are really excluded. We do not want them to be
188
	# smoothed by the halo removal.
189
	shr_med = (excl) ? mt_logic (strong, shrink, mode="max") : strong
190
191
	# Substracts masks and amplifies the difference to be sure we get 255
192
	# on the areas to be processed.
193
	outside = mt_lutxy (large, shr_med, "x y - 2 *")
194
195
	# If edge processing is required, adds the edgemask
196
	ep_str  = "x y "+String(edgeproc * 0.66)+" * +"
197
	outside = (edgeproc > 0) ? mt_lutxy (outside, strong, ep_str) : outside
198
199
	# Smooth again and amplify to grow the mask a bit, otherwise the halo
200
	# parts sticking to the edges could be missed.
201
	outside.RemoveGrain (20, -1).mt_lut ("x 2 *")
202
203
	  (showmask == 1) ? outside.GreyScale ()
204
\	: (showmask == 2) ? shrink.GreyScale ()
205
\	: (showmask == 3) ? edges.GreyScale ()
206
\	: (showmask == 4) ? strong.GreyScale ()
207
\	:                   last
208-
Function filtering_wbb (clip src, string "filter", int "oneborder")
208+
209
210
Function filtering_wbb (clip src, string "filter", int "oneborder", clip "linesm", clip "clip4lines")
211
{
212-
filter    = Default (filter, """FineDehaloanalog(exdehalo="VHSHaloremover(2,2,200,100,0.5).yahr")""")
212+
213
oneborder = Default (oneborder, 2)
214
filter    = Default (filter, defined(linesm) ? "yahr3.TBilateral(5,5,0.9,0.9,5,5,0.7,chroma=false)" : \
215
                                             """FineDehaloanalog(exdehalo="VHSHaloremover(2,2,200,100,0.5).yahr2(32)")""")
216
AddBorders(oneborder,oneborder,oneborder,oneborder)
217
eval(filter)
218
Crop(oneborder, oneborder, -oneborder, -oneborder, align=true)
219
defined(linesm) ? mt_Merge(last, defined(clip4lines) ? clip4lines : src, linesm.mt_inflate(155,155)) : last
220
}
221
222
# black lines mask by A.SONY
223
Function slinesm (clip i, int "trh", float "trh2", bool "analog", bool "autogain", val "edgesm", bool "noedges")
224
{
225
analog     = Default(analog,   true)
226
autogain   = Default(autogain, true)
227
noedges    = Default(noedges,  false)
228
trh        = Default(trh,  255)
229
trh2       = Default(trh2, 170)
230
231
i          = autogain ? i.ColorYUV(autogain=true) : i
232
233
edgesm     = !noedges ? defined(edgesm) ? isclip(edgesm) ? edgesm : eval("i." + edgesm) : i.Camembert_dhh() : nop()
234
235
LineDarkenclip = trh==0 ? i : i.FastLineDarkenMOD3_dhh(trh).blur(0.5).FastLineDarkenMOD3_dhh(250,1,250,-2)
236
237
lut4dark   = analog ? LineDarkenclip.mt_lut("x "+String(trh2/2.46)+" < 255 x "+String(trh2)+" > 0 255 x "+String(trh2/2.46)+" - 255 "+String(trh2)+" "+String(trh2/2.46)+" - / * - ? ?",u=1,v=1) : 
238
                    \ LineDarkenclip.mt_binarize(70, mode="0 255")
239
240
noedges ? lut4dark : 
241
        \ mt_merge(i.mt_edge(mode="min/max", thY1=255, thY2=255), edgesm, lut4dark)
242
}