Boulder
20th September 2015, 12:43
This is supposed to work like the HD mod of ContraSharpen. With 16-bit clips it takes a very long time to initialize - do you see what needs to be changed? Any other modifications are of course welcome :)
import vapoursynth as vs
import havsfunc as has
def ContraSharpeningHD(denoised, original, cb1, cf1, superclip, thscd1=300, thscd2=80):
core = vs.get_core()
if denoised.format.id != original.format.id:
raise ValueError('ContraSharpening: clips must have the same format')
if denoised.format.color_family != vs.GRAY:
denoised_src = denoised
else:
denoised_src = None
cb1 = core.mv.Compensate(original,superclip,cb1,thscd1=thscd1,thscd2=thscd2)
cf1 = core.mv.Compensate(original,superclip,cf1,thscd1=thscd1,thscd2=thscd2)
pmax = core.std.Expr([original, cb1], expr=['x y max'])
pmax = core.std.Expr([pmax, cf1], expr=['x y max'])
pmin = core.std.Expr([original, cb1], expr=['x y min'])
pmin = core.std.Expr([pmin, cf1], expr=['x y min'])
s = has.MinBlur(denoised, 2, planes=[0])
allD = core.std.MakeDiff(original, denoised,planes=[0])
ssD = core.std.MakeDiff(s, core.rgvs.RemoveGrain(core.rgvs.RemoveGrain(s, [20,0]),[20,0]),planes=[0])
ssD2 = core.rgvs.Repair(ssD, allD, [1,0])
ssDD = core.rgvs.Repair(ssD, ssD2, [12,0])
expr = 'x {median} - abs y {median} - abs < x y ?'.format(median=1<<(denoised.format.bits_per_sample-1))
ssDD = core.std.Expr([ssDD, ssD], [expr])
last = core.std.MergeDiff(denoised, ssDD, planes=[0])
last = core.std.Interleave(clips=[last, pmin, pmax])
last = core.rgvs.Clense(last,planes=[0])
last = core.std.SelectEvery(last, cycle=3, offsets=1)
if denoised_src is not None:
return core.std.ShufflePlanes([last, denoised_src], planes=[0, 1, 2], colorfamily=denoised_src.format.color_family)
else:
return last
The original function (from SMDegrain):
FUNCTION ContraSharpeningHD(clip denoised, clip original, bool "HD", bool "planar", int "overshoot"){
HD = default(HD ,false)
planar = default(planar,false)
overshoot = default(overshoot,0)
HD ? eval("""
cb1=original.MCompensate(Super, cb1, planar=planar)
cf1=original.MCompensate(Super, cf1, planar=planar)
pmax = original.mt_logic(cb1, "max").mt_logic(cf1, "max")
pmin = original.mt_logic(cb1, "min").mt_logic(cf1, "min")""") : nop()
s = denoised.MinBlur(HD?2:1,1,planar=planar) # Damp down remaining spots of the denoised clip.
allD = mt_makediff(original,denoised) # The difference achieved by the denoising.
ssD = mt_makediff(s,HD?s.removegrain(20,-1,planar=planar).\
removegrain(20,-1,planar=planar):\
s.removegrain(11,-1,planar=planar)) # The difference of a simple kernel blur.
ssDD = ssD.repair(HD?ssD.repair(allD,1,planar=planar):allD,HD?12:1,planar=planar) # Limit the difference to the max of what the denoising removed locally.
ssDD = SSDD.mt_lutxy(ssD,"x 128 - abs y 128 - abs < x y ?") # abs(diff) after limiting may not be bigger than before.
denoised.mt_adddiff(ssDD,U=2,V=2) # Apply the limited difference. (Sharpening is just inverse blurring)
HD ? mt_clamp(last,pmax,pmin,overshoot,overshoot,chroma="copy first") : last
}
import vapoursynth as vs
import havsfunc as has
def ContraSharpeningHD(denoised, original, cb1, cf1, superclip, thscd1=300, thscd2=80):
core = vs.get_core()
if denoised.format.id != original.format.id:
raise ValueError('ContraSharpening: clips must have the same format')
if denoised.format.color_family != vs.GRAY:
denoised_src = denoised
else:
denoised_src = None
cb1 = core.mv.Compensate(original,superclip,cb1,thscd1=thscd1,thscd2=thscd2)
cf1 = core.mv.Compensate(original,superclip,cf1,thscd1=thscd1,thscd2=thscd2)
pmax = core.std.Expr([original, cb1], expr=['x y max'])
pmax = core.std.Expr([pmax, cf1], expr=['x y max'])
pmin = core.std.Expr([original, cb1], expr=['x y min'])
pmin = core.std.Expr([pmin, cf1], expr=['x y min'])
s = has.MinBlur(denoised, 2, planes=[0])
allD = core.std.MakeDiff(original, denoised,planes=[0])
ssD = core.std.MakeDiff(s, core.rgvs.RemoveGrain(core.rgvs.RemoveGrain(s, [20,0]),[20,0]),planes=[0])
ssD2 = core.rgvs.Repair(ssD, allD, [1,0])
ssDD = core.rgvs.Repair(ssD, ssD2, [12,0])
expr = 'x {median} - abs y {median} - abs < x y ?'.format(median=1<<(denoised.format.bits_per_sample-1))
ssDD = core.std.Expr([ssDD, ssD], [expr])
last = core.std.MergeDiff(denoised, ssDD, planes=[0])
last = core.std.Interleave(clips=[last, pmin, pmax])
last = core.rgvs.Clense(last,planes=[0])
last = core.std.SelectEvery(last, cycle=3, offsets=1)
if denoised_src is not None:
return core.std.ShufflePlanes([last, denoised_src], planes=[0, 1, 2], colorfamily=denoised_src.format.color_family)
else:
return last
The original function (from SMDegrain):
FUNCTION ContraSharpeningHD(clip denoised, clip original, bool "HD", bool "planar", int "overshoot"){
HD = default(HD ,false)
planar = default(planar,false)
overshoot = default(overshoot,0)
HD ? eval("""
cb1=original.MCompensate(Super, cb1, planar=planar)
cf1=original.MCompensate(Super, cf1, planar=planar)
pmax = original.mt_logic(cb1, "max").mt_logic(cf1, "max")
pmin = original.mt_logic(cb1, "min").mt_logic(cf1, "min")""") : nop()
s = denoised.MinBlur(HD?2:1,1,planar=planar) # Damp down remaining spots of the denoised clip.
allD = mt_makediff(original,denoised) # The difference achieved by the denoising.
ssD = mt_makediff(s,HD?s.removegrain(20,-1,planar=planar).\
removegrain(20,-1,planar=planar):\
s.removegrain(11,-1,planar=planar)) # The difference of a simple kernel blur.
ssDD = ssD.repair(HD?ssD.repair(allD,1,planar=planar):allD,HD?12:1,planar=planar) # Limit the difference to the max of what the denoising removed locally.
ssDD = SSDD.mt_lutxy(ssD,"x 128 - abs y 128 - abs < x y ?") # abs(diff) after limiting may not be bigger than before.
denoised.mt_adddiff(ssDD,U=2,V=2) # Apply the limited difference. (Sharpening is just inverse blurring)
HD ? mt_clamp(last,pmax,pmin,overshoot,overshoot,chroma="copy first") : last
}