View difference between Paste ID: sbpK1GGC and 8Xu0WXs4
SHOW: | | - or go back to the newest paste.
1-
# 2019.07.20
1+
# 2019.07.28
2
function BalanceBorders(clip c, int cTop, int cBottom, int cLeft, int cRight, int "thresh", int "blur")
3
{
4
    sisavs26     = !(VersionNumber() < 2.6)
5
    sisphbd = AvsPlusVersionNumber > 2294
6
 
7
    sislumaonly  = sisphbd ? c.isy() : sisavs26 ? c.isy8() : false
8
    
9
    sisfullchrom = sisphbd ? c.is444() : sisavs26 ? c.isyv24() : false
10
    
11
    sis420chr    = sisphbd ? c.is420() : c.isyv12()
12
    
13
    Assert(sis420chr || sisfullchrom || sislumaonly, "This is not a Square chroma clip.")
14
15
    thresh = Default(thresh, 128)
16
    blur   = Default(blur,   999)
17
18
    Assert(blur   > 0, "Blur parameter in BalanceBorders() must be > 0")
19
    Assert(thresh > 0, "Thresh parameter in BalanceBorders() must be > 0")
20
21
    c
22
    cTop    >0 ? BalanceTopBorder(cTop,    thresh, blur, sislumaonly, sis420chr, sisavs26).sTryFTurnRight() : last.sTryFTurnRight()
23
    cLeft   >0 ? BalanceTopBorder(cLeft,   thresh, blur, sislumaonly, sis420chr, sisavs26).sTryFTurnRight() : last.sTryFTurnRight()
24
    cBottom >0 ? BalanceTopBorder(cBottom, thresh, blur, sislumaonly, sis420chr, sisavs26).sTryFTurnRight() : last.sTryFTurnRight()
25
    cRight  >0 ? BalanceTopBorder(cRight,  thresh, blur, sislumaonly, sis420chr, sisavs26).sTryFTurnRight() : last.sTryFTurnRight()
26
}
27
28
function BalanceTopBorder(clip c, int cTop, int "thresh", int "blur", bool "sislumaonly", bool "sis420chr", bool "sisavs26")
29
{
30
    cWidth = c.width
31
    cHeight = c.height
32
    cTop = min(cTop,cHeight-1)
33
	cTop2 = max(sis420chr ? 4 : 2,cTop)
34
    blurWidth = max(4,floor(cWidth/blur))
35
36
    c2 = c.PointResize(cWidth*2,cHeight*2)
37
38
    c2.\
39
    Crop(0,cTop*2,cWidth*2,2)
40
    PointResize(cWidth*2,cTop2*2)
41
    BilinearResize(blurWidth*2,cTop2*2)
42
    mt_convolution("1 1 1","0 1 0",y=3,u=sislumaonly ? 1 : 3,v=sislumaonly ? 1 : 3)
43
	PointResize(blurWidth*2,cTop*2)
44
    BilinearResize(cWidth*2,cTop*2)
45
    referenceBlur = last
46
47
    original = c2.Crop(0,0,cWidth*2,cTop*2)
48
49
    original
50
	PointResize(Width(),cTop2*2)
51
    BilinearResize(blurWidth*2,cTop2*2)
52
    mt_convolution("1 1 1","0 1 0",y=3,u=sislumaonly ? 1 : 3,v=sislumaonly ? 1 : 3)
53
	PointResize(blurWidth*2,cTop*2)
54
    BilinearResize(cWidth*2,cTop*2)
55
    originalBlur = last
56
57
    balanced = sisavs26 ? mt_lutXYZ(original,originalBlur,referenceBlur,"z y - x +",clamp_float=true,use_expr=3,y=3,u=3,v=3) : mt_lutXYZ(original,originalBlur,referenceBlur,"z y - x +",y=3,u=3,v=3)
58
    difference = mt_makeDiff(balanced,original,y=3,u=3,v=3)
59
60
    tp = string(128+thresh)
61
    tm = string(128-thresh)
62
    difference = sisavs26 ? difference.mt_lut("x "+tp+" scalef > "+tp+" scalef x ?",Use_expr=2,y=3,u=3,v=3) : difference.mt_lut("x "+tp+" > "+tp+" x ?",y=3,u=3,v=3)
63
    difference = sisavs26 ? difference.mt_lut("x "+tm+" scalef < "+tm+" scalef x ?",Use_expr=2,y=3,u=3,v=3) : difference.mt_lut("x "+tm+" < "+tm+" x ?",y=3,u=3,v=3)
64
65
    mt_addDiff(original,difference,y=3,u=3,v=3)
66
67
    StackVertical(last,c2.Crop(0,cTop*2,cWidth*2,(cHeight-cTop)*2)).PointResize(cWidth,cHeight)
68
}