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. |
21st May 2014, 04:10 | #1 | Link | |
HeartlessS Usurer
Join Date: Dec 2009
Location: Over the rainbow
Posts: 10,980
|
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 |
|
23rd May 2014, 19:19 | #2 | Link |
Registered User
Join Date: Jan 2012
Location: Toulon France
Posts: 249
|
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. |
24th May 2014, 22:13 | #3 | Link |
Registered User
Join Date: Jan 2012
Location: Toulon France
Posts: 249
|
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. |
25th May 2014, 10:35 | #4 | Link |
Registered User
Join Date: Jan 2012
Location: Toulon France
Posts: 249
|
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 |
26th May 2014, 19:54 | #5 | Link |
Registered User
Join Date: Jan 2012
Location: Toulon France
Posts: 249
|
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. |
26th May 2014, 20:02 | #6 | Link |
HeartlessS Usurer
Join Date: Dec 2009
Location: Over the rainbow
Posts: 10,980
|
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 ??? |
27th May 2014, 20:09 | #7 | Link |
Registered User
Join Date: Jan 2012
Location: Toulon France
Posts: 249
|
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 |
27th May 2014, 21:55 | #8 | Link |
HeartlessS Usurer
Join Date: Dec 2009
Location: Over the rainbow
Posts: 10,980
|
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. |
29th May 2014, 00:28 | #9 | Link |
Registered User
Join Date: Jan 2012
Location: Toulon France
Posts: 249
|
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. |
29th May 2014, 01:10 | #10 | Link |
HeartlessS Usurer
Join Date: Dec 2009
Location: Over the rainbow
Posts: 10,980
|
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 ??? |
2nd June 2014, 19:46 | #11 | Link |
Registered User
Join Date: Jan 2012
Location: Toulon France
Posts: 249
|
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 ? |
2nd June 2014, 23:54 | #12 | Link | |
Avisynth language lover
Join Date: Dec 2007
Location: Spain
Posts: 3,431
|
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. |
|
3rd June 2014, 15:41 | #13 | Link |
HeartlessS Usurer
Join Date: Dec 2009
Location: Over the rainbow
Posts: 10,980
|
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 ??? |
3rd June 2014, 22:06 | #14 | Link |
Registered User
Join Date: Jan 2012
Location: Toulon France
Posts: 249
|
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) } |
3rd June 2014, 22:26 | #15 | Link |
HeartlessS Usurer
Join Date: Dec 2009
Location: Over the rainbow
Posts: 10,980
|
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. |
4th June 2014, 23:24 | #16 | Link |
Registered User
Join Date: Jan 2012
Location: Toulon France
Posts: 249
|
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) } |
5th June 2014, 01:36 | #17 | Link |
HeartlessS Usurer
Join Date: Dec 2009
Location: Over the rainbow
Posts: 10,980
|
"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. |
10th June 2014, 18:47 | #19 | Link |
Registered User
Join Date: Jan 2012
Location: Toulon France
Posts: 249
|
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 |
18th June 2014, 21:20 | #20 | Link |
Registered User
Join Date: Jan 2012
Location: Toulon France
Posts: 249
|
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 | Search this Thread |
Display Modes | |
|
|