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.

 

Go Back   Doom9's Forum > Capturing and Editing Video > Avisynth Usage

Reply
 
Thread Tools Search this Thread Display Modes
Old 18th February 2021, 15:33   #1  |  Link
Arx1meD
Registered User
 
Arx1meD's Avatar
 
Join Date: Feb 2021
Posts: 53
Brightness - restore dark and bright zones

This script will be useful for restoring dark and bright zones of a video or for smoothly changing luma.
Thanks to Didée for his Ylevels. This inspired me to create other functions.

Code:
# Brightness() v1.1
#
# v1.0 : - first release
# v1.1 : - adapted for use in all versions of AviSynth

/*
Needed plugins: MaskTools2 v2.2.16 or greater.
    https://github.com/pinterf/masktools/releases
    http://avisynth.nl/index.php/MaskTools2/mt_lut

Brightness(mode, dark, light, bit, chroma, DarkLightZonesOnly, SaveMinMaxLuma)

mode:
-----
    "Line" - linear brightness variation.
    "Cos"  - changes brightness by Cosine function.
    "Cube" - changes brightness by a cubic power function.
    Default: "Cube"

dark:
-----
    The strength of changing dark zones.
    The recommended range is -30 ... 30. The range is not limited, in theory.
    Default: 20

light:
------
    The strength of changing light zones.
    The recommended range is -30...30.
    Default: 20

bit:
----
    Bit depth per channel in input clip.
    -1 - for autoscale in MaskTools2 (slower).
     0 - for autodetection (faster).
    8, 10, 12, 14, 16.
    Default: 0

chroma:
-------
    true  - it means "process"; set u = v = 3 in mt_lut() MaskTools2.
    false - it means "copy" or "copy first"; set u = v = 2.
    Default: false

DarkLightZonesOnly:
-------------------
    Changes only dark and light zones.
    true  or  false.
    If true, then "SaveMinMaxLuma" is ignored.
    Default: false

SaveMinMaxLuma:
---------------
    Smooth brightness change for dark and bright zones. Keep minimum (0) and maximum (255) value of luma range.
    true  or  false.
    Default: true

Usage Default:
Brightness(mode="Cube", dark=20, light=20, bit=0, chroma=false, DarkLightZonesOnly=false, SaveMinMaxLuma=true)
or
Brightness("Cube", 20, 20, 0, false, false, true)
*/

function Brightness(clip input, string "mode", float "dark", float "light", int "bit", bool "chroma", bool "DarkLightZonesOnly", bool "SaveMinMaxLuma") {
mode   = Default(mode, "Cube")
dark   = Default(dark, 20)
light  = Default(light, 20)
bit    = Default(bit, 0)
chroma = Default(chroma, false)
DLZO   = Default(DarkLightZonesOnly, false)
SMML   = Default(SaveMinMaxLuma, true)

Assert(mode == "Line" || mode == "Cos" || mode == "Cube", "Brightness: Mode must be: Line, Cos, Cube")
Assert(bit == -1 || bit == 0 || bit == 8 || bit == 10 || bit == 12 || bit == 14 || bit == 16, \
       "Brightness: Bit depth per channel must be only: 8, 10, 12, 14, 16 or -1, 0 for autodetection")

Try { bpc = bit == 0 || bit == -1 ? input.BitsPerComponent : bit } Catch (msg) { bpc=8 }      #BitsPerComponent only in AVS+
scale_inputs = bit >= 0 ? "none" : bpc == 8 ? "none" : "allf"   #"all" range in 8 bits Y=16...235; "allf" range in 8 bits Y=0...255
use_expr = bit >= 0 ? 0 : bpc == 8 ? 0 : 2 
chrom = chroma ? "process" : "copy"

LUMA = bit >= 0 ? Pow(2.0, bpc) - 1 : 255.0
maxY = String(LUMA)
midY = String(LUMA/2.0)

stD = bit >= 0 ? String(dark * Pow(2.0, bpc - 8)) : String(dark)
stL = bit >= 0 ? String(light * Pow(2.0, bpc - 8)) : String(light)

k = String(mode == "Line" || mode == "Cube" ? 0 : 1)
n = String(mode == "Cube" ? 3 : 1) # odd numbers only
j = String(30) # even numbers only
l = string(21) # odd numbers only
m = String(SMML == true ? 1 : 0)
f = String(mode == "Line" ? 1.25 : mode == "Cos" ? 1.15 : 1.05)

curveD = dark == 0 ? "x" : !DLZO ? "x "+stD+" "+k+" 1 + 1 x "+midY+" / - "+n+" ^ * pi x * "+maxY+" / cos "+k+" * - * 1 1 x "+midY+" / - "+j+" ^ "+m+" * - * +"
                               \ : "x "+stD+" 1 x "+midY+" / - "+l+" ^ pi x * "+maxY+" / cos "+l+" ^ - * "+f+" * -"
curveL = light == 0 ? "x" : !DLZO ? "x "+stL+" "+k+" 1 + 1 x "+midY+" / - "+n+" ^ * pi x * "+maxY+" / cos "+k+" * - * 1 1 x "+midY+" / - "+j+" ^ "+m+" * - * +"
                                \ : "x "+stL+" 1 x "+midY+" / - "+l+" ^ pi x * "+maxY+" / cos "+l+" ^ - * "+f+" * -"

# function 1:  x + 'st'*((1+'k')*(1 - x/127.5)^'n' - 'k'*cos(x*pi/255))*(1 - 'm'*(1 - x/127.5)^'j')
# function 2:  x - 'f'*'st'*((1 - x/127.5)^'l' - cos(x*pi/255)^'l')

out = dark == light ? curveD : "x "+midY+" > "+curveL+" "+curveD+" ?"

mt_lut(input, expr=out, Y=3, chroma=chrom, scale_inputs=scale_inputs, use_expr=use_expr)
# mt_lut(input, expr=out, Y=3, chroma=chrom) # for MaskTools v2.0a48
}
Explanation of what the script does.
1. Basic functions for smoothly changing luma:

Backup copy formulas 1 graphs 1
2. Functions for changes only dark and light zones:

Backup copy formulas 2 graphs 2

Examples:
Brightness(mode="Cube", dark=20, light=0, bit=0, chroma=false, DarkLightZonesOnly=true, SaveMinMaxLuma=true)

Backup copy Source frame Restored frame
Comparison of original and restored clip

Last edited by Arx1meD; 17th March 2021 at 17:48. Reason: Changed image hosting. In mt_lut changed yexpr to expr, use_expr to 2
Arx1meD is offline   Reply With Quote
Reply

Tags
bright, dark, restore, zones

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT +1. The time now is 10:10.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2021, vBulletin Solutions Inc.