View difference between Paste ID: 1VQThWX4 and AsbQaA6J
SHOW: | | - or go back to the newest paste.
1
# FineDehalo
2-
# 1.1 mod4
2+
# 1.1 mod5
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. See
7+
# To Public License, Version 2, as published by Sam Hocevar.
8-
# http://sam.zoy.org/wtfpl/COPYING for more details.
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")
109-
Function FineDehaloanalog (clip src, string "exdehalo")
109+
110
exdehalo=Default (exdehalo, "VHSHaloremover(2,2,200,100,0.5)")
111
src
112
edgm = EMask_dhh(ColorYUV(autogain=true), 3, 255,true)
113
hfil = DeHalo_alpha_mt(darkstr=0.2,brightstr=0.8).FineDehalo(exdehalo=DeHaloHmod(2,exdehalo=exdehalo,extmask=edgm), exedgesm=fexedgesm)
114-
hfil = DeHalo_alpha_mt(darkstr=0.2,brightstr=0.8).FineDehalo(exdehalo=DeHaloHmod(2,exdehalo=exdehalo,extmask=edgm))
114+
115
DeRinging = mt_Merge(hfil, src, edgm.mt_inflate(155,155))
116
mt_Merge(src, DeRinging, RM2, u=2, v=2)
117
}
118
119
Function FineDehaloedges (clip src, float "rx", float "ry", int "thmi", int "thma", int "thlimi", int "thlima", int "showmask", bool "excl", float "edgeproc")
120
{
121
	rx        = Default (rx,          2)
122
	ry        = Default (ry,         rx)
123
	thmi      = Default (thmi,       80)
124
	thma      = Default (thma,      128)
125
	thlimi    = Default (thlimi,     50)
126
	thlima    = Default (thlima,    100)
127
	showmask  = Default (showmask,    0)
128
	excl      = Default (excl,     true)
129
	edgeproc  = Default (edgeproc,  0.0)
130
131
	rx_i = Round (rx)
132
	ry_i = Round (ry)
133
134
	src
135
136
	### Main edges ###
137
138
	# Basic edge detection, thresholding will be applied later.
139
	edges = mt_edge (mode="prewitt", thY1=0, thY2=255)
140
141
	# Keeps only the sharpest edges (line edges)
142
	strong = edges.mt_lut (expr="x "+String(thmi)+" - "+String(thma-thmi)+" / 255 *")
143
144
	# Extends them to include the potential halos
145
	large = strong.mt_expand_multi (sw=rx_i, sh=ry_i)
146
147
148
	### Exclusion zones ###
149
150
	# When two edges are close from each other (both edges of a single
151
	# line or multiple parallel color bands), the halo removal
152
	# oversmoothes them or makes seriously bleed the bands, producing
153
	# annoying artifacts. Therefore we have to produce a mask to exclude
154
	# these zones from the halo removal.
155
156
	# Includes more edges than previously, but ignores simple details
157
	light = edges.mt_lut (expr="x "+String(thlimi)+" - "+String(thlima-thlimi)+" / 255 *")
158
159
	# To build the exclusion zone, we make grow the edge mask, then shrink
160
	# it to its original shape. During the growing stage, close adjacent
161
	# edge masks will join and merge, forming a solid area, which will
162
	# remain solid even after the shrinking stage.
163
164
	# Mask growing
165
	shrink = light.mt_expand_multi (sw=rx_i, sh=ry_i, mode="ellipse")
166
167
	# At this point, because the mask was made of a shades of grey, we may
168
	# end up with large areas of dark grey after shrinking. To avoid this,
169
	# we amplify and saturate the mask here (actually we could even
170
	# binarize it).
171
	shrink = shrink.mt_lut ("x 4 *")
172
173
	# Mask shrinking
174
	shrink = shrink.mt_inpand_multi (sw=rx_i, sh=ry_i, mode="ellipse")
175
176
	# This mask is almost binary, which will produce distinct
177
	# discontinuities once applied. Then we have to smooth it.
178
	shrink = shrink.RemoveGrain (20, -1)
179
	shrink = shrink.RemoveGrain (20, -1)
180
181
182
	### Final mask building ###
183
184
	# Previous mask may be a bit weak on the pure edge side, so we ensure
185
	# that the main edges are really excluded. We do not want them to be
186
	# smoothed by the halo removal.
187
	shr_med = (excl) ? mt_logic (strong, shrink, mode="max") : strong
188
189
	# Substracts masks and amplifies the difference to be sure we get 255
190
	# on the areas to be processed.
191
	outside = mt_lutxy (large, shr_med, "x y - 2 *")
192
193
	# If edge processing is required, adds the edgemask
194
	ep_str  = "x y "+String(edgeproc * 0.66)+" * +"
195
	outside = (edgeproc > 0) ? mt_lutxy (outside, strong, ep_str) : outside
196
197
	# Smooth again and amplify to grow the mask a bit, otherwise the halo
198
	# parts sticking to the edges could be missed.
199
	outside.RemoveGrain (20, -1).mt_lut ("x 2 *")
200
201
	  (showmask == 1) ? outside.GreyScale ()
202
\	: (showmask == 2) ? shrink.GreyScale ()
203
\	: (showmask == 3) ? edges.GreyScale ()
204
\	: (showmask == 4) ? strong.GreyScale ()
205
\	:                   last
206
}