Post-traitement pour diffuseurs 2K
Posted: Sat Mar 03, 2012 8:51 pm
Bonjour,
Voici pour information le post-traitement que j'ai utilisé pour mes captures en 2K qui sont dans le thread du test du projecteur 4K Sony 1000ES : http://hdfever.fr/forum/viewtopic.php?f=7&t=82
Ce post suppose que vous avez les connaissances nécessaires pour mettre en oeuvre dans MPC-HC un script Avisynth via ffdshow, que vous connaissez les shaders (GPU coding) ainsi que les renderers EVR Custom Pres ou madVR. Si ce n'est pas le cas, ces tutos sont de bons points d'entrée :
http://www.homecinema-fr.com/forum/view ... t=29900151
http://www.homecinema-fr.com/forum/view ... t=29935240
J'utilise un call Avisynth dans ffdshow qui fait un upscale x4/3 en spline32 à la réso 2560x1440. Ensuite un LSF. Le downsize en 1920x1080 est fait par la CG (shaders).
Le call avisynth a été optimisé pour être entièrement multithreadé. Ce qui permet de minimiser la conso CPU. J'ai aussi réécrit LSF pour virer tout ce qui ne me servait à rien (80% du code en fait) afin d'avoir une exécution plus efficace.
call Avisynth supposant qu'il y a 8 threads dispo :
Contrairement à LSF, ici strength peut être un réel. C'est nécessaire pour les ajustements fins et ça se voit sur les diffuseurs avec une bonne MTF (moniteur LCD entre autres). La valeur 23.5 convient en général aux diffuseurs avec une bonne MTF. Si la MTF est moins bonne il faut augmenter cette valeur (jusqu'à x2 environ). Si vous avez l'impression de voir la structure des pixels, il faut diminuer cette valeur.
Pour ceux qui aiment les effets 3D où en cas de MTF vraiment moyenne, on peut renforcer l'effet du LSF en ajoutant le filtre sharpen de ffdshow après le call Avisynth. Utilisez le filtre unsharp mask qui se marie bien avec LSF et pour strengh prendre 4 à 10 maxi.
Ensuite ds le dossier Plugins de Avisynth, il faut créer un fichier "LimitedSharpenFasterHC.avsi" avec pour contenu :
La mise en oeuvre du downsize dépend du renderer dans MPC-HC :
- si c'est EVR Custom Pres, alors je conseille de sortir en RGB32 de ffdshow (avec high quality YV12 to RGB conversion actif) puis dans MPC-HC choisir comme retailler: Bicubic A=-0.60 (PS 2.0). Si la MTF du diffuseur est moyenne, vous pouvez augmenter la valeur de A.
- si c'est madVR, alors sortir de ffdshow en YV12 et choisir comme luma downscaling soit Mitchell-Netravali (MTF moyen) ou bicubic 60 (MTF correct) ou SoftCubic 70 ou 80 (excellent MTF).
Le Dithering de chroma lors de la conv YCbCr -> RGB est en général nécessaire si votre diffuseur a un bon CR (disons à partir de 2000:1) et que vous avez une salle sombre. Voici la raison en qq mots : sur les BR et les DVD l'encodage du luma après la précompensation gamma (espace Y'CbCR) est fait en 8 bit, ce qui est normalement suffisant car le fait de travailler en espace de couleur non linéaire augmente la réso du luma de manière proportionnelle à la sensibilité de l'oeil. Le fait d'utiliser 8 bits a été calculé pour être suffisant en vidéo pour une visualisation en env. clair, donc lorsque le CR du diffuseur est mauvais (largement inférieur à 100:1). En env. noir et avec des diffuseurs à fort CR, la réso de 8 bit n'est clairement plus suffisante. Cela peut alors se traduire par des effets de pallier trop important qui engendre des phénomènes de banding ou de fourmillement disgracieux notamment ds les tons sombres. En général, le dithering de chroma permet de rémédier à ces problèmes. Il adoucit néanmoins légèrement l'image.
Un point d'entrée sur ces questions de contraste et de résolution (pas franchement évident à digérer) :
http://www.poynton.com/notes/Timo/Weber ... ratio.html
Voici pour information le post-traitement que j'ai utilisé pour mes captures en 2K qui sont dans le thread du test du projecteur 4K Sony 1000ES : http://hdfever.fr/forum/viewtopic.php?f=7&t=82
Ce post suppose que vous avez les connaissances nécessaires pour mettre en oeuvre dans MPC-HC un script Avisynth via ffdshow, que vous connaissez les shaders (GPU coding) ainsi que les renderers EVR Custom Pres ou madVR. Si ce n'est pas le cas, ces tutos sont de bons points d'entrée :
http://www.homecinema-fr.com/forum/view ... t=29900151
http://www.homecinema-fr.com/forum/view ... t=29935240
J'utilise un call Avisynth dans ffdshow qui fait un upscale x4/3 en spline32 à la réso 2560x1440. Ensuite un LSF. Le downsize en 1920x1080 est fait par la CG (shaders).
Le call avisynth a été optimisé pour être entièrement multithreadé. Ce qui permet de minimiser la conso CPU. J'ai aussi réécrit LSF pour virer tout ce qui ne me servait à rien (80% du code en fait) afin d'avoir une exécution plus efficace.
call Avisynth supposant qu'il y a 8 threads dispo :
Code: Select all
SetMemoryMax(768)
nbthreads=8
ss=1.333
MT("spline36resize(round(ss * last.width /8)*8,last.height)",nbthreads,16)
MT("spline36resize(last.width,round(ss * last.height /8)*8)",nbthreads,16,splitvertical=true)
MT("LimitedSharpenFasterHC(strength=23.5)",nbthreads)
Pour ceux qui aiment les effets 3D où en cas de MTF vraiment moyenne, on peut renforcer l'effet du LSF en ajoutant le filtre sharpen de ffdshow après le call Avisynth. Utilisez le filtre unsharp mask qui se marie bien avec LSF et pour strengh prendre 4 à 10 maxi.
Ensuite ds le dossier Plugins de Avisynth, il faut créer un fichier "LimitedSharpenFasterHC.avsi" avec pour contenu :
Code: Select all
# LimitedSharpenHC() ( a modded version, 29 Oct 2005 )
#
# A multi-purpose sharpener by Didée
#
#
# Changes in this mod:
#
# - RemoveGrain >= v0.9 IS REQUIRED!!
# ==================================
#
# - a separate "undershoot" parameter, to allow for some line darkening in comic or Anime
# - Lmode=3 / on edges, limited sharpening with zero OS & US. On not-edges, limited sharpening with specified OS + LS
# - "soft" acts different now: no more boolean true/false, but instead integer 0 - 100 (or -1 -> automatic)
# instead of blurring before finding minima/maxima, it now softens the "effect-of-sharpening"
# - edgemode=-1 now shows the edgemask. (scaling still not implemented :p )
#
## - MODIFIED version using MaskTools 2.0
function LimitedSharpenFasterHC( clip clp, float "strength")
{
ox = clp.width
oy = clp.height
strength = default( strength, 40 )
overshoot = 1
undershoot= 1
soft = 0
clp.isYV12() ? clp : clp.converttoyv12()
tmp = last
edge = mt_logic( tmp.mt_edge(thY1=0,thY2=255,"8 16 8 0 0 0 -8 -16 -8 4")
\ ,tmp.mt_edge(thY1=0,thY2=255,"8 0 -8 16 0 -16 8 0 -8 4")
\ ,"max") .mt_lut("x 128 / 0.86 ^ 255 *") #.levels(0,0.86,128,0,255,false)
tmpsoft = tmp.removegrain(11,-1)
dark_limit = tmp.mt_inpand()
bright_limit = tmp.mt_expand()
minmaxavg = mt_average(dark_limit, bright_limit)
Str=string(strength/100.0)
normsharp = mt_lutxy(tmp,minmaxavg,yexpr="x x y - "+Str+" * +")
OS = string(overshoot)
US = string(undershoot)
mt_lutxy( bright_limit, normsharp, yexpr="y x "+OS+" + < y x y x - "+OS+" - 1 2 / ^ + "+OS+" + ?")
mt_lutxy( dark_limit, last, yexpr="y x "+US+" - > y x x y - "+US+" - 1 2 / ^ - "+US+" - ?")
mt_clamp(normsharp, bright_limit, dark_limit, overshoot, undershoot)
AMNT = string(soft)
AMNT2 = string(100-soft)
sharpdiff=mt_makediff(tmp,last)
sharpdiff2=mt_lutxy(sharpdiff,sharpdiff.removegrain(19,-1),
\ "x 128 - abs y 128 - abs > y "+AMNT+" * x "+AMNT2+" * + 100 / x ?")
ex=blankclip(last,width=ox,height=oy,color=$FFFFFF).addborders(2,2,2,2).coloryuv(levels="TV->PC")
\.removegrain(mode=19).mt_inpand().removegrain(mode=19).spline36resize(ox,oy,1.0,.0)
tmp = clp.spline36resize(ox,oy)
clp.isYV12() ? tmp.mergeluma(last) : tmp.mergeluma(last.converttoyuy2())
return last
}
- si c'est EVR Custom Pres, alors je conseille de sortir en RGB32 de ffdshow (avec high quality YV12 to RGB conversion actif) puis dans MPC-HC choisir comme retailler: Bicubic A=-0.60 (PS 2.0). Si la MTF du diffuseur est moyenne, vous pouvez augmenter la valeur de A.
- si c'est madVR, alors sortir de ffdshow en YV12 et choisir comme luma downscaling soit Mitchell-Netravali (MTF moyen) ou bicubic 60 (MTF correct) ou SoftCubic 70 ou 80 (excellent MTF).
Le Dithering de chroma lors de la conv YCbCr -> RGB est en général nécessaire si votre diffuseur a un bon CR (disons à partir de 2000:1) et que vous avez une salle sombre. Voici la raison en qq mots : sur les BR et les DVD l'encodage du luma après la précompensation gamma (espace Y'CbCR) est fait en 8 bit, ce qui est normalement suffisant car le fait de travailler en espace de couleur non linéaire augmente la réso du luma de manière proportionnelle à la sensibilité de l'oeil. Le fait d'utiliser 8 bits a été calculé pour être suffisant en vidéo pour une visualisation en env. clair, donc lorsque le CR du diffuseur est mauvais (largement inférieur à 100:1). En env. noir et avec des diffuseurs à fort CR, la réso de 8 bit n'est clairement plus suffisante. Cela peut alors se traduire par des effets de pallier trop important qui engendre des phénomènes de banding ou de fourmillement disgracieux notamment ds les tons sombres. En général, le dithering de chroma permet de rémédier à ces problèmes. Il adoucit néanmoins légèrement l'image.
Un point d'entrée sur ces questions de contraste et de résolution (pas franchement évident à digérer) :
http://www.poynton.com/notes/Timo/Weber ... ratio.html