2018-01-31, 04:19 PM
Matrix parameter and RGB clips in OverlayRender may cause wrong color adjustment. Use ConvertToYV24 insted of ConvertToRGB24 to adjust only luma channel with histogram matching.
To change chroma offset you could use function before overlay render:
clip2adjust=clip2adjust.AdjustColor(clip2adjust, referenceClip, false, true, 2, 1, false)
To change chroma offset you could use function before overlay render:
clip2adjust=clip2adjust.AdjustColor(clip2adjust, referenceClip, false, true, 2, 1, false)
Code:
function AdjustColor(clip input, clip sample, clip reference, bool luma, bool chroma, int tr, float maxDiff, bool debug)
{
global sample1=sample
global reference1=reference
return input.ScriptClip("
tr = " + string(tr) + "
maxDiff = " + string(maxDiff) + "
luma = " + string(luma) + "
chroma = " + string(chroma) + "
debug = " + string(debug) + """
count=tr*2 + 1
lumaMedian=0.0
chromaMedianU=0.0
chromaMedianV=0.0
ownY = reference1.YPlaneMedian() - sample1.YPlaneMedian()
ownU = reference1.UPlaneMedian() - sample1.UPlaneMedian()
ownV = reference1.VPlaneMedian() - sample1.VPlaneMedian()
for ( i = -tr, tr, 1) {
curY=reference1.YPlaneMedian(i) - sample1.YPlaneMedian(i)
curU=reference1.UPlaneMedian(i) - sample1.UPlaneMedian(i)
curV=reference1.VPlaneMedian(i) - sample1.VPlaneMedian(i)
if (abs(curY-ownY) <= maxDiff || abs(curU-ownU) <= maxDiff || abs(curV-ownV) <= maxDiff) {
lumaMedian=lumaMedian + curY
chromaMedianU=chromaMedianU + curU
chromaMedianV=chromaMedianV + curV
} else {
count=count-1
}
}
lumaMedian = luma ? (lumaMedian/count) : 0 #*(255/testMask.AverageLuma())
chromaMedianU = chroma ? (chromaMedianU/count) : 0
chromaMedianV = chroma ? (chromaMedianV/count) : 0
ColorYUV(off_y=round(lumaMedian), off_u=round(chromaMedianU), off_v=round(chromaMedianV))
if (debug) {
Subtitle("Y=" + string(lumaMedian) + ", U=" + string(chromaMedianU) + ", V=" + string(chromaMedianV))
}
""")
}