Welcome to Doom9's Forum, THE in-place to be for everyone interested in DVD conversion. Before you start posting please read the forum rules. By posting to this forum you agree to abide by the rules. |
|
|
#1 | Link | |
|
HeartlessS Usurer
Join Date: Dec 2009
Location: Over the rainbow
Posts: 11,392
|
RGBAdapt v0.5 plugin 06 Dec 2018
Code:
RGBAdapt, By StainlessS
For Avisynth v2.58, v2.60, Avs+ x86 & x64. Requires VS 2008 CPP runtimes.
RGB24/RGB32.
Audio as original.
RGBAdapt(clip c, \
\ Float "R_Bias"=0.0,Float "R_Gain"=1.0,Float "R_Cont"=1.0,Float "R_RPow"=1.0,Float "R_Spow"=1.0,Float "R_SPMid"=0.5,Bool "R_Pord"=false,
\ Float "G_Bias"=0.0,Float "G_Gain"=1.0,Float "G_Cont"=1.0,Float "G_RPow"=1.0,Float "G_Spow"=1.0,Float "G_SPMid"=0.5,Bool "G_Pord"=false,
\ Float "B_Bias"=0.0,Float "B_Gain"=1.0,Float "B_Cont"=1.0,Float "B_RPow"=1.0,Float "B_Spow"=1.0,Float "B_SPMid"=0.5,Bool "B_Pord"=false,
\ Int "R_IMin"=0,Int "R_OMin"=0,Int "R_IMax"=255,Int "R_OMax"=255,
\ Int "G_IMin"=0,Int "G_OMin"=0,Int "G_IMax"=255,Int "G_OMax"=255,
\ Int "B_IMin"=0,Int "B_OMin"=0,Int "B_IMax"=255,Int "B_OMax"=255
\ )
Bias -512.0 -> 512.0. Bias = Brightness.
Gain -8.0 -> 8.0 Gain = Zero relative contrast.
Cont -8.0 -> 8.0 Cont = Centre relative Contrast.
RPow 0.1 -> 4.0 RPow = Gamma, r shaped power curve.
SPow 0.1 -> 4.0 SPow = S shaped power curve.
SPMid 0.01 -> 0.99 SPMid = Controls Inflection point for S shaped power curve, 0.5 = mid point ie 0.5*255.0
Pord True/False Pord=Rpow processed first (False) or SPow first (True). The power functions are non commutative.
Assuming all settings apart from RPow, SPow and SPMid at defaults:-
Pord Default (false) RPow1st, when modifying RPow or SPow, the SPow power curve inflection point will
remain fixed at Y = SPMid * 255.0, Rpow will slide it left or right.
Pord SPow1st, when modifying RPow or SPow, the SPow power curve inflection point will remain fixed
at X = SPMid * 255.0, RPow will slide it up or down.
New args v0.3
IMin 0 -> 255 : IMin <= (IMax+1)
OMin 0 -> 255
IMax 0 -> 255 : (IMin-1) <= IMax
OMax 0 -> 255
Any INPUT value less than IMin will be mapped to OMin (both default to 0), and values greater than IMax will be mapped to
OMax (both default to 255). With default settings the Min/Max options have no effect.
These options allow for weird shaped LUT's to eg create masks. Example, Leaving all other settings at default and
for some channel set IMax to eg 127 and OMax to 64 would map all input above 127 to 64 while leaving everything else untouched.
If you additionally set eg IMin=128 and OMin=180, then 0-127 would map to 180 and 128->255 map to 64.
The IMin <= (IMax+1) requirement allows you to map the entire 0->255 range to any two output values.
RgbAdapt_Graffer.exe demos the plugin and all arguments. (Will require VB6 runtimes, most will already have these.)
v0.4, Added RGBAdapt16() arguments identical to RGBAdapt().
Takes 8 bit interleaved RGB and produces Stack16 interleaved RGB, MSB on top.
Can use something like:-
Avisource("D:\avs\test.avi").convertToRGB32
RGBAdapt16(R_SPow=1.2,G_SPow=1.2,B_SPow=1.2)
Dither_convert_rgb_to_yuv(showred("yv12"), showgreen("yv12"), showblue("yv12"),lsb=false)
return Last
###########################################################
EDIT:
Graffer_Update,
The button "Get Fn Call From ClipBoard" reads in RgbAdapt settings from the clipboard, in format as created via RT_String().
Can write to Clipboard using ClipBoard plugin.
Ie, all 33 args In Default Order, with exception of the first clip argument which should be omitted.
# EDIT: Below added comman at end of every line, else cause error
Format = "RgbAdapt(" +
\ "%f,%f,%f,%f,%f,%f,%s," +
\ "%f,%f,%f,%f,%f,%f,%s," +
\ "%f,%f,%f,%f,%f,%f,%s," +
\ "%d,%d,%d,%d," +
\ "%d,%d,%d,%d," +
\ "%d,%d,%d,%d" +
\ ")"
CBStr=RT_String(Format,
\ red_bias, red_gain, red_cont, red_rpow, red_spow, r_spmid, r_pord,
\ grn_bias, grn_gain, grn_cont, grn_rpow, grn_spow, g_spmid, g_pord,
\ blu_bias, blu_gain, blu_cont, blu_rpow, blu_spow, b_spmid, b_pord,
\ red_imin, red_omin, red_imax, red_omax,
\ grn_imin, grn_omin, grn_imax, grn_omax,
\ blu_imin, blu_omin, blu_imax, blu_omax
\ )
err = ClipBoard_PutText(CBStr)
Assert(Err==0, "Error writing to ClipBoard")
##################
Reading Data written to clipboard via RgbAdapt_Graffer button "Copy Fn Call to Clipboard",
Use ClipBoard_GetText() to return as formatted below. (Add "c." before result to use c clip or without defaults to Last clip).
Or just use CTRL/V to insert from ClipBoard.
"""RgbAdapt(
\ R_Bias=0.1,R_Gain=1.001,R_Cont=1.001,R_Rpow=1.001,R_Spow=1.001,R_SPMid=0.501,R_Pord=True,
\ G_Bias=0.1,G_Gain=1.001,G_Cont=1.001,G_Rpow=1.001,G_Spow=1.001,G_SPMid=0.501,G_Pord=True,
\ B_Bias=0.1,B_Gain=1.001,B_Cont=1.001,B_Rpow=1.001,B_Spow=1.001,B_SPMid=0.501,B_Pord=True,
\ R_IMin=1,R_OMin=1,R_IMax=254,R_OMax=254,
\ G_IMin=1,G_OMin=1,G_IMax=254,G_OMax=254,
\ B_IMin=1,B_OMin=1,B_IMax=254,B_OMax=254
\ )
"""
![]() The Ring on the Fish's cheek shows the pixel that is being tracked and the Before and After colors shown in status bar. Monitor changes for single pixel as you modify the sliders. The tick box on left show that SPow is locked so R + G + B settings are affected simultaneously. From doc Quote:
as all three channels have SPow @ 1.18, the differing channels values of RPow shift it left or right as in graph. dll's, + source + full VS2008 Project files for easy rebuild. Click on MediaFire below. EDIT: Clipboard plugin might be useful with RgbAdapt_Graffer:- https://forum.doom9.org/showthread.php?t=176145
__________________
I sometimes post sober. StainlessS@MediaFire ::: AND/OR ::: StainlessS@SendSpace "Some infinities are bigger than other infinities", but how many of them are infinitely bigger ??? Last edited by StainlessS; 10th March 2019 at 09:35. Reason: Update |
|
|
|
|
|
|
#2 | Link |
|
Registered User
Join Date: Jan 2012
Location: Toulon France
Posts: 252
|
Hello StainlessS
Your plugin is great. Thus i have tried to use it for auto white balance. Code:
AVISource("C:\....\video.avi")
LoadPlugin("C:\..................\RGBAdapt_dll_v0.1-20140522\RGBAdapt.dll")
threshold = [<"threshold", 0, 255, 127>]
divisor_bias = [<"divisor_bias", 1, 10, 2>]
divisor_rpow = [<"divisor_rpow", 50, 150, 100>]
divisor_spow = [<"divisor_spow", 50, 150, 150>]
ConvertToRGB32(matrix="Rec601")
a=last
neutre = BlankClip(a, pixel_type="RGB32", color=$000000)
red=a.ShowRed("RGB32")
green = a.ShowGreen("RGB32")
blue = a.ShowBlue("RGB32")
b=a.ScriptClip("""
r = RGBDifference(red,neutre)
g = RGBDifference(green,neutre)
b = RGBDifference(blue,neutre)
dr = threshold - r
dg = threshold - g
db = threshold - b
dr1 = (threshold - r)*1/divisor_bias
dg1 = (threshold - g)*1/divisor_bias
db1 = (threshold - b)*1/divisor_bias
RGBAdapt( \
R_Bias = dr1, R_Gain = 1.0, R_Cont = 1.0, R_RPow = 1.0, R_Spow = 1.0, R_SPMid = 0.5, R_Pord = false, \
G_Bias = dg1, G_Gain = 1.0, G_Cont = 1.0, G_RPow = 1.0, G_Spow = 1.0, G_SPMid = 0.5, G_Pord = false,\
B_Bias = db1, B_Gain = 1.0, B_Cont = 1.0, B_RPow = 1.0, B_Spow = 1.0, B_SPMid = 0.5, B_Pord = false)
""")
red2=b.ShowRed("RGB32")
green2 = b.ShowGreen("RGB32")
blue2 = b.ShowBlue("RGB32")
c=b.ScriptClip("""
r = RGBDifference(red2,neutre)
g = RGBDifference(green2,neutre)
b = RGBDifference(blue2,neutre)
dr = threshold - r
dg = threshold - g
db = threshold - b
yr = 1+(threshold - r)*1/divisor_rpow
yg = 1+(threshold - g)*1/divisor_rpow
yb = 1+(threshold - b)*1/divisor_rpow
RGBAdapt( \
R_Bias = 0.0, R_Gain = 1.0, R_Cont = 1.0, R_RPow = yr, R_Spow = 1.0, R_SPMid = 0.5, R_Pord = false, \
G_Bias = 0.0, G_Gain = 1.0, G_Cont = 1.0, G_RPow = yg, G_Spow = 1.0, G_SPMid = 0.5, G_Pord = false,\
B_Bias = 0.0, B_Gain = 1.0, B_Cont = 1.0, B_RPow = yb, B_Spow = 1.0, B_SPMid = 0.5, B_Pord = false)
""")
red3=c.ShowRed("RGB32")
green3 = c.ShowGreen("RGB32")
blue3 = c.ShowBlue("RGB32")
d=c.ScriptClip("""
r = RGBDifference(red3,neutre)
g = RGBDifference(green3,neutre)
b = RGBDifference(blue3,neutre)
dr = threshold - r
dg = threshold - g
db = threshold - b
sr = 1-(threshold - r)*1/divisor_spow
sg = 1-(threshold - g)*1/divisor_spow
sb = 1-(threshold - b)*1/divisor_spow
RGBAdapt(c, \
R_Bias = 0.0, R_Gain = 1.0, R_Cont = 1.0, R_RPow = 1.0, R_Spow = sr, R_SPMid = 0.5, R_Pord = false, \
G_Bias = 0.0, G_Gain = 1.0, G_Cont = 1.0, G_RPow = 1.0, G_Spow = sg, G_SPMid = 0.5, G_Pord = false,\
B_Bias = 0.0, B_Gain = 1.0, B_Cont = 1.0, B_RPow = 1.0, B_Spow = sb, B_SPMid = 0.5, B_Pord = false)
""")
StackHorizontal(a.Subtitle("original"),b.Subtitle("linear curve"),c.Subtitle("Rpow curve"),d.Subtitle("Spow curve"),a.ConvertToYV12.ColorYUV(autowhite=true).Subtitle("AWB ColorYUV").ConvertToRGB32)
Has this script a sense ? Has Bias and Rpow auto-tune a sense ? Has Rpow and Spow auto-tune a sense ? For the last question, i think no, but for the other i don't know yet. Thanks Last edited by Bernardd; 23rd May 2014 at 20:28. |
|
|
|
|
|
#3 | Link |
|
Registered User
Join Date: Jan 2012
Location: Toulon France
Posts: 252
|
Hello,
I have worked this day on RGBAdapt use for automatic white balance. I have found a new expression to tune Rpow and Spow. Perhaps is it a best expression, but i have not found it this day. Now the script is OK for me. Code:
AVISource("C:\.......\1970-1971-Noel-Ski début rayures et poussières amoindries.avi")
LoadPlugin("C:\..............\RGBAdapt_dll_v0.1-20140522\RGBAdapt.dll")
info = [<"info", 0, 1, 1>] # show info, no = 0, yes = 1
threshold = [<"threshold", 0, 255, 127>]
divisor_bias = [<"divisor_bias", 0.1, 1.0, 0.5>]
ConvertToRGB32(matrix="Rec601")
a=last
neutre = BlankClip(a, pixel_type="RGB32", color=$000000)
#---------------------------------------- Linear curve b with info, b1 without info
red=a.ShowRed("RGB32")
green = a.ShowGreen("RGB32")
blue = a.ShowBlue("RGB32")
b=a.ScriptClip("""
r = RGBDifference(red,neutre)
g = RGBDifference(green,neutre)
b = RGBDifference(blue,neutre)
dr = threshold - r
dg = threshold - g
db = threshold - b
dr1 = dr*divisor_bias
dg1 = dg*divisor_bias
db1 = db*divisor_bias
Subtitle("Red value : "+String(r)+"Bias : "+String(dr1),y=40)
Subtitle("Green value : "+String(b)+"Bias : "+String(dg1),y=60)
Subtitle("Blue value : "+String(b)+"Bias : "+String(db1),y=80)
RGBAdapt( \
R_Bias = dr1, R_Gain = 1.0, R_Cont = 1.0, R_RPow = 1.0, R_Spow = 1.0, R_SPMid = 0.5, R_Pord = true, \
G_Bias = dg1, G_Gain = 1.0, G_Cont = 1.0, G_RPow = 1.0, G_Spow = 1.0, G_SPMid = 0.5, G_Pord = true,\
B_Bias = db1, B_Gain = 1.0, B_Cont = 1.0, B_RPow = 1.0, B_Spow = 1.0, B_SPMid = 0.5, B_Pord = true)
""")
b1=a.ScriptClip("""
r = RGBDifference(red,neutre)
g = RGBDifference(green,neutre)
b = RGBDifference(blue,neutre)
dr = threshold - r
dg = threshold - g
db = threshold - b
dr1 = dr*divisor_bias
dg1 = dg*divisor_bias
db1 = db*divisor_bias
RGBAdapt( \
R_Bias = dr1, R_Gain = 1.0, R_Cont = 1.0, R_RPow = 1.0, R_Spow = 1.0, R_SPMid = 0.5, R_Pord = true, \
G_Bias = dg1, G_Gain = 1.0, G_Cont = 1.0, G_RPow = 1.0, G_Spow = 1.0, G_SPMid = 0.5, G_Pord = true,\
B_Bias = db1, B_Gain = 1.0, B_Cont = 1.0, B_RPow = 1.0, B_Spow = 1.0, B_SPMid = 0.5, B_Pord = true)
""")
#---------------------------------------- Rpow curve c with info, c1 without info
red2=b1.ShowRed("RGB32")
green2 = b1.ShowGreen("RGB32")
blue2 = b1.ShowBlue("RGB32")
c=b1.ScriptClip("""
r = RGBDifference(red2,neutre)
g = RGBDifference(green2,neutre)
b = RGBDifference(blue2,neutre)
dr = threshold - r
dg = threshold - g
db = threshold - b
m=(dr+dg+db)
yr = (dr < 0) ? 1+dr/100:1+dr/100
yg = (dg < 0) ? 1+dg/100:1+dg/100
yb = (db < 0) ? 1+db/100:1+db/100
Subtitle("Red value : "+String(r)+"Bias : "+String(dr)+" Rpow : "+String(yr),y=40)
Subtitle("Green value : "+String(b)+"Bias : "+String(dg)+" Rpow : "+String(yg),y=60)
Subtitle("Blue value : "+String(b)+"Bias : "+String(db)+" Rpow : "+String(yb),y=80)
RGBAdapt( \
R_Bias = 0.0, R_Gain = 1.0, R_Cont = 1.0, R_RPow = yr, R_Spow = 1.0, R_SPMid = 0.5, R_Pord = true, \
G_Bias = 0.0, G_Gain = 1.0, G_Cont = 1.0, G_RPow = yg, G_Spow = 1.0, G_SPMid = 0.5, G_Pord = true,\
B_Bias = 0.0, B_Gain = 1.0, B_Cont = 1.0, B_RPow = yb, B_Spow = 1.0, B_SPMid = 0.5, B_Pord = true)
""")
c1=b1.ScriptClip("""
r = RGBDifference(red2,neutre)
g = RGBDifference(green2,neutre)
b = RGBDifference(blue2,neutre)
dr = threshold - r
dg = threshold - g
db = threshold - b
m=(dr+dg+db)
yr = (dr < 0) ? 1+dr/100:1+dr/100
yg = (dg < 0) ? 1+dg/100:1+dg/100
yb = (db < 0) ? 1+db/100:1+db/100
RGBAdapt( \
R_Bias = 0.0, R_Gain = 1.0, R_Cont = 1.0, R_RPow = yr, R_Spow = 1.0, R_SPMid = 0.5, R_Pord = true, \
G_Bias = 0.0, G_Gain = 1.0, G_Cont = 1.0, G_RPow = yg, G_Spow = 1.0, G_SPMid = 0.5, G_Pord = true,\
B_Bias = 0.0, B_Gain = 1.0, B_Cont = 1.0, B_RPow = yb, B_Spow = 1.0, B_SPMid = 0.5, B_Pord = true)
""")
#---------------------------------------- Spow curve d with info, d1 without info
red3=c1.ShowRed("RGB32")
green3 = c1.ShowGreen("RGB32")
blue3 = c1.ShowBlue("RGB32")
d=c1.ScriptClip("""
r = RGBDifference(red3,neutre)
g = RGBDifference(green3,neutre)
b = RGBDifference(blue3,neutre)
dr = threshold - r
dg = threshold - g
db = threshold - b
sr = (dr < 0) ? 1+dr/100:1+dr/100
sg = (dg < 0) ? 1+dg/100:1+dg/100
sb = (db < 0) ? 1+db/100:1+db/100
Subtitle("Red value : "+String(r)+"Bias : "+String(dr)+" Spow : "+String(sr),y=40)
Subtitle("Green value : "+String(b)+"Bias : "+String(dg)+" Spow : "+String(sg),y=60)
Subtitle("Blue value : "+String(b)+"Bias : "+String(db)+" Spow : "+String(sb),y=80)
RGBAdapt( \
R_Bias = 0.0, R_Gain = 1.0, R_Cont = 1.0, R_RPow = 1.0, R_Spow = sr, R_SPMid = 0.5, R_Pord = false, \
G_Bias = 0.0, G_Gain = 1.0, G_Cont = 1.0, G_RPow = 1.0, G_Spow = sg, G_SPMid = 0.5, G_Pord = false,\
B_Bias = 0.0, B_Gain = 1.0, B_Cont = 1.0, B_RPow = 1.0, B_Spow = sb, B_SPMid = 0.5, B_Pord = false)
""")
d1=c1.ScriptClip("""
r = RGBDifference(red3,neutre)
g = RGBDifference(green3,neutre)
b = RGBDifference(blue3,neutre)
dr = threshold - r
dg = threshold - g
db = threshold - b
sr = (dr < 0) ? 1+dr/100:1+dr/100
sg = (dg < 0) ? 1+dg/100:1+dg/100
sb = (db < 0) ? 1+db/100:1+db/100
RGBAdapt( \
R_Bias = 0.0, R_Gain = 1.0, R_Cont = 1.0, R_RPow = 0.9, R_Spow = sr, R_SPMid = 0.5, R_Pord = false, \
G_Bias = 0.0, G_Gain = 1.0, G_Cont = 1.0, G_RPow = 0.9, G_Spow = sg, G_SPMid = 0.5, G_Pord = false,\
B_Bias = 0.0, B_Gain = 1.0, B_Cont = 1.0, B_RPow = 0.9, B_Spow = sb, B_SPMid = 0.5, B_Pord = false)
""")
(info == 1) ? \
StackHorizontal(a.Subtitle("original"),b.Subtitle("linear curve"),c.Subtitle("Rpow curve"),d.Subtitle("Spow curve"),\
a.ConvertToYV12.ColorYUV(autowhite=true).Subtitle("AWB ColorYUV").ConvertToRGB32) : \
StackHorizontal(a.Subtitle("original"),b1.Subtitle("linear curve"),c1.Subtitle("Rpow curve"),d1.Subtitle("Spow curve"),\
a.ConvertToYV12.ColorYUV(autowhite=true).Subtitle("AWB ColorYUV").ConvertToRGB32)
Last edited by Bernardd; 24th May 2014 at 22:15. |
|
|
|
|
|
#4 | Link |
|
Registered User
Join Date: Jan 2012
Location: Toulon France
Posts: 252
|
Hello StainlessS,
After night, ideas are more light, thus i have written still my script for having more accordance with your great plugin. Code:
AVISource("C:\.......\video.avi")
LoadPlugin("C:\......\RGBAdapt_dll_v0.1-20140522\RGBAdapt.dll")
threshold = [<"threshold", 0, 255, 127>] # Middle ton for automatic white balance
strength_bias = [<"strength_bias", 0.1, 1.0, 0.5>] # Strength linear curve use
strength_Rpow = [<"Strength_Rpow", 0.1, 1.0, 0.8>] # Strength Rpow curve use
strength_Spow = [<"Strength_Spow", 0.1, 1.0, 1.0>] # Strength Spow curve use
ConvertToRGB32(matrix="Rec601")
a=last
neutre = BlankClip(a, pixel_type="RGB32", color=$000000)
#---------------------------------------- Linear curve b with info, b1 without info
red=a.ShowRed("RGB32")
green = a.ShowGreen("RGB32")
blue = a.ShowBlue("RGB32")
b=a.ScriptClip("""
#------------ RGB values calcul
r = RGBDifference(red,neutre)
g = RGBDifference(green,neutre)
b = RGBDifference(blue,neutre)
#----------- RGB correction calcul
dr = threshold - r
dg = threshold - g
db = threshold - b
#----------- RGB correction with linear curve calcul (Bias)
dr1 = dr*strength_bias
dg1 = dg*strength_bias
db1 = db*strength_bias
#----------- RGB correction with Rpow and Spow curves calcul
dr2 = dr-dr1
dg2 = dg-dg1
db2 = db-db1
#----------- RGB correction with Rpow curve calcul
yr = (dr2 < 0) ? (1+dr2/100)*strength_rpow:(1+dr2/100)*strength_rpow
yg = (dg2 < 0) ? (1+dg2/100)*strength_rpow:(1+dg2/100)*strength_rpow
yb = (db2 < 0) ? (1+db2/100)*strength_rpow:(1+db2/100)*strength_rpow
#----------- RGB correction with Spow curve calcul
sr = (dr2 < 0) ? (1+dr2/100)*strength_spow:(1+dr2/100)*strength_spow
sg = (dg2 < 0) ? (1+dg2/100)*strength_spow:(1+dg2/100)*strength_spow
sb = (db2 < 0) ? (1+db2/100)*strength_spow:(1+db2/100)*strength_spow
Subtitle("Red value : "+String(r)+"Bias : "+String(dr)+" Rpow : "+String(yr)+" Spow : "+String(sr),y=40)
Subtitle("Green value : "+String(b)+"Bias : "+String(dg)+" Rpow : "+String(yg)+" Spow : "+String(sg),y=60)
Subtitle("Blue value : "+String(b)+"Bias : "+String(db)+" Rpow : "+String(yb)+" Spow : "+String(sb), y=80)
RGBAdapt( \
R_Bias = dr1, R_Gain = 1.0, R_Cont = 1.0, R_RPow = yr, R_Spow = sr, R_SPMid = 0.5, R_Pord = false, \
G_Bias = dg1, G_Gain = 1.0, G_Cont = 1.0, G_RPow = yg, G_Spow = sg, G_SPMid = 0.5, G_Pord = false,\
B_Bias = db1, B_Gain = 1.0, B_Cont = 1.0, B_RPow = yb, B_Spow = sb, B_SPMid = 0.5, B_Pord = false)
""")
b1=a.ScriptClip("""
#------------ RGB values calcul
r = RGBDifference(red,neutre)
g = RGBDifference(green,neutre)
b = RGBDifference(blue,neutre)
#----------- RGB correction calcul
dr = threshold - r
dg = threshold - g
db = threshold - b
#----------- RGB correction with linear curve calcul (Bias)
dr1 = dr*strength_bias
dg1 = dg*strength_bias
db1 = db*strength_bias
#----------- RGB correction with Rpow and Spow curves calcul
dr2 = dr-dr1
dg2 = dg-dg1
db2 = db-db1
#----------- RGB correction with Rpow curve calcul
yr = (dr2 < 0) ? (1+dr2/100)*strength_rpow:(1+dr2/100)*strength_rpow
yg = (dg2 < 0) ? (1+dg2/100)*strength_rpow:(1+dg2/100)*strength_rpow
yb = (db2 < 0) ? (1+db2/100)*strength_rpow:(1+db2/100)*strength_rpow
#----------- RGB correction with Spow curve calcul
sr = (dr2 < 0) ? (1+dr2/100)*strength_spow:(1+dr2/100)*strength_spow
sg = (dg2 < 0) ? (1+dg2/100)*strength_spow:(1+dg2/100)*strength_spow
sb = (db2 < 0) ? (1+db2/100)*strength_spow:(1+db2/100)*strength_spow
sb = (db2 < 0) ? 1+db2/100:1+db2/100
RGBAdapt( \
R_Bias = dr1, R_Gain = 1.0, R_Cont = 1.0, R_RPow = yr, R_Spow = sr, R_SPMid = 0.5, R_Pord = false, \
G_Bias = dg1, G_Gain = 1.0, G_Cont = 1.0, G_RPow = yg, G_Spow = sg, G_SPMid = 0.5, G_Pord = false,\
B_Bias = db1, B_Gain = 1.0, B_Cont = 1.0, B_RPow = yb, B_Spow = sb, B_SPMid = 0.5, B_Pord = false)
""")
return StackHorizontal(a,b,b1)
Thanks Nice sunday |
|
|
|
|
|
#5 | Link |
|
Registered User
Join Date: Jan 2012
Location: Toulon France
Posts: 252
|
Hello StainlessS,
To day i have finished the automatic autowhite balance of RGBAdapt and i have written the automatic autowhite balance of CorlorYUV2. This two scripts below : Code:
#AVISource("C:\..........\video.avi")
LoadPlugin("C:\..........\RGBAdapt_dll_v0.1-20140522\RGBAdapt.dll")
threshold = [<"threshold", 0, 255, 128>] # Middle ton for automatic white balance
strength_bias = [<"strength_bias", 0.1, 1.0, 0.5>] # Strength linear curve use
cont = [<"cont", 1.00, 1.50, 1.15>] # Contrast, necessary after linear curve
strength_Rpow = [<"Strength_Rpow", 0.0, 1.0, 0.5>] # Strength Rpow curve use
strength_Spow = [<"Strength_Spow", 0.0, 1.0, 0.5>] # Strength Spow curve use
Spmid = [<"Spmid", 0.1, 0.99, 0.58>] # Middle point for Spow curve use
Pord_nb = [<"Pord_nb", 0, 1, 0>]
Pord = (Pord_nb == 0) ? false : true
show_info = [<"show_info", 0, 1, 0>]
comparison = [<"comparison", 0, 1, 0>]
original=last
ConvertToRGB32(matrix="Rec601")
neutre = BlankClip(last, pixel_type="RGB32", color=$000000)
red=ShowRed("RGB32")
green = ShowGreen("RGB32")
blue = ShowBlue("RGB32")
ScriptClip("""
#------------ RGB values calcul
r = RGBDifference(red,neutre)
g = RGBDifference(green,neutre)
b = RGBDifference(blue,neutre)
#----------- RGB correction calcul
dr = threshold - r
dg = threshold - g
db = threshold - b
#----------- RGB correction with linear curve calcul (Bias)
dr1 = dr*strength_bias
dg1 = dg*strength_bias
db1 = db*strength_bias
#----------- RGB correction with Rpow and Spow curves calcul
dr2 = dr-dr1
dg2 = dg-dg1
db2 = db-db1
#----------- RGB correction with Rpow curve calcul
yr = (dr2 < 0) ? 1+(dr2*0.9/128)*strength_rpow: 1+(dr2*3/128)*strength_rpow
yg = (dg2 < 0) ? 1+(dg2*0.9/128)*strength_rpow: 1+(dg2*3/128)*strength_rpow
yb = (db2 < 0) ? 1+(db2*0.9/128)*strength_rpow: 1+(db2*3/128)*strength_rpow
#~ yr = (dr2 < 0) ? (1+dr2/128)*strength_rpow:(1+dr2*Full_range)*strength_rpow
#~ yg = (dg2 < 0) ? (1+dg2/128)*strength_rpow:(1+dg2*Full_range)*strength_rpow
#~ yb = (db2 < 0) ? (1+db2/100)*strength_rpow:(1+db2*Full_range)*strength_rpow
#----------- RGB correction with Spow curve calcul
sr = (dr2 < 0) ? 1+(dr2*0.9/128)*strength_spow: 1+(dr2*3/128)*strength_spow
sg = (dg2 < 0) ? 1+(dg2*0.9/128)*strength_spow: 1+(dg2*3/128)*strength_spow
sb = (db2 < 0) ? 1+(db2*0.9/128)*strength_spow: 1+(db2*3/128)*strength_spow
(show_info == 0)? \
RGBAdapt( \
R_Bias = dr1, R_Gain = 1.0, R_Cont = cont, R_RPow = yr, R_Spow = sr, R_SPMid = Spmid, R_Pord = Pord, \
G_Bias = dg1, G_Gain = 1.0, G_Cont = cont, G_RPow = yg, G_Spow = sg, G_SPMid = Spmid, G_Pord = Pord,\
B_Bias = db1, B_Gain = 1.0, B_Cont = cont, B_RPow = yb, B_Spow = sb, B_SPMid = Spmid, B_Pord = Pord):\
RGBAdapt( \
R_Bias = dr1, R_Gain = 1.0, R_Cont = cont, R_RPow = yr, R_Spow = sr, R_SPMid = Spmid, R_Pord = Pord, \
G_Bias = dg1, G_Gain = 1.0, G_Cont = cont, G_RPow = yg, G_Spow = sg, G_SPMid = Spmid, G_Pord = Pord,\
B_Bias = db1, B_Gain = 1.0, B_Cont = cont, B_RPow = yb, B_Spow = sb, B_SPMid = Spmid, B_Pord = Pord)\
.Subtitle("Red value : "+String(r)+" Bias : "+String(dr1)+" Rpow : "+String(yr)+" Spow : "+String(sr),y=40)\
.Subtitle("Green value : "+String(b)+" Bias : "+String(dg1)+" Rpow : "+String(yg)+" Spow : "+String(sg),y=60)\
.Subtitle("Blue value : "+String(b)+" Bias : "+String(db1)+" Rpow : "+String(yb)+" Spow : "+String(sb), y=80)
""")
ConvertToYV12(matrix="Rec601")
(comparison == 0) ? last : StackHorizontal(original,last)
Code:
#AVISource("C:\............\video.avi")
LoadPlugin("C:\............\ColorYUV2_25_dll_20120529\ColorYUV2.dll")
threshold = [<"threshold", 0, 255, 127>] # Middle ton for automatic white balance
strength_bias = [<"strength_bias", 0.1, 1.0, 0.5>] # Strength linear curve use
cont = [<"cont", -20, 60, 51.1>]
strength_Rpow = [<"Strength_Rpow", 0.1, 1.0, 0.5>] # Strength Rpow curve use
strength_Spow = [<"Strength_Spow", 0.1, 1.0, 0.5>] # Strength Spow curve use
Pord = [<"Pord_nb", 0, 1, 0>]
show_info = [<"show_info", 0, 1, 0>]
comparison = [<"comparison", 0, 1, 0>]
original=last
ScriptClip("""
#------------ YUV average value
y = AverageLuma()
u = AverageChromaU()
v = AverageChromaV()
#----------- RGB correction calcul
dy = threshold - y
du = threshold - u
dv = threshold - v
#----------- RGB correction with linear curve calcul (Bias)
dy1 = dy*strength_bias
du1 = du*strength_bias
dv1 = dv*strength_bias
#----------- RGB correction with Rpow and Spow curves calcul
dy2 = dy-dy1
du2 = du-du1
dv2 = dv-dv1
#----------- RGB correction with Rpow curve calcul
yy = dy2*strength_rpow
yu = du2*strength_rpow
yv = dv2*strength_rpow
#----------- RGB correction with Spow curve calcul
sy = dy2*strength_spow
su = du2*strength_spow
sv = dv2*strength_spow
(show_info == 0)? \
ColorYUV2(\
off_y = dy1, cont_y = cont, rpow_y = yy, spow_y = sy, pord_y = pord,\
off_u = du1, rpow_u = yu, spow_u = su, pord_u = pord,\
off_v = dv1, rpow_v = yv, spow_v = sv, pord_v = pord):\
ColorYUV2(\
off_y = dy1, cont_y = cont, rpow_y = yy, spow_y = sy, pord_y = pord,\
off_u = du1, rpow_u = yu, spow_u = su, pord_u = pord,\
off_v = dv1, rpow_v = yv, spow_v = sv, pord_v = pord)\
.Subtitle("Luma value : "+String(y)+" Bias : "+String(dy)+" Rpow : "+String(yy)+" Spow : "+String(sy),y=40)\
.Subtitle("U value : "+String(u)+" Bias : "+String(du)+" Rpow : "+String(yu)+" Spow : "+String(su),y=60)\
.Subtitle("V value : "+String(v)+" Bias : "+String(dv)+" Rpow : "+String(yv)+" Spow : "+String(sv), y=80)
""")
(comparison == 0) ? last : StackHorizontal(original,last)
Thanks for this script and also for the graffers, with them we know that we are doing. |
|
|
|
|
|
#6 | Link |
|
HeartlessS Usurer
Join Date: Dec 2009
Location: Over the rainbow
Posts: 11,392
|
Glad that your keeping busy
![]() I'm busy myself at the moment, and dont have AVSPmod installed to try your scripts (I usually just use text editor and VDMod). If you want to look for ideas, maybe try search for AWB by Martin53 (he has not been around for a good time, told me he was on safari several months ago, hope those crocodiles did not get him).
__________________
I sometimes post sober. StainlessS@MediaFire ::: AND/OR ::: StainlessS@SendSpace "Some infinities are bigger than other infinities", but how many of them are infinitely bigger ??? |
|
|
|
|
|
#7 | Link |
|
Registered User
Join Date: Jan 2012
Location: Toulon France
Posts: 252
|
Hello StainlessS,
I do believe that automatic white balance can not give back natural colors, but only nearest. There are for film external args which give bad white balance, like sunset for example. Thus my aim is to improve few, ColorYUV automatic functions. Because sometime i get cold colors. With your graffer, i have understood that is because ColorYUV AutoWhite use only a bias correction with a linear curve. Thus i think your ColorYUV2 and RGBAdapt plugins should be more efficiency with rpow and spow curves. I think sunset light information is more readable in light tones, thus we do not must erase them in white balance action. Spow curve is good in this case. My scripts are not all automatic. I need to keep args to choice and tune strength of linear, rpow and spow curves actions. This scripts use only difference between 127 and each channel average value for automatic caculation. they are now operational, for ColorYUV2, i think is finished, for RGBAdapt i search still the best formula for Rpow and Spow inputs. In colorYUV2 these args input are linear, but in RGBAdapt, i smell a log input, but i have no found the good numbers. In the next version, i shall write my script in function style. I hope my search do not disturb you. Thanks |
|
|
|
|
|
#8 | Link |
|
HeartlessS Usurer
Join Date: Dec 2009
Location: Over the rainbow
Posts: 11,392
|
I think that ColorYUV AutoWhite just centers U and V using Off_u and off_v (but cant remember how it decides, maybe by pixel population).
EDIT Scratch that, probably AverageChromaU, AverageChromaV, ie make them center at 128. EDIT: Although I would suggest might be better only to do at most half way correction as above.
__________________
I sometimes post sober. StainlessS@MediaFire ::: AND/OR ::: StainlessS@SendSpace "Some infinities are bigger than other infinities", but how many of them are infinitely bigger ??? Last edited by StainlessS; 27th May 2014 at 22:35. |
|
|
|
|
|
#9 | Link |
|
Registered User
Join Date: Jan 2012
Location: Toulon France
Posts: 252
|
Hello StainlessS
Gavino have given me this autowhite coloryuv calculation in this post http://forum.doom9.org/showthread.ph...82#post1673682 But i think other formula is used for tune luma in autowhite. I do not find it, thus i have add contraste args in my two scripts. Below the two scripts in function style version. In the end, after instruction " __End__", i have save the script to call the function with AvsPmod Users Sliders. Code:
function RGBAdapt_auto(clip clip, int "threshold", \
float "strength_bias", float "cont", \
float "strength_rpow", float "strength_spow", float "spmid",bool "pord",\
bool "show_info", bool "comparison")
{
#----------------------------------------------based on RGBADapt plugin ------------------------------------------#
# script autor : StainlessS http://forum.doom9.org/showthread.php?p=1681286#post1681286 #
#------------------------------------------------------------------------------------------------------------------#
Assert(clip.IsRGB, "RGBAdapt-auto: source must be RGB")
global threshold = Default(threshold, 127) # channel value range center for calculation
global strength_bias = Default(strength_bias, 0.8) # linear curve use strength, between 0.0 and 1.0, default 0.5
global cont = Default(cont, 1.2) # adjust luma contrast, default 1.2
global strength_rpow = Default(strength_rpow,1.0) # Rpow curve use strength, between 0.0 and 4.0, default 1.0
global strength_spow = Default(strength_spow,1.0) # Spow curve use strength, between 0.0 and 4.0, default 1.0
global spmid = Default(spmid, 0.5) # Middle point for Spow curve use
global pord = Default(pord,false) # process Rpow curve before Spow curve or not (1), default 0
global show_info = Default(show_info, false) # show info or not, default false
comparison = Default(comparison, false) # show original vs processed comparison or not, default false
global neutre = BlankClip( clip,pixel_type="RGB32", color=$000000)
global red=ShowRed(clip,"RGB32")
global green = ShowGreen(clip,"RGB32")
global blue = ShowBlue(clip,"RGB32")
ScriptClip(clip, """
#------------ RGB values calcul
r = RGBDifference(red,neutre)
g = RGBDifference(green,neutre)
b = RGBDifference(blue,neutre)
#----------- RGB correction calcul
dr = threshold - r
dg = threshold - g
db = threshold - b
#----------- RGB correction with linear curve calcul (Bias)
dr1 = dr*strength_bias
dg1 = dg*strength_bias
db1 = db*strength_bias
#----------- RGB correction with Rpow and Spow curves calcul
dr2 = dr-dr1
dg2 = dg-dg1
db2 = db-db1
#----------- RGB correction with Rpow curve calcul
yr = exp((dr2/100)*strength_rpow)
yg = exp((dg2/100)*strength_rpow)
yb = exp((db2/100)*strength_rpow)
#----------- RGB correction with Spow curve calcul
sr = exp((dr2/100)*strength_spow)
sg = exp((dg2/100)*strength_spow)
sb = exp((db2/100)*strength_spow)
(show_info == false)? \
RGBAdapt( \
R_Bias = dr1, R_Gain = 1.0, R_Cont = cont, R_RPow = yr, R_Spow = sr, R_SPMid = spmid, R_Pord = pord, \
G_Bias = dg1, G_Gain = 1.0, G_Cont = cont, G_RPow = yg, G_Spow = sg, G_SPMid = spmid, G_Pord = pord,\
B_Bias = db1, B_Gain = 1.0, B_Cont = cont, B_RPow = yb, B_Spow = sb, B_SPMid = spmid, B_Pord = pord):\
RGBAdapt( \
R_Bias = dr1, R_Gain = 1.0, R_Cont = cont, R_RPow = yr, R_Spow = sr, R_SPMid = spmid, R_Pord = pord, \
G_Bias = dg1, G_Gain = 1.0, G_Cont = cont, G_RPow = yg, G_Spow = sg, G_SPMid = spmid, G_Pord = pord,\
B_Bias = db1, B_Gain = 1.0, B_Cont = cont, B_RPow = yb, B_Spow = sb, B_SPMid = spmid, B_Pord = pord)\
.Subtitle("Red value : "+String(r)+\
"\n Middle - Red Value : "+String(dr)+\
"\n Bias : "+String(dr1)+\
"\n Gamma and S correction base : "+String(dr2)+\
"\n Rpow : "+String(yr)+" Spow : "+String(sr),y=40,lsp=20)\
.Subtitle("Green value : "+String(b)+\
"\n Middle - Green Value : "+String(dg)+\
"\n Bias : "+String(dg1)+\
"\n Gamma and S correction base : "+String(dg2)+\
"\n Rpow : "+String(yg)+" Spow : "+String(sg),y=160,lsp=20)\
.Subtitle("Blue value : "+String(b)+\
"\n Middle - Blue Value : "+String(db)+\
"\n Bias : "+String(db1)+\
"\n Gamma and S correction base : "+String(db2)+\
"\n Rpow : "+String(yb)+" Spow : "+String(sb), y=280,lsp=20)
""")
(comparison == false) ? last : StackHorizontal(clip,last)
}
__End__
AVISource("C:\...............\video.avi")
LoadPlugin("C:\..........................\RGBAdapt_dll_v0.1-20140522\RGBAdapt.dll")
Import("C:\.............\RGBAdapt_auto.avsi")
threshold = [<"threshold", 0, 255, 127>]
strength_bias = [<"strength_bias", 0.0, 1.0, 0.5>]
cont = [<"cont", -3.0, 3.0, 1.2>]
strength_rpow = [<"Strength_rpow", 0.0, 4.0, 1.0>]
strength_spow = [<"Strength_spow", 0.0, 4.0, 1.0>]
spmid = [<"Spmid", 0.1, 0.99, 0.5>]
Pord_nb = [<"Pord", 0, 1, 1>]
pord = (Pord_nb == 0) ? false : true
show_info_nb = [<"show_info_nb", 0, 1, 0>]
show_info = (show_info_nb==0) ? false : true
comparison_nb = [<"comparison_nb", 0, 1, 0>]
comparison = (comparison_nb==0) ? false : true
ConvertToRGB32(matrix="Rec601")
RGBAdapt_auto(threshold = threshold, \
strength_bias = strength_bias, cont = cont, \
strength_rpow = strength_rpow, strength_spow = strength_spow, spmid = spmid, pord = pord,\
show_info = show_info, comparison = comparison)
ConvertToYV12(matrix="Rec601")
Code:
function ColorYUV2_auto(clip clip, \
bool "process_luma", int "threshold", \
float "strength_bias", float "cont", \
float "strength_Rpow", float "strength_Spow", int "pord",\
bool "show_info", bool "comparison")
{
#----------------------------------------------based on ColorYUV2 plugin ------------------------------------------- #
# script autor : StainlessS http://forum.doom9.org/showthread.php?p=1443313#post1443313 #
#--------------------------------------------------------------------------------------------------------------------#
global process_luma = Default(process_luma, true) # process or not the luma channel
global threshold = Default(threshold, 127) # channel value range center for calculation
global strength_bias = Default(strength_bias, 0.5) # linear curve use strength, between 0.0 and 1.0, default 0.5
global cont = Default(cont, 20.0) # adjust luma contrast, default 20.0
global strength_Rpow = Default(strength_Rpow,1.0) # Rpow curve use strength, between 0.0 and 4.0, default 1.0
global strength_Spow = Default(strength_Spow,1.0) # Spow curve use strength, between 0.0 and 4.0, default 1.0
global pord = Default(pord,0) # process Rpow curve before Spow curve or not (1), default 0
global show_info = Default(show_info, false) # show info or not, default false
comparison = Default(comparison, false) # show original vs processed comparison or not, default false
ScriptClip(clip, """
#------------ YUV average value
y = AverageLuma()
u = AverageChromaU()
v = AverageChromaV()
#----------- RGB correction calcul
dy = (process_luma == true) ? threshold - y : 0
du = threshold - u
dv = threshold - v
#----------- RGB correction with linear curve calcul (Bias)
dy1 = dy*strength_bias
du1 = du*strength_bias
dv1 = dv*strength_bias
#----------- RGB correction with Rpow and Spow curves calcul
dy2 = dy-dy1
du2 = du-du1
dv2 = dv-dv1
#----------- RGB correction with Rpow curve calcul
yy = dy2*strength_rpow
yu = du2*strength_rpow
yv = dv2*strength_rpow
#----------- RGB correction with Spow curve calcul
sy = dy2*strength_spow
su = du2*strength_spow
sv = dv2*strength_spow
(show_info == false)? \
ColorYUV2(\
off_y = dy1, cont_y = cont, rpow_y = yy, spow_y = sy, pord_y = pord,\
off_u = du1, rpow_u = yu, spow_u = su, pord_u = pord,\
off_v = dv1, rpow_v = yv, spow_v = sv, pord_v = pord):\
ColorYUV2(\
off_y = dy1, cont_y = cont, rpow_y = yy, spow_y = sy, pord_y = pord,\
off_u = du1, rpow_u = yu, spow_u = su, pord_u = pord,\
off_v = dv1, rpow_v = yv, spow_v = sv, pord_v = pord)\
.Subtitle("Luma value : "+String(y)+\
"\n Middle - Luma value : "+String(dy)+\
"\n Bias : "+String(dy1)+\
"\n Gamma and S correction base : "+String(dy2)+\
"\n Rpow : "+String(yy)+" Spow : "+String(sy),y=40,lsp=20)\
.Subtitle("U Chroma value : "+String(u)+\
"\n Middle - U Chroma value : "+String(du)+\
"\n Bias : "+String(du1)+\
"\n Gamma and S correction base : "+String(du2)+\
"\n Rpow : "+String(yu)+" Spow : "+String(su),y=160,lsp=20)\
.Subtitle("V value : "+String(v)+\
"\n Middle - V Chroma value : "+String(dv)+\
"\n Bias : "+String(dv1)+\
"\n Gamma and S correction base : "+String(dv2)+\
"\n Rpow : "+String(yv)+" Spow : "+String(sv),y=280,lsp=20)
""")
( comparison == false) ? last : StackHorizontal(clip,last)
}
__End__
AVISource("C:\..................\video.avi")
LoadPlugin("C:\..................\ColorYUV2_25_dll_20120529\ColorYUV2.dll")
Import("C:\...............\ColorYUV2 auto.avsi")
process_luma_nb = [<"process_luma_nb", 0, 1, 1>]
process_luma = (process_luma_nb==0) ? false : true
threshold = [<"threshold", 0, 255, 127>]
strength_bias = [<"strength_bias", 0.0, 1.0, 0.5>]
cont = [<"cont", -20, 60, 20.0>]
strength_Rpow = [<"Strength_Rpow", 0.0, 4.0, 0.0>]
strength_Spow = [<"Strength_Spow", 0.0, 4.0, 1.0>]
Pord = [<"Pord", 0, 1, 0>]
show_info_nb = [<"show_info_nb", 0, 1, 0>]
show_info = (show_info_nb==0) ? false : true
comparison_nb = [<"comparison_nb", 0, 1, 0>]
comparison = (comparison_nb==0) ? false : true
ColorYUV2_auto(last,process_luma=process_luma, threshold=threshold, \
strength_bias=strength_bias,cont=cont, \
strength_Rpow = strength_Rpow, strength_Spow=strength_Spow, pord=pord,\
show_info=show_info, comparison=comparison)
Thanks Last edited by Bernardd; 29th May 2014 at 00:34. |
|
|
|
|
|
#10 | Link |
|
HeartlessS Usurer
Join Date: Dec 2009
Location: Over the rainbow
Posts: 11,392
|
AutoWhite only adjust chroma U and V, (to 127 as Gavino said, I mistakenly said 128), luma is not touched by it.
AutoGain modifies the Luma Channel.
__________________
I sometimes post sober. StainlessS@MediaFire ::: AND/OR ::: StainlessS@SendSpace "Some infinities are bigger than other infinities", but how many of them are infinitely bigger ??? |
|
|
|
|
|
#11 | Link |
|
Registered User
Join Date: Jan 2012
Location: Toulon France
Posts: 252
|
Hi !
I have observed your ColorYUV2 source and i have written an autogain tunable function. The new script version is there : Code:
function ColorYUV2_auto(clip clip, int "threshold", float "strength_bias",float "strength_Rpow", float "strength_Spow", int "pord",\
bool "autogain", float "luma_threshold",\
bool "show_info", bool "comparison")
{
#----------------------------------------------based on ColorYUV2 plugin ---------------------------------------------------------------------#
# script autor : StainlessS http://forum.doom9.org/showthread.php?p=1443313#post1443313 #
#------------------------------------------------------------------------------------------------------------------------------------------------- #
global threshold = Default(threshold, 127) # channel value range center for calculation
global strength_bias = Default(strength_bias, 0.8) # linear curve use strength, between 0.0 and 1.0, default 0.5
global strength_Rpow = Default(strength_Rpow,1.0) # Rpow curve use strength, between 0.0 and 4.0, default 1.0
global strength_Spow = Default(strength_Spow,1.0) # Spow curve use strength, between 0.0 and 4.0, default 1.0
global pord = Default(pord,1) # process Rpow curve before Spow curve or not (1), default 0
global autogain = Default(autogain, false)
global luma_threshold = Default(luma_threshold, 0.35) # channel value range center for calculation
global show_info = Default(show_info, false) # show info or not, default false
comparison = Default(comparison, false) # show original vs processed comparison or not, default false
ScriptClip(clip, """
#--------------------------------------------
# Autowhite process
#--------------------------------------------
#------------ UV average values
u = AverageChromaU()
v = AverageChromaV()
#----------- UV corrections calculation
du = threshold - u
dv = threshold - v
#----------- UV corrections with linear curve calculation (Offset)
du1 = du*strength_bias
dv1 = dv*strength_bias
#----------- UV corrections range with Rpow and Spow curves calculation
du2 = du-du1
dv2 = dv-dv1
#----------- UV corrections with Rpow curve calculation
ru = du2*strength_rpow
rv = dv2*strength_rpow
#----------- UV corrections with Spow curve calculation
su = du2*strength_spow
sv = dv2*strength_spow
#--------------------------------------------
# Autogain process
#--------------------------------------------
#------------ Y max and min values
y_max_value = float(YPlaneMax(threshold = luma_threshold))
y_max = min (y_max_value, 236)
y_min_value = float(YPlaneMin(threshold = luma_threshold))
y_min = max (16, y_min_value)
#----------- Y gain correction calculation
f = (autogain == true) ? float(220/(y_max - y_min)) : 1
gy = 256*f-256
#----------- Y offset correction calculation
new_y_max = y_max * f # only for display
new_y_min = y_min * f
dy = (autogain == true) ? 16 - new_y_min : 0
(show_info == false) ? \
ColorYUV2(\
gain_y = gy, off_y = dy,\
off_u = du1, rpow_u = ru, spow_u = su, pord_u = pord,\
off_v = dv1, rpow_v = rv, spow_v = sv, pord_v = pord)\
:\
ColorYUV2(\
gain_y = gy, off_y = dy,\
off_u = du1, rpow_u = ru, spow_u = su, pord_u = pord,\
off_v = dv1, rpow_v = rv, spow_v = sv, pord_v = pord)\
.Subtitle(" U Chroma value : "+String(u)+"\n"+\
" Middle - U Chroma value : "+String(du)+"\n"+\
" Bias : "+String(du1)+"\n"+\
" Gamma and S correction base : "+String(du2)+"\n"+\
" Rpow : "+String(ru)+" Spow : "+String(su),y=40,lsp=20)\
.Subtitle(" V value : "+String(v)+"\n"+\
" Middle - V Chroma value : "+String(dv)+"\n"+\
" Bias : "+String(dv1)+"\n"+\
" Gamma and S correction base : "+String(dv2)+"\n"+\
" Rpow : "+String(rv)+" Spow : "+String(sv),y=160,lsp=20)\
.Subtitle(" Y max : "+String(y_max)+" Y min : "+String(y_min)+" Luma_Threshold : "+String(luma_threshold)+"\n"+\
" Y factor : "+String(f)+" Y gain : "+String(gy)+" Y offset : "+String(dy)+"\n"+\
" New Y max : "+String(new_y_max + dy)+" New Y min : "+String(new_y_min + dy),y=280,lsp=20)
""")
( comparison == false) ? last : StackHorizontal(clip,last)
}
__End__
# Below, call script with AvsPmod user sliders
AVISource("C:\......................\video.avi")
LoadPlugin("C:\...................\ColorYUV2_25_dll_20120529\ColorYUV2.dll")
Import("C:\.................\ColorYUV2 auto.avs")
[<separator = "AWB tunning args">]
[<separator = "No AWB is strength_bias = strength_rpow = strength_spow = 0">]
threshold = [<"threshold", 0, 255, 127>]
strength_bias = [<"strength_bias", 0.0, 1.0, 0.8>]
strength_Rpow = [<"strength_Rpow", 0.0, 4.0, 1.0>]
strength_Spow = [<"strength_Spow", 0.0, 4.0, 1.0>]
Pord = [<"Pord", 0, 1, 1>]
[<separator = "Autogain tunning args">]
autogain_nb = [<"autogain_nb", 0, 1, 0>]
luma_threshold = [<"Luma_threshold", 0.00, 1.00, 0.35>]
autogain = (autogain_nb == 0) ? false : true
[<separator = "Output choice">]
show_info_nb = [<"show_info_nb", 0, 1, 0>]
show_info = (show_info_nb==0) ? false : true
comparison_nb = [<"comparison_nb", 0, 1, 0>]
comparison = (comparison_nb==0) ? false : true
ColorYUV2_auto(last, threshold=threshold, strength_bias=strength_bias, strength_Rpow = \
strength_Rpow, strength_Spow=strength_Spow, pord=pord,\
autogain = autogain, Luma_threshold = luma_threshold,\
show_info=show_info, comparison=comparison)
When autogain is too strong with overbound light i can now decrease threshold for best result. But i have two questions. first Do you know if in basic autogain coloryuv function, is it a threshold for selected luma (threshold nearest 0.3) ? secund In my script i must define variables like global to enable their use in ScriptClip. Thus whit short script like this, only the args for the second call function is use. a=ColorYUV2_auto(show_info=true) b=ColorYUV2_auto(show_info=false) StackHorizontal(a,b) Have you a tips ? |
|
|
|
|
|
#12 | Link | |
|
Avisynth language lover
Join Date: Dec 2007
Location: Spain
Posts: 3,442
|
Quote:
It replaces the built-in run-time filters (ScriptClip, etc) with extended versions that have a couple of extra arguments, providing (among other things) a simple, natural and robust way to pass local variables into a run-time script from 'outside'. For more details, see the description of the args parameter in the GRunT thread (and the supplied doc), which should hopefully tell you all you need to know. |
|
|
|
|
|
|
#13 | Link |
|
HeartlessS Usurer
Join Date: Dec 2009
Location: Over the rainbow
Posts: 11,392
|
As Gavino says above, use Grunt for args, much nicer than standard Scriptclip.
Should this not be 235(as per rec601 Luma max) Code:
y_max = min (y_max_value, 236) Not sure about this line [Should 220 be 219 (235-16)] Code:
f = (autogain == true) ? float(220/(y_max - y_min)) : 1 Code:
f = (autogain == true) ? 219.0/(y_max - y_min) : 1.0 you will sometimes have Int and Sometimes float, with unexpected consequences.
__________________
I sometimes post sober. StainlessS@MediaFire ::: AND/OR ::: StainlessS@SendSpace "Some infinities are bigger than other infinities", but how many of them are infinitely bigger ??? |
|
|
|
|
|
#14 | Link |
|
Registered User
Join Date: Jan 2012
Location: Toulon France
Posts: 252
|
StainlessS, Gavino,
Thousand thanks, your plugins are great. I have written my script one more once. For ColorYUV2, i think auto white balance and autogain have a sense. With rpow and spow args, the result is less flat than a coloryuv use. I can keep the sunset light. Code:
function ColorYUV2_auto(clip clip, int "threshold", float "strength_bias",float "strength_Rpow", float "strength_Spow", int "pord",\
bool "autogain", float "luma_threshold",\
bool "show_info", bool "comparison")
{
#----------------------------------------------based on ColorYUV2 plugin ---------------------------------------------------------------------#
# script autor : StainlessS http://forum.doom9.org/showthread.php?p=1443313#post1443313 #
#------------------------------------------------------------------------------------------------------------------------------------------------- #
#---------------------------------------------- need GRunT plugin ----------------------------------------------------------------------------#
# script autor : Gavino http://forum.doom9.org/showthread.php?p=1157083#post1157083 #
#------------------------------------------------------------------------------------------------------------------------------------------------- #
threshold = Default(threshold, 127) # channel value range center for calculation
strength_bias = Default(strength_bias, 0.8) # linear curve use strength, between 0.0 and 1.0, default 0.5
strength_Rpow = Default(strength_Rpow,1.0) # Rpow curve use strength, between 0.0 and 4.0, default 1.0
strength_Spow = Default(strength_Spow,1.0) # Spow curve use strength, between 0.0 and 4.0, default 1.0
pord = Default(pord,1) # process Rpow curve before Spow curve or not (1), default 0
autogain = Default(autogain, false)
luma_threshold = Default(luma_threshold, 0.35) # channel value range center for calculation
show_info = Default(show_info, false) # show info or not, default false
comparison = Default(comparison, false) # show original vs processed comparison or not, default false
ScriptClip(clip, """
#--------------------------------------------
# Autowhite process
#--------------------------------------------
#------------ UV average values
u = AverageChromaU()
v = AverageChromaV()
#----------- UV corrections calculation
du = threshold - u
dv = threshold - v
#----------- UV corrections with linear curve calculation (Offset)
du1 = du*strength_bias
dv1 = dv*strength_bias
#----------- UV corrections range with Rpow and Spow curves calculation
du2 = du-du1
dv2 = dv-dv1
#----------- UV corrections with Rpow curve calculation
ru = du2*strength_rpow
rv = dv2*strength_rpow
#----------- UV corrections with Spow curve calculation
su = du2*strength_spow
sv = dv2*strength_spow
#--------------------------------------------
# Autogain process
#--------------------------------------------
#------------ Y max and min values
y_max_value = float(YPlaneMax(threshold = luma_threshold))
y_max = min (y_max_value, 235.0)
y_min_value = float(YPlaneMin(threshold = luma_threshold))
y_min = max (16.0, y_min_value)
#----------- Y gain correction calculation
f = (autogain == true) ? float(219.0/(y_max - y_min)) : 1.0
gy = 256.0*f-256.0
#----------- Y offset correction calculation
new_y_max = y_max * f # only for display
new_y_min = y_min * f
dy = (autogain == true) ? 16.0 - new_y_min : 0.0
(show_info == false) ? \
ColorYUV2(\
gain_y = gy, off_y = dy,\
off_u = du1, rpow_u = ru, spow_u = su, pord_u = pord,\
off_v = dv1, rpow_v = rv, spow_v = sv, pord_v = pord)\
:\
ColorYUV2(\
gain_y = gy, off_y = dy,\
off_u = du1, rpow_u = ru, spow_u = su, pord_u = pord,\
off_v = dv1, rpow_v = rv, spow_v = sv, pord_v = pord)\
.Subtitle(" U Chroma value : "+String(u)+"\n"+\
" Middle - U Chroma value : "+String(du)+"\n"+\
" Bias : "+String(du1)+"\n"+\
" Gamma and S correction base : "+String(du2)+"\n"+\
" Rpow : "+String(ru)+" Spow : "+String(su),y=40,lsp=20)\
.Subtitle(" V value : "+String(v)+"\n"+\
" Middle - V Chroma value : "+String(dv)+"\n"+\
" Bias : "+String(dv1)+"\n"+\
" Gamma and S correction base : "+String(dv2)+"\n"+\
" Rpow : "+String(rv)+" Spow : "+String(sv),y=160,lsp=20)\
.Subtitle(" Y max : "+String(y_max)+" Y min : "+String(y_min)+" Luma_Threshold : "+String(luma_threshold)+"\n"+\
" Y factor : "+String(f)+" Y gain : "+String(gy)+" Y offset : "+String(dy)+"\n"+\
" New Y max : "+String(new_y_max + dy)+" New Y min : "+String(new_y_min + dy),y=280,lsp=20)
""", args = "threshold, strength_bias, strength_rpow, strength_spow, pord, autogain, luma_threshold, show_info")
( comparison == false) ? last : StackHorizontal(clip,last)
}
is a part for luma datas. I have not found ideas to separate efficiently luma and chroma before apply auto white balance. But like this rule give some results with a good look, i have converted my script in help script for manual white balance. The script propose a white balance start for manual search. Code:
function RGBAdapt_half_auto(clip clip, \
float "R_bias_manu", float "R_gain", float "R_cont", float "R_rpow_manu", float "R_spow_manu", float "R_spmid", bool "R_pord",\
float "G_bias_manu", float "G_gain", float "G_cont", float "G_rpow_manu", float "G_spow_manu", float "G_spmid", bool "G_pord",\
float "B_bias_manu", float "B_gain", float "B_cont", float "B_rpow_manu", float "B_spow_manu", float "B_spmid", bool "B_pord",\
int "threshold", float "strength_bias", float "strength_rpow", float "strength_spow",\
bool "show_info", bool "comparison")
{
#----------------------------------------------based on RGBADapt plugin ---------------------------------------------------------------------#
# script autor : StainlessS http://forum.doom9.org/showthread.php?p=1681286#post1681286 #
#------------------------------------------------------------------------------------------------------------------------------------------------- #
#---------------------------------------------- need GRunT plugin ----------------------------------------------------------------------------#
# script autor : Gavino http://forum.doom9.org/showthread.php?p=1157083#post1157083 #
#------------------------------------------------------------------------------------------------------------------------------------------------- #
Assert(clip.IsRGB, "RGBAdapt-auto: source must be RGB")
R_bias_manu = Default(R_bias_manu, 0) # same range with original R_bias args
G_bias_manu = Default(G_bias_manu, 0) # same range with original G_bias args
B_bias_manu = Default(B_bias_manu, 0) # same range with original B_bias args
R_gain = Default(R_gain, 1) # It is original R_gain args, range -8 to 8 center 1.0
G_gain = Default(G_gain, 1) # It is original G_gain args, range -8 to 8 center 1.0
B_gain = Default(B_gain, 1) # It is original B_gain args, range -8 to 8 center 1.0
R_cont = Default(R_cont, 1) # It is original R_cont args, range -8 to 8 center 1.0
G_cont = Default(G_cont, 1) # It is original G_cont args, range -8 to 8 center 1.0
B_cont = Default(B_cont, 1) # It is original B_cont args, range -8 to 8 center 1.0
R_rpow_manu = Default(R_rpow_manu, 0) # range -0.8 to 3.0 center 0 (original R_rpow range 0.1 to 4.0 center 1.0)
G_rpow_manu = Default(G_rpow_manu, 0) # range -0.8 to 3.0 center 0 (original G_rpow range 0.1 to 4.0 center 1.0)
B_rpow_manu = Default(B_rpow_manu, 0) # range -0.8 to 3.0 center 0 (original B_rpow range 0.1 to 4.0 center 1.0)
R_spow_manu = Default(R_spow_manu, 0) # range -0.8 to 3.0 center 0 (original R_spow range 0.1 to 4.0 center 1.0)
G_spow_manu = Default(G_spow_manu, 0) # range -0.8 to 3.0 center 0 (original G_spow range 0.1 to 4.0 center 1.0)
B_spow_manu = Default(B_spow_manu, 0) # range -0.8 to 3.0 center 0 (original B_spow range 0.1 to 4.0 center 1.0)
R_spmid = Default(R_spmid, 0.5) # It is original R_spmid args, range 0.1 to 0.99 center 0.5
G_spmid = Default(G_spmid, 0.5) # It is original G_spmid args, range 0.1 to 0.99 center 0.5
B_spmid = Default(B_spmid, 0.5) # It is original B_spmid args, range 0.1 to 0.99 center 0.5
R_pord = Default(R_pord, false) # It is original R_pord args
G_pord = Default(G_pord, false) # It is original G_pord args
B_pord = Default(B_pord, false) # It is original B_pord args
threshold = Default(threshold, 127) # channel value range center for calculation
strength_bias = Default(strength_bias, 0.8) # linear curve use strength, between 0.0 and 1.0, default 0.5
strength_rpow = Default(strength_rpow,1.0) # Rpow curve use strength, between 0.0 and 4.0, default 1.0
strength_spow = Default(strength_spow,1.0) # Spow curve use strength, between 0.0 and 4.0, default 1.0
show_info = Default(show_info, false) # show info or not, default false
comparison = Default(comparison, false) # show original vs processed comparison or not, default false
neutre = BlankClip( clip,pixel_type="RGB32", color=$000000)
red=ShowRed(clip,"RGB32")
green = ShowGreen(clip,"RGB32")
blue = ShowBlue(clip,"RGB32")
ScriptClip(clip, """
#------------ RGB values calcul
r = RGBDifference(red,neutre)
g = RGBDifference(green,neutre)
b = RGBDifference(blue,neutre)
#----------- RGB correction calcul
dr = threshold - r
dg = threshold - g
db = threshold - b
#----------- RGB correction with linear curve calcul (Bias)
dr1 = dr*strength_bias + R_bias_manu
dg1 = dg*strength_bias + G_bias_manu
db1 = db*strength_bias + G_bias_manu
#----------- RGB correction with Rpow and Spow curves calcul
dr2 = dr-dr1
dg2 = dg-dg1
db2 = db-db1
#----------- RGB correction with Rpow curve calcul
yr = exp((dr2/100)*strength_rpow) + R_Rpow_manu
yg = exp((dg2/100)*strength_rpow) + G_Rpow_manu
yb = exp((db2/100)*strength_rpow) + B_Rpow_manu
#----------- RGB correction with Spow curve calcul
sr = exp((dr2/100)*strength_spow) + R_spow_manu
sg = exp((dg2/100)*strength_spow) + G_spow_manu
sb = exp((db2/100)*strength_spow) + B_spow_manu
(show_info == false)? \
RGBAdapt( \
R_Bias = dr1, R_Gain = R_gain, R_Cont = R_cont, R_RPow = yr, R_Spow = sr, R_SPMid = R_spmid, R_Pord = R_pord, \
G_Bias = dg1, G_Gain = G_gain, G_Cont = G_cont, G_RPow = yg, G_Spow = sg, G_SPMid = G_spmid, G_Pord = G_pord,\
B_Bias = db1, B_Gain = B_gain, B_Cont = B_cont, B_RPow = yb, B_Spow = sb, B_SPMid = B_spmid, B_Pord = B_pord):\
RGBAdapt( \
R_Bias = dr1, R_Gain = R_gain, R_Cont = R_cont, R_RPow = yr, R_Spow = sr, R_SPMid = R_spmid, R_Pord = R_pord, \
G_Bias = dg1, G_Gain = G_gain, G_Cont = G_cont, G_RPow = yg, G_Spow = sg, G_SPMid = G_spmid, G_Pord = G_pord,\
B_Bias = db1, B_Gain = B_gain, B_Cont = B_cont, B_RPow = yb, B_Spow = sb, B_SPMid = B_spmid, B_Pord = B_pord)\
.Subtitle("Red value : "+String(r)+\
"\n Middle - Red Value : "+String(dr)+\
"\n Bias : "+String(dr1)+\
"\n Gamma and S correction base : "+String(dr2)+\
"\n Rpow : "+String(yr)+" Spow : "+String(sr),y=40,lsp=20)\
.Subtitle("Green value : "+String(g)+\
"\n Middle - Green Value : "+String(dg)+\
"\n Bias : "+String(dg1)+\
"\n Gamma and S correction base : "+String(dg2)+\
"\n Rpow : "+String(yg)+" Spow : "+String(sg),y=160,lsp=20)\
.Subtitle("Blue value : "+String(b)+\
"\n Middle - Blue Value : "+String(db)+\
"\n Bias : "+String(db1)+\
"\n Gamma and S correction base : "+String(db2)+\
"\n Rpow : "+String(yb)+" Spow : "+String(sb), y=280,lsp=20)
""", args = "R_bias_manu, R_gain, R_cont, R_rpow_manu, R_spow_manu, R_spmid, R_pord," +\
"G_bias_manu, G_gain, G_cont, G_rpow_manu, G_spow_manu, G_spmid, G_pord,"+\
"B_bias_manu, B_gain, B_cont, B_rpow_manu, B_spow_manu, B_spmid, B_pord,"+\
"neutre, red, green, blue,"+\
"threshold, strength_bias, strength_rpow, strength_spow, show_info")
(comparison == false) ? last : StackHorizontal(clip,last)
}
|
|
|
|
|
|
#15 | Link |
|
HeartlessS Usurer
Join Date: Dec 2009
Location: Over the rainbow
Posts: 11,392
|
For RGB, I suggest take a peek at VirtualDub plugin 'White Balance' source by Jim Leonard,
I think I examined this about 8 maybe 10 years ago, think it got the highest frame pixel value of R, G and B, and made them the same (adding difference to all pixels of adjusted channels), and then did 'Top relative contrast' on the channels that had to be changed.
__________________
I sometimes post sober. StainlessS@MediaFire ::: AND/OR ::: StainlessS@SendSpace "Some infinities are bigger than other infinities", but how many of them are infinitely bigger ??? Last edited by StainlessS; 3rd June 2014 at 22:33. |
|
|
|
|
|
#16 | Link |
|
Registered User
Join Date: Jan 2012
Location: Toulon France
Posts: 252
|
Hello StainlessS,
I cannot apply your proposal because i do not get the highest frame pixel value. Avisynth runtime function give only RGB difference. It is the limit of my process. I think that my RGBAdapt_half_auto script (last version below) is a lab script, a little help for manual white balance search. Code:
function RGBAdapt_half_auto(clip clip, bool "same",\
float "R_gain", float "R_cont", float "R_spmid", bool "R_pord",\
float "G_gain", float "G_cont", float "G_spmid", bool "G_pord",\
float "B_gain", float "B_cont", float "B_spmid", bool "B_pord",\
float "Gain", float "Cont", float "Spmid", bool "Pord",\
int "threshold", float "strength_bias", float "strength_rpow", float "strength_spow",\
bool "show_info", bool "comparison")
{
#----------------------------------------------based on RGBADapt plugin ---------------------------------------------------------------------#
# script autor : StainlessS http://forum.doom9.org/showthread.php?p=1681286#post1681286 #
#------------------------------------------------------------------------------------------------------------------------------------------------- #
#---------------------------------------------- need GRunT plugin ----------------------------------------------------------------------------#
# script autor : Gavino http://forum.doom9.org/showthread.php?p=1157083#post1157083 #
#------------------------------------------------------------------------------------------------------------------------------------------------- #
Assert(clip.IsRGB, "RGBAdapt-auto: source must be RGB")
same = Default(same,false) # same correction in the three channels
R_gain = Default(R_gain, 1) # It is original R_gain args, range -8 to 8 center 1.0
G_gain = Default(G_gain, 1) # It is original G_gain args, range -8 to 8 center 1.0
B_gain = Default(B_gain, 1) # It is original B_gain args, range -8 to 8 center 1.0
Gain = Default(Gain, 0) # same range with original gain args
R_Gain = (same == false) ? R_Gain : Gain
G_Gain = (same == false) ? G_Gain : Gain
B_Gain = (same == false) ? B_Gain : Gain
R_cont = Default(R_cont, 1) # It is original R_cont args, range -8 to 8 center 1.0
G_cont = Default(G_cont, 1) # It is original G_cont args, range -8 to 8 center 1.0
B_cont = Default(B_cont, 1) # It is original B_cont args, range -8 to 8 center 1.0
Cont = Default(Cont, 0) # same range with original cont args
R_Cont = (same == false) ? R_Cont : Cont
G_Cont = (same == false) ? G_Cont : Cont
B_Cont = (same == false) ? B_Cont : Cont
R_spmid = Default(R_spmid, 0.5) # It is original R_spmid args, range 0.1 to 0.99 center 0.5
G_spmid = Default(G_spmid, 0.5) # It is original G_spmid args, range 0.1 to 0.99 center 0.5
B_spmid = Default(B_spmid, 0.5) # It is original B_spmid args, range 0.1 to 0.99 center 0.5
Spmid = Default(Spmid, 0) # same range with original Spmid args
R_spmid = (same == false) ? R_spmid : Spmid
G_spmid = (same == false) ? G_spmid : Spmid
B_spmid = (same == false) ? B_spmid : Spmid
R_pord = Default(R_pord, false) # It is original R_pord args
G_pord = Default(G_pord, false) # It is original G_pord args
B_pord = Default(B_pord, false) # It is original B_pord args
Pord = Default(Pord, 0) # same range with original Pord args
R_pord = (same == false) ? R_pord : Pord
G_pord = (same == false) ? G_pord : Pord
B_pord = (same == false) ? B_pord : Pord
threshold = Default(threshold, 127) # channel value range center for calculation
strength_bias = Default(strength_bias, 0.8) # linear curve use strength, between 0.0 and 1.0, default 0.5
strength_rpow = Default(strength_rpow,1.0) # Rpow curve use strength, between 0.0 and 4.0, default 1.0
strength_spow = Default(strength_spow,1.0) # Spow curve use strength, between 0.0 and 4.0, default 1.0
show_info = Default(show_info, false) # show info or not, default false
comparison = Default(comparison, false) # show original vs processed comparison or not, default false
neutre = BlankClip( clip,pixel_type="RGB32", color=$000000)
red=ShowRed(clip,"RGB32")
green = ShowGreen(clip,"RGB32")
blue = ShowBlue(clip,"RGB32")
ScriptClip(clip, """
#------------ RGB values calcul
r = RGBDifference(red,neutre)
g = RGBDifference(green,neutre)
b = RGBDifference(blue,neutre)
#----------- RGB correction calcul
dr = threshold - r
dg = threshold - g
db = threshold - b
#----------- RGB correction with linear curve calcul (Bias)
dr1 = dr*strength_bias
dg1 = dg*strength_bias
db1 = db*strength_bias
#----------- RGB correction with Rpow and Spow curves calcul
dr2 = dr-dr1
dg2 = dg-dg1
db2 = db-db1
#----------- RGB correction with Rpow curve calcul
yr = exp((dr2/100)*strength_rpow)
yg = exp((dg2/100)*strength_rpow)
yb = exp((db2/100)*strength_rpow)
#----------- RGB correction with Spow curve calcul
sr = exp((dr2/100)*strength_spow)
sg = exp((dg2/100)*strength_spow)
sb = exp((db2/100)*strength_spow)
(show_info == false)? \
RGBAdapt( \
R_Bias = dr1, R_Gain = R_gain, R_Cont = R_cont, R_RPow = yr, R_Spow = sr, R_SPMid = R_spmid, R_Pord = R_pord, \
G_Bias = dg1, G_Gain = G_gain, G_Cont = G_cont, G_RPow = yg, G_Spow = sg, G_SPMid = G_spmid, G_Pord = G_pord,\
B_Bias = db1, B_Gain = B_gain, B_Cont = B_cont, B_RPow = yb, B_Spow = sb, B_SPMid = B_spmid, B_Pord = B_pord):\
RGBAdapt( \
R_Bias = dr1, R_Gain = R_gain, R_Cont = R_cont, R_RPow = yr, R_Spow = sr, R_SPMid = R_spmid, R_Pord = R_pord, \
G_Bias = dg1, G_Gain = G_gain, G_Cont = G_cont, G_RPow = yg, G_Spow = sg, G_SPMid = G_spmid, G_Pord = G_pord,\
B_Bias = db1, B_Gain = B_gain, B_Cont = B_cont, B_RPow = yb, B_Spow = sb, B_SPMid = B_spmid, B_Pord = B_pord)\
.Subtitle("Red value : "+String(r)+\
"\n Middle - Red Value : "+String(dr)+\
"\n Bias : "+String(dr1)+\
"\n Gamma and S correction base : "+String(dr2)+\
"\n Rpow : "+String(yr)+" Spow : "+String(sr),y=40,lsp=20)\
.Subtitle("Green value : "+String(g)+\
"\n Middle - Green Value : "+String(dg)+\
"\n Bias : "+String(dg1)+\
"\n Gamma and S correction base : "+String(dg2)+\
"\n Rpow : "+String(yg)+" Spow : "+String(sg),y=160,lsp=20)\
.Subtitle("Blue value : "+String(b)+\
"\n Middle - Blue Value : "+String(db)+\
"\n Bias : "+String(db1)+\
"\n Gamma and S correction base : "+String(db2)+\
"\n Rpow : "+String(yb)+" Spow : "+String(sb), y=280,lsp=20)
""", args = "R_gain, R_cont,R_spmid, R_pord," +\
"G_gain, G_cont, G_spmid, G_pord,"+\
"B_gain, B_cont, B_spmid, B_pord,"+\
"Gain, Cont, Spmid, Pord, same,"+\
"neutre, red, green, blue,"+\
"threshold, strength_bias, strength_rpow, strength_spow, show_info")
(comparison == false) ? last : StackHorizontal(clip,last)
}
is too weak. Code:
function ColorYUV2_auto(clip clip, float "strength_bias",float "strength_Rpow", float "strength_Spow", int "pord",\
bool "autogain", float "luma_threshold", bool "show_info", bool "comparison")
{
#----------------------------------------------based on ColorYUV2 plugin ---------------------------------------------------------------------#
# script autor : StainlessS http://forum.doom9.org/showthread.php?p=1443313#post1443313 #
#------------------------------------------------------------------------------------------------------------------------------------------------- #
#---------------------------------------------- need GRunT plugin ----------------------------------------------------------------------------#
# script autor : Gavino http://forum.doom9.org/showthread.php?p=1157083#post1157083 #
#------------------------------------------------------------------------------------------------------------------------------------------------- #
strength_bias = Default(strength_bias, 0.5) # linear curve use strength, between 0.0 and 1.0, default 0.5
strength_Rpow = Default(strength_Rpow,1.0) # Rpow curve use strength, between 0.0 and 4.0, default 1.0
strength_Spow = Default(strength_Spow,1.0) # Spow curve use strength, between 0.0 and 4.0, default 1.0
pord = Default(pord,1) # process Rpow curve before Spow curve or not (1), default 0
autogain = Default(autogain, false)
luma_threshold = Default(luma_threshold, 0.50) # selected luma value percentage for calculation, too weak can be cause of light flicker
show_info = Default(show_info, false) # show info or not, default false
comparison = Default(comparison, false) # show original vs processed comparison or not, default false
ScriptClip(clip, """
#--------------------------------------------
# Autowhite process
#--------------------------------------------
#------------ UV average values
u = AverageChromaU()
v = AverageChromaV()
#----------- UV corrections calculation
du = 127.0 - u
dv = 127.0 - v
#----------- UV corrections with linear curve calculation (Offset)
du1 = du*strength_bias
dv1 = dv*strength_bias
#----------- UV corrections range with Rpow and Spow curves calculation
du2 = du-du1
dv2 = dv-dv1
#----------- UV corrections with Rpow curve calculation
ru = du2*strength_rpow
rv = dv2*strength_rpow
#----------- UV corrections with Spow curve calculation
su = du2*strength_spow
sv = dv2*strength_spow
#--------------------------------------------
# autogain process
#--------------------------------------------
#------------ Y max and min values
y_max_value = float(YPlaneMax(threshold = luma_threshold))
y_max = min (y_max_value, 235.0)
y_min_value = float(YPlaneMin(threshold = luma_threshold))
y_min = max (16.0, y_min_value)
#----------- Y gain correction calculation
f = (autogain == true) ? float(219.0/(y_max - y_min)) : 1.0
gy = 256.0*f-256.0
#----------- Y offset correction calculation
new_y_max = y_max * f # only for display
new_y_min = y_min * f
dy = (autogain == true) ? 16.0 - new_y_min : 0.0
(show_info == false) ? \
ColorYUV2(\
gain_y = gy, off_y = dy,\
off_u = du1, rpow_u = ru, spow_u = su, pord_u = pord,\
off_v = dv1, rpow_v = rv, spow_v = sv, pord_v = pord)\
:\
ColorYUV2(\
gain_y = gy, off_y = dy,\
off_u = du1, rpow_u = ru, spow_u = su, pord_u = pord,\
off_v = dv1, rpow_v = rv, spow_v = sv, pord_v = pord)\
.Subtitle(" U Chroma value : "+String(u)+"\n"+\
" Middle - U Chroma value : "+String(du)+"\n"+\
" Bias : "+String(du1)+"\n"+\
" Gamma and S correction base : "+String(du2)+"\n"+\
" Rpow : "+String(ru)+" Spow : "+String(su),y=40,lsp=20)\
.Subtitle(" V value : "+String(v)+"\n"+\
" Middle - V Chroma value : "+String(dv)+"\n"+\
" Bias : "+String(dv1)+"\n"+\
" Gamma and S correction base : "+String(dv2)+"\n"+\
" Rpow : "+String(rv)+" Spow : "+String(sv),y=160,lsp=20)\
.Subtitle(" Y max : "+String(y_max)+" Y min : "+String(y_min)+" Luma_Threshold : "+String(luma_threshold)+"\n"+\
" Y factor : "+String(f)+" Y gain : "+String(gy)+" Y offset : "+String(dy)+"\n"+\
" New Y max : "+String(new_y_max + dy)+" New Y min : "+String(new_y_min + dy),y=280,lsp=20)
""", args = "strength_bias, strength_rpow, strength_spow, pord, autogain, luma_threshold, show_info")
( comparison == false) ? last : StackHorizontal(clip,last)
}
|
|
|
|
|
|
#17 | Link |
|
HeartlessS Usurer
Join Date: Dec 2009
Location: Over the rainbow
Posts: 11,392
|
"i do not get the highest frame pixel value"
Well, yes of course you do. Code:
RT_RgbChanStats(clip c,int "n"=current_frame,int "delta"=0,int "x"=0,int "y"=0,int "w"=0,int "h"=0,bool "interlaced"=false,
float "threshold"=0.0,int "chan"=0,int "lo"=128,int "hi"=lo,int "flgs"=255,string "prefix"="RCS_",
float "mu"=0.0,int "d"=1,int "p"=1,int "u"=1,int "mask"=NOT_USED, int "MaskMin"=128,"MaskMax"=255)
Returns multiple results as for above single frame RGB channel sampling functions as Local Variables (prefixed with the prefix string arg).
The args up to "interlaced", are as for all other clip functions, "threshold" used only for "RT_RgbChanMin", "RT_RgbChanMax" and
"RT_RgbChanMinMaxDifference" equivalent routines with same functionality.
"lo" and "hi" are used only with the "RT_RgbChanInRange" equivalent routine with same functionality.
"mu" and "d" and "p" and "u" are used only with the "RT_RgbChanPNorm" equivalent routine with same functionality.
The new arg "Flgs" selects which results you want returned and the string "Prefix" that is prepended
to the returned Local variable names.
The actual return result is a copy of the flgs args with any non valid bits reset, ie the Local variables that were set.
Local variables are NOT altered for any function not selected in flgs.
Returns 0 if no pixels found in search area of mask within MaskMin and MaskMax.
Flgs_Bit_Number Add_To_Flgs Equivalent_Function Local_Var_Set_Excluding_Prefix_and_Chan_postfix
0 1($01) RT_RgbChanMin() "Min" (0->255)
1 2($02) RT_RgbChanMax() "Max" (0->255)
2 4($04) RT_RgbChanMinMaxDifference() "MinMaxDiff" (0->255)
3 8($08) RT_RgbChanMedian() "Med" (0->255)
4 16($10) RT_RgbChanAve() "Ave" (0.0->255.0)
5 32($20) RT_RgbChanStdev() "Stdev" (0.0->255.0)
6 64($40) RT_RgbChanInRange() "InRng" (0.0->1.0)
7 128($80) RT_RgbChanPNorm() "PNorm" (0.0->??? depends upon d and u)
The Channel Postfix is of the form "_0", where 0 is RED, 1 is GREEN and 2 is Blue, 3 is ALPHA(RGB32 ONLY), and is appended to the
base name described above. So eg RT_RgbChanMin for RED channel 0 with default Prefix is "RCS_Min_0".
RT_RgbChanstats() allows you to inquire multiple results simultaneously, with not much more overhead than calling a single individual
routine, however, you should not select sub functions that you dont need as there may be an additional unnecessary overhead.
The Default flgs=255($FF) are all bits set and so sets ALL Local vars at once.
RT_RgbChanStats(flgs=1+2+16) would set Local vars "RCS_Min_0", "RCS_Max_0" and "RCS_Ave_0" for full frame current_frame, Red Channel.
In addition to above Local Variables, RT_RgbChanStats() sets an int Local variable (where default prefix) of "RCS_PixelCount_0" being
the number of Red Channel pixels in mask area X,Y,W,H between MaskMin and MaskMax inclusive.
NOTE, RT_RgbChanStats() allows Chan to be -1, where ALL three R, and G, and B channels are processed simultaneouly for ALL functions
selected by flgs arg (ALPHA Channel is NOT processed).
A chan arg of -2 (RGB32 ONLY allowed) will additionally process the ALPHA channel as well as R+G+B.
Also Note, (where default Prefix) RCS_PixelCount_x is also set (identically) for all channels when Chan == -1 or -2.
NOTE, If no valid flg bits set (eg $FF00), then returns 0, RCS_PixelCount_x and all other variables remain as before call.
Assuming some valid flg bits, if no valid pixels were found in mask then function returns 0, and only RCS_PixelCount_x would be set
to 0, no other variables are touched (remain as before call, undefined if not previously existing).
Example usage:
ScriptClip("""
got = RT_RgbChanStats(c,mask=Mask,chan=-1,flgs=$10) # Ave
(got != 0)
\ ? RT_Debug(RT_String("AveR = %f AveG = %f AveB = %f Pixels = %d",RCS_Ave_0,RCS_Ave_1,RCS_Ave_2,RCS_PixelCount_0))
\ : RT_Debug("NO VALID PIXELS FOUND")
""")
However, dont know how you do the 'top down contrast', probably mt_tools would be best bet. EDIT: although he may have done some kind of whole clip scan, twas a long time ago, rather than single frame. take a peek, you sounded at an earlier post as though you were a C coder.
__________________
I sometimes post sober. StainlessS@MediaFire ::: AND/OR ::: StainlessS@SendSpace "Some infinities are bigger than other infinities", but how many of them are infinitely bigger ??? Last edited by StainlessS; 5th June 2014 at 01:38. |
|
|
|
|
|
#19 | Link |
|
Registered User
Join Date: Jan 2012
Location: Toulon France
Posts: 252
|
Hi StainlessS,
Without use RT_RgbChanStats, i have found a effective solution with difference between clip in RGB and clip in greyscale. Auto white balance with RGBAdapt or ColorYUV2 are now ok. Because i have not the same start datas, autogain functions have not the same approach in this two last script versions. Code:
function RGBAdapt_half_auto(clip clip, bool "awb", bool "autogain", \
float "R_bias_manu", float "R_gain_manu", float "R_cont_manu", float "R_rpow_manu", float "R_spow_manu", float "R_spmid", bool "R_pord",\
float "G_bias_manu", float "G_gain_manu", float "G_cont_manu", float "G_rpow_manu", float "G_spow_manu", float "G_spmid", bool "G_pord",\
float "B_bias_manu", float "B_gain_manu", float "B_cont_manu", float "B_rpow_manu", float "B_spow_manu", float "B_spmid", bool "B_pord",\
float "strength_bias", float "strength_rpow", float "strength_spow", float "strength_autogain",\
bool "show_info", bool "comparison")
{
#----------------------------------------------based on RGBADapt plugin ---------------------------------------------------------------------#
# script author : StainlessS http://forum.doom9.org/showthread.php?p=1681286#post1681286 #
#
#---------------------------------------------- need GRunT plugin ----------------------------------------------------------------------------#
# script author : Gavino http://forum.doom9.org/showthread.php?p=1157083#post1157083 #
#------------------------------------------------------------------------------------------------------------------------------------------------- #
Assert(clip.IsRGB, "RGBAdapt-auto: source must be RGB")
awb = Default(awb,false) # Auto white balance
awb_nb = (awb == false) ? 0 : 1
autogain = Default(autogain, false) # Autogain
R_bias_manu = Default(R_bias_manu, 0) # same range with original R_bias args
G_bias_manu = Default(G_bias_manu, 0) # same range with original G_bias args
B_bias_manu = Default(B_bias_manu, 0) # same range with original B_bias args
R_gain_manu = Default(R_gain_manu, 1) # It is original R_gain args, range -8 to 8 center 1.0
G_gain_manu = Default(G_gain_manu, 1) # It is original G_gain args, range -8 to 8 center 1.0
B_gain_manu = Default(B_gain_manu, 1) # It is original B_gain args, range -8 to 8 center 1.0
R_cont_manu = Default(R_cont_manu, 1) # It is original R_cont args, range -8 to 8 center 1.0
G_cont_manu = Default(G_cont_manu, 1) # It is original G_cont args, range -8 to 8 center 1.0
B_cont_manu = Default(B_cont_manu, 1) # It is original B_cont args, range -8 to 8 center 1.0
R_rpow_manu = Default(R_rpow_manu, 0) # range -0.8 to 3.0 center 0 (original R_rpow range 0.1 to 4.0 center 1.0)
G_rpow_manu = Default(G_rpow_manu, 0) # range -0.8 to 3.0 center 0 (original G_rpow range 0.1 to 4.0 center 1.0)
B_rpow_manu = Default(B_rpow_manu, 0) # range -0.8 to 3.0 center 0 (original B_rpow range 0.1 to 4.0 center 1.0)
R_spow_manu = Default(R_spow_manu, 0) # range -0.8 to 3.0 center 0 (original R_spow range 0.1 to 4.0 center 1.0)
G_spow_manu = Default(G_spow_manu, 0) # range -0.8 to 3.0 center 0 (original G_spow range 0.1 to 4.0 center 1.0)
B_spow_manu = Default(B_spow_manu, 0) # range -0.8 to 3.0 center 0 (original B_spow range 0.1 to 4.0 center 1.0)
R_spmid = Default(R_spmid, 0.5) # It is original R_spmid args, range 0.1 to 0.99 center 0.5
G_spmid = Default(G_spmid, 0.5) # It is original G_spmid args, range 0.1 to 0.99 center 0.5
B_spmid = Default(B_spmid, 0.5) # It is original B_spmid args, range 0.1 to 0.99 center 0.5
R_pord = Default(R_pord, false) # It is original R_pord args
G_pord = Default(G_pord, false) # It is original G_pord args
B_pord = Default(B_pord, false) # It is original B_pord args
strength_bias = Default(strength_bias, 0.8) # linear curve use strength, between 0.0 and 1.0, default 0.5
strength_rpow = Default(strength_rpow,1.0) # Rpow curve use strength, between 0.0 and 4.0, default 1.0
strength_spow = Default(strength_spow,1.0) # Spow curve use strength, between 0.0 and 4.0, default 1.0
strength_autogain = Default(strength_autogain,0.1) # Spow curve use strength, between 0.0 and 4.0, default 1.0
show_info = Default(show_info, false) # show info or not, default false
comparison = Default(comparison, false) # show original vs processed comparison or not, default false
neutre = BlankClip( clip,pixel_type="RGB32", color=$000000)
luma = Greyscale(clip, matrix="Rec601")
red=ShowRed(clip,"RGB32")
green = ShowGreen(clip,"RGB32")
blue = ShowBlue(clip,"RGB32")
ScriptClip(clip, """
#------------ RGB values calcul
r_luma = RGBDifference(luma, neutre)
g_luma = RGBDifference(luma,neutre)
b_luma = RGBDifference(luma,neutre)
r = RGBDifference(neutre, red)
g = RGBDifference(neutre,green)
b = RGBDifference(neutre,blue)
#----------- RGB correction calcul
dr = r_luma-r
dg = g_luma-g
db = b_luma-b
#----------- RGB correction with linear curve calcul (Bias)
dr1_calcul = dr * strength_bias * awb_nb + R_bias_manu
dr1_low_limit = Max (dr1_calcul, -512)
dr1 = Min (512, dr1_low_limit)
dg1_calcul = dg * strength_bias * awb_nb + G_bias_manu
dg1_low_limit = Max (dg1_calcul, -512)
dg1 = Min (512, dg1_low_limit)
db1_calcul = db * strength_bias * awb_nb + B_bias_manu
db1_low_limit = Max (db1_calcul, -512)
db1 = Min (512, db1_low_limit)
#----------- RGB correction with Rpow and Spow curves calcul
dr2 = (dr - dr * strength_bias) * awb_nb
dg2 = (dg - dg * strength_bias) * awb_nb
db2 = (db - db * strength_bias) * awb_nb
#----------- RGB correction with Rpow curve calcul
yr_calcul = exp((dr2/100) * strength_rpow) + R_Rpow_manu
yr_low_limit = Max (yr_calcul, 0.1)
yr = Min (4.0, yr_low_limit)
yg_calcul = exp((dg2/100) * strength_rpow) + G_Rpow_manu
yg_low_limit = Max (yg_calcul, 0.1)
yg = Min (4.0, yg_low_limit)
yb_calcul = exp((db2/100) * strength_rpow) + B_Rpow_manu
yb_low_limit = Max (yb_calcul, 0.1)
yb = Min (4.0, yb_low_limit)
#----------- RGB correction with Spow curve calcul
sr_calcul = exp((dr2/100) * strength_spow) + R_spow_manu
sr_low_limit = Max (sr_calcul, 0.1)
sr = Min (4.0, sr_low_limit)
sg_calcul = exp((dg2/100) * strength_spow) + G_spow_manu
sg_low_limit = Max (sg_calcul, 0.1)
sg = Min (4.0, sg_low_limit)
sb_calcul = exp((db2/100) * strength_spow) + B_spow_manu
sb_low_limit = Max (sb_calcul, 0.1)
sb = Min (4.0, sb_low_limit)
#----------- RGB autogain
f = (autogain ==true ) ? (r+g+b)/(r_luma+g_luma+b_luma) :0
gr_calcul = R_gain_manu + f * strength_autogain/2
gr_low_limit = Max (gr_calcul, -8.0)
gr = Min (8.0, gr_low_limit)
gg_calcul = G_gain_manu + f * strength_autogain/2
gg_low_limit = Max (gg_calcul, -8.0)
gg = Min (8.0, gg_low_limit)
gb_calcul = B_gain_manu + f * strength_autogain/2
gb_low_limit = Max (gb_calcul, -8.0)
gb = Min (8.0, gb_low_limit)
cr_calcul = R_cont_manu + f * strength_autogain
cr_low_limit = Max (cr_calcul, -8.0)
cr = Min (8.0, cr_low_limit)
cg_calcul = G_cont_manu + f * strength_autogain
cg_low_limit = Max (cg_calcul, -8.0)
cg = Min (8.0, cg_low_limit)
cb_calcul = B_cont_manu + f * strength_autogain
cb_low_limit = Max (cb_calcul, -8.0)
cb = Min (8.0, cb_low_limit)
(show_info == false)? \
RGBAdapt( \
R_Bias = dr1, R_Gain = gr, R_Cont = cr, R_RPow = yr, R_Spow = sr, R_SPMid = R_spmid, R_Pord = R_pord, \
G_Bias = dg1, G_Gain = gg, G_Cont = cg, G_RPow = yg, G_Spow = sg, G_SPMid = G_spmid, G_Pord = G_pord,\
B_Bias = db1, B_Gain = gb, B_Cont = cb, B_RPow = yb, B_Spow = sb, B_SPMid = B_spmid, B_Pord = B_pord):\
RGBAdapt( \
R_Bias = dr1, R_Gain = gr, R_Cont = cr, R_RPow = yr, R_Spow = sr, R_SPMid = R_spmid, R_Pord = R_pord, \
G_Bias = dg1, G_Gain = gg, G_Cont = cg, G_RPow = yg, G_Spow = sg, G_SPMid = G_spmid, G_Pord = G_pord,\
B_Bias = db1, B_Gain = gb, B_Cont = cb, B_RPow = yb, B_Spow = sb, B_SPMid = B_spmid, B_Pord = B_pord)\
.Subtitle("Red value : "+String(r)+\
"\n Middle - Red Value : "+String(dr)+\
"\n Bias : "+String(dr1)+\
"\n Gamma and S correction base : "+String(dr2)+\
"\n Rpow : "+String(yr)+" Spow : "+String(sr),y=40,lsp=20)\
.Subtitle("Green value : "+String(g)+\
"\n Middle - Green Value : "+String(dg)+\
"\n Bias : "+String(dg1)+\
"\n Gamma and S correction base : "+String(dg2)+\
"\n Rpow : "+String(yg)+" Spow : "+String(sg),y=160,lsp=20)\
.Subtitle("Blue value : "+String(b)+\
"\n Middle - Blue Value : "+String(db)+\
"\n Bias : "+String(db1)+\
"\n Gamma and S correction base : "+String(db2)+\
"\n Rpow : "+String(yb)+" Spow : "+String(sb), y=280,lsp=20)\
.Subtitle("Greyscale Value : "+String(r_luma)+" Contrast gain : "+String(f), y=400,lsp=20)
""", args = "R_bias_manu, R_gain_manu, R_cont_manu, R_rpow_manu, R_spow_manu, R_spmid, R_pord," +\
"G_bias_manu, G_gain_manu, G_cont_manu, G_rpow_manu, G_spow_manu, G_spmid, G_pord,"+\
"B_bias_manu, B_gain_manu, B_cont_manu, B_rpow_manu, B_spow_manu, B_spmid, B_pord,"+\
"neutre, red, green, blue,luma,"+\
"awb_nb, autogain,"+\
"strength_bias, strength_rpow, strength_spow, strength_autogain,"+\
"show_info")
(comparison == false) ? last : StackHorizontal(clip,last)
}
Code:
function ColorYUV2_auto(clip clip, float "strength_bias",float "strength_Rpow", float "strength_Spow", int "pord",\
float "luma_threshold", float "strength_autogain", bool "show_info", bool "comparison")
{
#----------------------------------------------based on ColorYUV2 plugin ---------------------------------------------------------------------#
# script author : StainlessS http://forum.doom9.org/showthread.php?p=1443313#post1443313 #
#------------------------------------------------------------------------------------------------------------------------------------------------- #
#---------------------------------------------- need GRunT plugin ----------------------------------------------------------------------------#
# script author : Gavino http://forum.doom9.org/showthread.php?p=1157083#post1157083 #
#------------------------------------------------------------------------------------------------------------------------------------------------- #
strength_bias = Default(strength_bias, 0.5) # linear curve use strength, between 0.0 and 1.0, default 0.5
strength_Rpow = Default(strength_Rpow,1.0) # Rpow curve use strength, between 0.0 and 4.0, default 1.0
strength_Spow = Default(strength_Spow,1.0) # Spow curve use strength, between 0.0 and 4.0, default 1.0
pord = Default(pord,1) # process Rpow curve before Spow curve or not (1), default 0
luma_threshold = Default(luma_threshold, 0.50)
strength_autogain = Default(strength_autogain,1.0) # Spow curve use strength, between 0.0 and 4.0, default 1.0 # selected luma value percentage for calculation, too weak can be cause of light flicker
show_info = Default(show_info, false) # show info or not, default false
comparison = Default(comparison, false) # show original vs processed comparison or not, default false
ScriptClip(clip, """
#--------------------------------------------
# Autowhite process
#--------------------------------------------
#------------ UV average values
u = AverageChromaU()
v = AverageChromaV()
#----------- UV corrections calculation
du = 127.0 - u
dv = 127.0 - v
#----------- UV corrections with linear curve calculation (Offset)
du1 = du*strength_bias
dv1 = dv*strength_bias
#----------- UV corrections range with Rpow and Spow curves calculation
du2 = du-du1
dv2 = dv-dv1
#----------- UV corrections with Rpow curve calculation
ru = du2*strength_rpow
rv = dv2*strength_rpow
#----------- UV corrections with Spow curve calculation
su = du2*strength_spow
sv = dv2*strength_spow
#--------------------------------------------
# autogain process
#--------------------------------------------
#------------ Y max and min values
y_max_value = float(YPlaneMax(threshold = luma_threshold))
y_max = min (y_max_value, 235.0)
y_min_value = float(YPlaneMin(threshold = luma_threshold))
y_min = max (16.0, y_min_value)
#----------- Y gain correction calculation
f = float(219.0/(y_max - y_min)) #(autogain == true) ? : 1.0
gy = (256.0*f-256.0)*strength_autogain
#----------- Y offset correction calculation
new_y_max = y_max * f # only for display
new_y_min = y_min * f
dy = (16.0 - new_y_min)*strength_autogain
(show_info == false) ? \
ColorYUV2(\
gain_y = gy, off_y = dy,\
off_u = du1, rpow_u = ru, spow_u = su, pord_u = pord,\
off_v = dv1, rpow_v = rv, spow_v = sv, pord_v = pord)\
:\
ColorYUV2(\
gain_y = gy, off_y = dy,\
off_u = du1, rpow_u = ru, spow_u = su, pord_u = pord,\
off_v = dv1, rpow_v = rv, spow_v = sv, pord_v = pord)\
.Subtitle(" U Chroma value : "+String(u)+"\n"+\
" Middle - U Chroma value : "+String(du)+"\n"+\
" Bias : "+String(du1)+"\n"+\
" Gamma and S correction base : "+String(du2)+"\n"+\
" Rpow : "+String(ru)+" Spow : "+String(su),y=40,lsp=20)\
.Subtitle(" V value : "+String(v)+"\n"+\
" Middle - V Chroma value : "+String(dv)+"\n"+\
" Bias : "+String(dv1)+"\n"+\
" Gamma and S correction base : "+String(dv2)+"\n"+\
" Rpow : "+String(rv)+" Spow : "+String(sv),y=160,lsp=20)\
.Subtitle(" Y max : "+String(y_max)+" Y min : "+String(y_min)+"\n"+\
" luma_threshold : "+String(luma_threshold)+ " strength_autogain : "+String(strength_autogain)+"\n"+\
" Y factor : "+String(f)+" Y gain : "+String(gy)+" Y offset : "+String(dy)+"\n"+\
" New Y max : "+String(new_y_max + dy)+" New Y min : "+String(new_y_min + dy),y=280,lsp=20)
""", args = "strength_bias, strength_rpow, strength_spow, pord, luma_threshold, strength_autogain, show_info")
( comparison == false) ? last : StackHorizontal(clip,last)
}
i do not compare the same strength action. Perhaps it is because my RGBAdapt script has not 16-235 range limitation, before convertTo YV12. Do you agree my analysis or is it something i have not understood ? Thanks |
|
|
|
|
|
#20 | Link |
|
Registered User
Join Date: Jan 2012
Location: Toulon France
Posts: 252
|
Hi Stainless,
You can find below my last script version of RGBAdapt auto. The script purpose is to have automatic white balance function and if the result is no good to have manual tuning input. Code:
function RGBAdapt_awb_auto(clip clip, bool "awb",\
float "R_bias_manu", float "R_gain", float "R_cont", float "R_rpow_manu", float "R_spow_manu", float "R_spmid", bool "R_pord",\
float "G_bias_manu", float "G_gain", float "G_cont", float "G_rpow_manu", float "G_spow_manu", float "G_spmid", bool "G_pord",\
float "B_bias_manu", float "B_gain", float "B_cont", float "B_rpow_manu", float "B_spow_manu", float "B_spmid", bool "B_pord",\
float "strength_bias", float "strength_rpow", float "strength_spow",\
bool "show_info", bool "comparison")
{
#----------------------------------------------based on RGBADapt plugin ---------------------------------------------------------------------#
# script author : StainlessS http://forum.doom9.org/showthread.php?p=1681286#post1681286 #
#------------------------------------------------------------------------------------------------------------------------------------------------- #
#---------------------------------------------- need GRunT plugin ----------------------------------------------------------------------------#
# script author : Gavino http://forum.doom9.org/showthread.php?p=1157083#post1157083 #
#------------------------------------------------------------------------------------------------------------------------------------------------- #
test = isRGB(clip)
(test == false) ? ConvertToRGB32(clip, matrix="Rec601") : clip
clip = last
awb = Default(awb,true) # auto white balance mode
awb_nb = (awb == false) ? 0 : 1
R_bias_manu = Default(R_bias_manu, 0) # same range with original R_bias args
G_bias_manu = Default(G_bias_manu, 0) # same range with original G_bias args
B_bias_manu = Default(B_bias_manu, 0) # same range with original B_bias args
R_gain = Default(R_gain, 1) # it is original original R_gain args, range -8 to 8 center 1.0
G_gain = Default(G_gain, 1) # it is original original G_gain args, range -8 to 8 center 1.0
B_gain = Default(B_gain, 1) # it is original original B_gain args, range -8 to 8 center 1.0
R_cont = Default(R_cont, 1) # it is original original R_cont args, range -8 to 8 center 1.0
G_cont = Default(G_cont, 1) # it is original original G_cont args, range -8 to 8 center 1.0
B_cont = Default(B_cont, 1) # it is original original B_cont args, range -8 to 8 center 1.0
R_rpow_manu = Default(R_rpow_manu, 0) # range -0.9 to 3.0 center 0 (original R_rpow range 0.1 to 4.0 center 1.0)
G_rpow_manu = Default(G_rpow_manu, 0) # range -0.9 to 3.0 center 0 (original G_rpow range 0.1 to 4.0 center 1.0)
B_rpow_manu = Default(B_rpow_manu, 0) # range -0.9 to 3.0 center 0 (original B_rpow range 0.1 to 4.0 center 1.0)
R_spow_manu = Default(R_spow_manu, 0) # range -0.9 to 3.0 center 0 (original R_spow range 0.1 to 4.0 center 1.0)
G_spow_manu = Default(G_spow_manu, 0) # range -0.9 to 3.0 center 0 (original G_spow range 0.1 to 4.0 center 1.0)
B_spow_manu = Default(B_spow_manu, 0) # range -0.9 to 3.0 center 0 (original B_spow range 0.1 to 4.0 center 1.0)
R_spmid = Default(R_spmid, 0.5) # it is original R_spmid args, range 0.1 to 0.99 center 0.5
G_spmid = Default(G_spmid, 0.5) # it is original G_spmid args, range 0.1 to 0.99 center 0.5
B_spmid = Default(B_spmid, 0.5) # it is original B_spmid args, range 0.1 to 0.99 center 0.5
R_pord = Default(R_pord, false) # it is original R_pord args
G_pord = Default(G_pord, false) # it is original G_pord args
B_pord = Default(B_pord, false) # it is original B_pord args
strength_bias = Default(strength_bias, 0.8) # linear curve use strength, between 0.0 and 1.0, default 0.8
strength_rpow = Default(strength_rpow,1.0) # rpow curve use strength, between -4.0 and 4.0, default 1.0
strength_spow = Default(strength_spow,1.0) # spow curve use strength, between -4.0 and 4.0, default 1.0
show_info = Default(show_info, false) # show info or not, default false
comparison = Default(comparison, false) # show original vs processed comparison or not, default false
neutre = BlankClip( clip,pixel_type="RGB32", color=$000000)
luma = Greyscale(clip, matrix="Rec601")
red=ShowRed(clip,"RGB32")
green = ShowGreen(clip,"RGB32")
blue = ShowBlue(clip,"RGB32")
ScriptClip(clip, """
#------------ RGB values calcul
luma_value = RGBDifference(luma, neutre)
r = RGBDifference(neutre, red)
g = RGBDifference(neutre,green)
b = RGBDifference(neutre,blue)
#----------- RGB correction calcul
dr = luma_value-r
dg = luma_value-g
db = luma_value-b
#----------- RGB correction with linear curve calcul (Bias)
dr1_calcul = dr * strength_bias * awb_nb + R_bias_manu
dr1_low_limit = Max (dr1_calcul, -512)
dr1 = Min (512, dr1_low_limit)
dg1_calcul = dg * strength_bias * awb_nb + G_bias_manu
dg1_low_limit = Max (dg1_calcul, -512)
dg1 = Min (512, dg1_low_limit)
db1_calcul = db * strength_bias * awb_nb + B_bias_manu
db1_low_limit = Max (db1_calcul, -512)
db1 = Min (512, db1_low_limit)
#----------- RGB correction with Rpow and Spow curves calcul
dr2 = (dr - dr * strength_bias) * awb_nb
dg2 = (dg - dg * strength_bias) * awb_nb
db2 = (db - db * strength_bias) * awb_nb
#----------- RGB correction with Rpow curve calcul
yr_calcul = pow((1+dr2 * strength_rpow/128),(1+dr2 * strength_rpow/128)) + R_Rpow_manu # exp((dr2/100) * strength_rpow) + R_Rpow_manu
yr_low_limit = Max (yr_calcul, 0.1)
yr = Min (4.0, yr_low_limit)
yg_calcul = pow((1+dg2 * strength_rpow/128),(1+dg2 * strength_rpow/128)) + G_Rpow_manu # exp((dg2/100) * strength_rpow) + G_Rpow_manu
yg_low_limit = Max (yg_calcul, 0.1)
yg = Min (4.0, yg_low_limit)
yb_calcul = pow((1+db2 * strength_rpow/128),(1+db2 * strength_rpow/128)) + B_Rpow_manu # exp((db2/100) * strength_rpow) + B_Rpow_manu
yb_low_limit = Max (yb_calcul, 0.1)
yb = Min (4.0, yb_low_limit)
#----------- RGB correction with Spow curve calcul
sr_calcul = pow((1+dr2 * strength_spow/128),(1+dr2 * strength_spow/128)) + R_Spow_manu # exp((dr2/100) * strength_spow) + R_spow_manu
sr_low_limit = Max (sr_calcul, 0.1)
sr = Min (4.0, sr_low_limit)
sg_calcul = pow((1+dg2 * strength_spow/128),(1+dg2 * strength_spow/128)) + G_Spow_manu # exp((dg2/100) * strength_spow) + G_spow_manu
sg_low_limit = Max (sg_calcul, 0.1)
sg = Min (4.0, sg_low_limit)
sb_calcul = pow((1+db2 * strength_spow/128),(1+db2 * strength_spow/128)) + B_Spow_manu # exp((db2/100) * strength_spow) + B_spow_manu
sb_low_limit = Max (sb_calcul, 0.1)
sb = Min (4.0, sb_low_limit)
(show_info == false)? \
RGBAdapt( \
R_Bias = dr1, R_Gain = R_Gain, R_Cont = R_Cont, R_RPow = yr, R_Spow = sr, R_SPMid = R_spmid, R_Pord = R_pord, \
G_Bias = dg1, G_Gain = G_Gain, G_Cont = G_Cont, G_RPow = yg, G_Spow = sg, G_SPMid = G_spmid, G_Pord = G_pord,\
B_Bias = db1, B_Gain = B_Gain, B_Cont = B_Cont, B_RPow = yb, B_Spow = sb, B_SPMid = B_spmid, B_Pord = B_pord)\
:\
RGBAdapt( \
R_Bias = dr1, R_Gain = R_Gain, R_Cont = R_Cont, R_RPow = yr, R_Spow = sr, R_SPMid = R_spmid, R_Pord = R_pord, \
G_Bias = dg1, G_Gain = G_Gain, G_Cont = G_Cont, G_RPow = yg, G_Spow = sg, G_SPMid = G_spmid, G_Pord = G_pord,\
B_Bias = db1, B_Gain = B_Gain, B_Cont = B_Cont, B_RPow = yb, B_Spow = sb, B_SPMid = B_spmid, B_Pord = B_pord)\
.Subtitle("Red value : "+String(r)+\
"\n Middle - Red Value : "+String(dr)+\
"\n Bias : "+String(dr1)+\
"\n Gamma and S correction base : "+String(dr2)+\
"\n Rpow : "+String(yr)+" Spow : "+String(sr),y=40,lsp=20)\
.Subtitle("Green value : "+String(g)+\
"\n Middle - Green Value : "+String(dg)+\
"\n Bias : "+String(dg1)+\
"\n Gamma and S correction base : "+String(dg2)+\
"\n Rpow : "+String(yg)+" Spow : "+String(sg),y=160,lsp=20)\
.Subtitle("Blue value : "+String(b)+\
"\n Middle - Blue Value : "+String(db)+\
"\n Bias : "+String(db1)+\
"\n Gamma and S correction base : "+String(db2)+\
"\n Rpow : "+String(yb)+" Spow : "+String(sb), y=280,lsp=20)
""", args = "R_bias_manu, R_gain, R_cont, R_rpow_manu, R_spow_manu, R_spmid, R_pord," +\
"G_bias_manu, G_gain, G_cont, G_rpow_manu, G_spow_manu, G_spmid, G_pord,"+\
"B_bias_manu, B_gain, B_cont, B_rpow_manu, B_spow_manu, B_spmid, B_pord,"+\
"neutre, red, green, blue,luma,"+\
"awb_nb, strength_bias, strength_rpow, strength_spow,"+\
"show_info")
(comparison == false) ? last : StackHorizontal(clip,last)
(test == false) ? ConvertToYV12(last, matrix="Rec601") : last
}
In this script, i have added six args : strength bias, to tune automatic white balance with linear curve, strength rpow, to tune automatic white balance with rpow curve, strength spow, to tune automatic white balance with spow curve, abw, to fast enable or no automatic white balance, show_info, to display automatic args values, and comparison, to display original vs filtered comparison. To stay in accordance with your plugin, original bias args are now named bias_manu, rpow rpow_manu and spow spow_manu. With these new args and your original args we can make white balance search around automatic white balance output. The automatic white balance default principe is to make the job at 80% with bias curve and to finish with rpow and spow actions. Thus we minimize automatic white balance effects in highest and lowest luma tones, and for me we keep sunset or night colors. strength bias values are in 0.0 and 0.1 range. 0.0 mean automatic white balance only with rpow and spow curves. 1.0 mean automatic white balance only with linear curve, in this case the result is like colorYUV autowhite function. rpow and spow inputs are not linear, thus i use x^x curves for translate the linear difference between 127 and channel value datas. rpow and spow values are in -4.0 and 4.0 range with default 1.0. I do not know if this automatic rpow or spow curves use have a mathematical sense, but with 1.0 values for this two args i find result good for me. I have a white balance effects more strong for light midtones as dark midtones and very little for the upper and lower tones. 0.0 mean no use rpow or spow curves. I have limited their values range at -4 to 4, because i have observed we can efficiently modify white balance with this args before start a manual job with the RGBAdapt original args. For automatic white balance with rpow and spow curves use, we can process with my ColorYUV2 auto script proposal, but i believe it more easier to work in RGB when the automatic result is not satisfactory. I think RGBAdapt is thus better for find the automatic white balance start before a manual search. Thanks for your great plugins. |
|
|
|
![]() |
| Tags |
| rgbadjust |
| Thread Tools | |
| Display Modes | |
|
|