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. |
28th January 2015, 17:34 | #1 | Link |
Registered User
Join Date: Feb 2013
Posts: 161
|
Gamma vs. saturation
In Levels "manual" stands:
"When processing data in YUV mode, Levels only gamma-corrects the luma information, not the chroma. Gamma correction is really an RGB concept, and I don't know how to do it properly in YUV ..." If I understand - the only way to maintain saturation during gamma correction is to do it in RGB, otherwise the midtones - where is the biggest change - looses saturation according the gamma curve - if the value of gamma increases ... |
28th January 2015, 21:14 | #2 | Link |
HeartlessS Usurer
Join Date: Dec 2009
Location: Over the rainbow
Posts: 10,980
|
Nobody knows how to do it properly in YUV, so I would not expect too many suggestions, as you say, it is a RGB concept.
If however you just want to mod in YUV then see ColorYUV2: http://forum.doom9.org/showthread.ph...ight=coloryuv2
__________________
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 ??? |
28th January 2015, 22:24 | #3 | Link |
Registered User
Join Date: Feb 2013
Posts: 161
|
Can coloryuv2 does something like this? :
Code:
y = converttoy8() u = utoy8() v = vtoy8() y_scaled = y.bilinearresize(width(u), height(u)) u_adjusted = mt_lutxy(u,y_scaled,expr="x 128 - 1.10 * 128 + y 16 - 0.06918 * +") v_adjusted = mt_lutxy(v,y_scaled,expr="x 128 - 1.30 * 128 + y 16 - 0.02525 * -") ytouv(u_adjusted,v_adjusted,y) Last edited by Stormborec; 29th January 2015 at 19:56. |
29th January 2015, 18:37 | #4 | Link |
Registered User
Join Date: Feb 2013
Posts: 161
|
Maybe something like: would do the job concerning gamma without saturation shift
Code:
y = converttoy8() u = utoy8() v = vtoy8() y_adjusted = mt_lut("x 16 - 219 / 1 1.2 / ^ 219 * 16 +", chroma="copy") y_scaled = y.bilinearresize(width(u),height(u)) u_adjusted = mt_lutxy(u,y_scaled,"x 128 - y 16 - 219 / 1 1.2 / ^ 219 * 16 + y / * 128 +") v_adjusted = mt_lutxy(v,y_scaled,"x 128 - y 16 - 219 / 1 1.2 / ^ 219 * 16 + y / * 128 +") ytouv(u_adjusted,v_adjusted,y_adjusted) NOW IT WORKS, YES, NOW IT WORKS, perhaps ... There could be: y_scaled = y_adjusted.bilinearresize(width(u),height(u)) but I don't know, if is it correct to chain the luts ... Or exactly like this: u_adjusted = mt_lutxy(u,y_scaled,"x 128 - y 16 - 219 / 1 1.2 / ^ 219 * y 16 - / * 128 +") v_adjusted = mt_lutxy(v,y_scaled,"x 128 - y 16 - 219 / 1 1.2 / ^ 219 * y 16 - / * 128 +") (excepting the zero division, when black ... maybe diddle it ... y 15 - Last edited by Stormborec; 29th January 2015 at 20:45. |
|
|