Modérateurs: Staff Home-Cinéma, Staff Juridique • Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 7 invités

Tout ce qui concerne les logiciels lié au HC sur ordinateur (PC, Mac, Linux...)
Règles du forum
Avant de poster, merci de prendre connaissance des règles du forum : à lire avant de poster

VideoEqualizer et gestion gamma en Pixel shader

Message » 03 Jan 2015 12:31

Bonjour,

voici un petit code assez basique pour un equalizer vidéo implanté en PS.
On peut sans pb adapter le code pour mettre autant de point de contrôle qu'on veut.
L'interpolation est linéaire entre chaque point donc ça reste basique mais en général suffisant pour des corrections légères.
Je n'ai pas optimisé le code pour gagner en lisibilité.

L'exemple fourni correspond à une courbe "physiologique" en M qui fonctionne bien pour les projos avec une résiduelle élevée, un CR on:off limité et une bonne luminosité (DLP par exemple).
Ca consiste à booster le CR ds les bas et moyen IRE, à le tasser un peu puis à le rebooster un peu ds les IRE élevés et à le tasser tranquillement sur la fin.

En équivalence audio, c'est comme un léger boost ds le grave/bas médium, un petit creux ds le haut médium puis un petit boost ds l'aigu et un tassement ds l'extrême aigu.
En générale, ça booste bien l'image...

On définit les points de contrôle l1, l2, l3 etc. dans un intervalle compris entre 0 et 255 (entrées in).
les corrections d correspondantes sont des offsets verticaux par rapport à une sortie linéaire c-à-d que pour chaque point de contrôle, on a :
out = in + d
Entre les pts de contrôle, l'interpolation du niv de sortie est linéaire.

Avant cet ajustement, on peut faire une correction gamma classique en ajustant le param gamma. C'est en général comme cela que c'est implémenté sur les projos qui permettent un ajustement du coeff gamma suivi d'un ajustement fin par equalizer vidéo pour peaufiner les niveaux de sortie.

Ce pixel shader est à mettre en bout de chaîne et est uniqt adapté à des niveaux de sortie entre 0 et 255 (hdmi étendu).

A noter que le programme serait facilement adaptable pour faire une correction 1D-LUT de la courbe des gris ... Il suffit d'ajouter des corrections indépendantes pour chaque canal au lieu d'avoir des corrections identiques.

Code: Tout sélectionner
// vidéo equalizer basique par interpolation linéaire

sampler s0 : register(s0);
float4 p1 : register(c1);

// correction gamma dépendante du gamma natif du projo
#define gamma 1.0

// Video equalizer avec 7 points de contrôle entre 0 et 255
#define l1 32
#define d1 2

#define l2 64
#define d2 2.25

#define l3 96
#define d3 2.5

#define l4 128
#define d4 2.25

#define l5 160
#define d5 2.5

#define l6 192
#define d6 2.25

#define l7 224
#define d7 2

float4 main( float2 tex : TEXCOORD0 ) : COLOR
{   float4 color;
   float g1, g2, g3, g4, g5, g6, g7;
   float o1, o2, o3, o4, o5, o6, o7;

   color = pow(tex2D(s0, tex),gamma);
   
   g1 = 1.0*l1/255;   o1 = 1.0*d1/255;   
   g2 = 1.0*l2/255;   o2 = 1.0*d2/255;
   g3 = 1.0*l3/255;   o3 = 1.0*d3/255;
   g4 = 1.0*l4/255;   o4 = 1.0*d4/255;
   g5 = 1.0*l5/255;   o5 = 1.0*d5/255;
   g6 = 1.0*l6/255;   o6 = 1.0*d6/255;
   g7 = 1.0*l7/255;   o7 = 1.0*d7/255;
            
// traitement du rouge      
   if (color.r <= g1) color.r = (g1+o1)/g1*color.r;
  else if (color.r <= g2) color.r = ((g2-g1+o2-o1)*color.r + o1*g2-o2*g1)/(g2-g1);
  else if (color.r <= g3) color.r = ((g3-g2+o3-o2)*color.r + o2*g3-o3*g2)/(g3-g2);
  else if (color.r <= g4) color.r = ((g4-g3+o4-o3)*color.r + o3*g4-o4*g3)/(g4-g3);
  else if (color.r <= g5) color.r = ((g5-g4+o5-o4)*color.r + o4*g5-o5*g4)/(g5-g4);
  else if (color.r <= g6) color.r = ((g6-g5+o6-o5)*color.r + o5*g6-o6*g5)/(g6-g5);
  else if (color.r <= g7) color.r = ((g7-g6+o7-o6)*color.r + o6*g7-o7*g6)/(g7-g6);
  else color.r = ((1.0-g7-o7)*color.r + o7)/(1.0-g7);

// traitement du vert
   if (color.g <= g1) color.g = (g1+o1)/g1*color.g;
  else if (color.g <= g2) color.g = ((g2-g1+o2-o1)*color.g + o1*g2-o2*g1)/(g2-g1);
  else if (color.g <= g3) color.g = ((g3-g2+o3-o2)*color.g + o2*g3-o3*g2)/(g3-g2);
  else if (color.g <= g4) color.g = ((g4-g3+o4-o3)*color.g + o3*g4-o4*g3)/(g4-g3);
  else if (color.g <= g5) color.g = ((g5-g4+o5-o4)*color.g + o4*g5-o5*g4)/(g5-g4);
  else if (color.g <= g6) color.g = ((g6-g5+o6-o5)*color.g + o5*g6-o6*g5)/(g6-g5);
  else if (color.g <= g7) color.g = ((g7-g6+o7-o6)*color.g + o6*g7-o7*g6)/(g7-g6);
  else color.g = ((1.0-g7-o7)*color.g + o7)/(1.0-g7);

// traitement du bleu
   if (color.b <= g1) color.b = (g1+o1)/g1*color.b;
  else if (color.b <= g2) color.b = ((g2-g1+o2-o1)*color.b + o1*g2-o2*g1)/(g2-g1);
  else if (color.b <= g3) color.b = ((g3-g2+o3-o2)*color.b + o2*g3-o3*g2)/(g3-g2);
  else if (color.b <= g4) color.b = ((g4-g3+o4-o3)*color.b + o3*g4-o4*g3)/(g4-g3);
  else if (color.b <= g5) color.b = ((g5-g4+o5-o4)*color.b + o4*g5-o5*g4)/(g5-g4);
  else if (color.b <= g6) color.b = ((g6-g5+o6-o5)*color.b + o5*g6-o6*g5)/(g6-g5);
  else if (color.b <= g7) color.b = ((g7-g6+o7-o6)*color.b + o6*g7-o7*g6)/(g7-g6);
  else color.b = ((1.0-g7-o7)*color.b + o7)/(1.0-g7);
 
   return color;
}


@+
Emmanuel
Dernière édition par Emmanuel Piat le 01 Fév 2015 16:20, édité 1 fois.
Emmanuel Piat
Contributeur HCFR 2016
Contributeur HCFR 2016
 
Messages: 9871
Inscription: 10 Oct 2000 2:00
Localisation: Besançon, FRANCE
  • offline

Annonce

Message par Google » 03 Jan 2015 12:31

Publicite

 
Encart supprimé pour les membres HCFR

Message » 03 Jan 2015 13:00

Si vous tracez la courbe out = f(in) de l'équalizer :

tout segment avec une pente >45° correspond à une expansion de la dynamique d'origine.
tout segment avec une pente <45° correspond à une compression de la dynamique d'origine.

Donc si au départ de la courbe (coin inférieur gauche) on met une expansion, il faudra mettre une compression qq part pour rejoindre le coin supérieur droit. Il n'y a pas de miracle en ce bas monde...

Comme l'oeil est moins sensible ds les forts IRE, il est conseillé de mettre les compressions ds les forts IRE... Mais il faut du doigté ds ce type de réglage car l'oeil est aussi sensible à la progressivité globale de la courbe. Selon mon expérience en vidéo il vaut mieux privilégier les corrections douces et étalées plutôt de que corrections abruptes et resserrées...
Emmanuel Piat
Contributeur HCFR 2016
Contributeur HCFR 2016
 
Messages: 9871
Inscription: 10 Oct 2000 2:00
Localisation: Besançon, FRANCE
  • offline

Message » 03 Jan 2015 14:17

La courbe en M que j'ai donné est celle qui est actuellement implémentée sur mon projo qui attaque une base de 5m40. Je ne l'ai pas testé sur un autre projo donc elle est donnée simplement à titre indicatif comme une base de départ... En fait elle est implémentée dans l'equalizer vidéo interne du projo qui travaille en 10 bits (alors qu'avec le PS, on sort forcément en 8 bits à la fin en attendant que les drivers 10 bits deviennent le quotidien...). Cependant, avant de l'intégrer ds le projo, je l'ai mis au point avec le PS car c'était bcp plus convivial à faire (possibilité de tester avec et sans, de comparer plusieurs courbes en switchant d'un PS à l'autre, bref tout ce que le firmware d'un projo ne peut pas faire facilement...).
Emmanuel Piat
Contributeur HCFR 2016
Contributeur HCFR 2016
 
Messages: 9871
Inscription: 10 Oct 2000 2:00
Localisation: Besançon, FRANCE
  • offline

Message » 01 Fév 2015 16:02

Bon la courbe en M n'est plus celle qui est ds le projo. Le "petit creux ds le haut medium" a été remplacé par un petit boost supplémentaire...
Emmanuel Piat
Contributeur HCFR 2016
Contributeur HCFR 2016
 
Messages: 9871
Inscription: 10 Oct 2000 2:00
Localisation: Besançon, FRANCE
  • offline

Message » 01 Fév 2015 16:19

Voici deux PS que j'utilise en plus du video equalizer pour gérer le gamma de mon projo en mapping 16-235 => 0-255 (hdmi extended).

Le 1er permet une correction gamma progressive et linéaire de l'input (0-1) avec noir en 0 et blanc en 1 (donc mapping 0-255).
Il calcule Y' ds 0-1 en fonction de la valeur RGB du pixel puis applique une correction gamma qui varie linéairement en fonction de Y' entre les bornes corr_gamma_debut (valable pour Y'=0) et corr_gamma_fin (valable pour Y'=1). Ca permet de faire un gamma progressif.

Ensuite il applique une correction standard avec un des niveaux prédéfinis (g0, g1, g2, etc...). Ce genre de correction finale est absolument nécessaire pour adapter le gamma du projo à l'équilibre du film qui varie (hélas) selon le matériel sur lequel il a été masterisé (il n'y a pas de standard pour le gamma, c'est le bordel ambiant...). Vous pouvez créer autant de niveaux prédéfinis que vous voulez avec des #define. Une valeur supérieure à 1 assombrit l'image, une valeur inférieure à 1 l'éclaircie.

Code: Tout sélectionner
sampler s0 : register(s0);
float4 p1 : register(c1);

#define dy (p1[1])

#define corr_gamma_debut 0.927
#define corr_gamma_fin 1.07

#define g0 0.97
#define g1 1.0
#define g2 1.05
#define g3 1.1
#define g4 1.15
#define g5 1.25
#define g6 1.35

float4 main( float2 tex : TEXCOORD0 ) : COLOR
{   float4 color;
   float g;

   color = tex2D(s0, tex);
   g = (0.2126*color.r + 0.7152*color.g + 0.0722*color.b)*(corr_gamma_fin-corr_gamma_debut) + corr_gamma_debut; // pour BT709
   color = pow(color,g);
   return pow(color,g1);
}
Dernière édition par Emmanuel Piat le 02 Fév 2015 2:17, édité 4 fois.
Emmanuel Piat
Contributeur HCFR 2016
Contributeur HCFR 2016
 
Messages: 9871
Inscription: 10 Oct 2000 2:00
Localisation: Besançon, FRANCE
  • offline

Message » 01 Fév 2015 16:37

Le 2e est un gamma adaptatif au niveau des transitions avec une valeur qui dépend du niveau de la transition.

Il peut se mettre sans problème derrière n'importe quelle chaine de post-traitement avisynth/ffdshow. Il a pour but de renforcer la MTF en tenant compte de la réponse de l'oeil humain (on pourrait parler d'effet psychovisuel comme il y a de la psychoacoustique en audio).

L'effet est subtil mais néanmoins bien présent. Dans Oblivion, lorsque Cruise est assis au sommet de sa montage avec le bord de mer pour horizon et qu'il parle par radio avec sa partenaire, faite un arrêt sur image et regardez les coutures et l'aspect du cuir de sa combin au niveau du cou avec sans PS (faîtes vous des presets pour commuter avec et sans PS) ...

Les valeurs utilisées dans le PS ont été réglées complètement empiriquement à partir du rendu visuel de mon projo (LCOS pro, forte puissance, faible CR on-off, ANSI moyen) et rien ne prouve que ça soit adapté au votre... Si vous décommentez la dernière ligne, le PS affichera en rouge les zones ou il est actif. Si vous commentez les 2 "if" finaux, le PS ne fait rien...

Code: Tout sélectionner
// gamma adaptatif sur les edges - V1.0
// Filtre à employer derrière tout post-processing de sharpen

#define FinesseRendu 0 // 0: très fin, 1: fin, 2: moyen, 3: grossier

#define diff 0.50  // influe sur le rendu "3D-Like", typ :
               // 0.49 => 3D-Like + présent
               // 0.50 => 3D-Like présent
               // 0.51 => 3D-Like - présent

#define ICG 1      // Intensité de la correction gamma, de 0 à 5 typ
            // 0: faible, 5: forte

sampler s0 : register(s0);
float4 p1 : register(c1);

#define dx (p1[0])
#define dy (p1[1])
 
float4 main( float2 tex : TEXCOORD0 ) : COLOR
{
   // pixels original, flouté, corrigé
   float4 ori = tex2D(s0, tex);
   float4 flou;
   float4 cori;
   float seuil = 0.82 + FinesseRendu/100;

   // récupération de la matrice de 9 points
   // [ 1, 2 , 3 ]
   // [ 4,ori, 5 ]
   // [ 6, 7 , 8 ]

   float4 c1 = tex2D(s0, tex + float2(-dx,-dy));
   float4 c2 = tex2D(s0, tex + float2(0,-dy));
   float4 c3 = tex2D(s0, tex + float2(dx,-dy));
   float4 c4 = tex2D(s0, tex + float2(-dx,0));
   float4 c5 = tex2D(s0, tex + float2(dx,0));
   float4 c6 = tex2D(s0, tex + float2(-dx,dy));
   float4 c7 = tex2D(s0, tex + float2(0,dy));
   float4 c8 = tex2D(s0, tex + float2(dx,dy));

   // détection des contours
   // par filtre de sobel
   float delta1,delta2,value;

   // Gradient horizontal
   //   [ -1, 0 ,1 ]
   //   [ -2, 0, 2 ]
   //   [ -1, 0 ,1 ]
   delta1 = (c3 + 2*c5 + c8)-(c1 + 2*c4 + c6);

   // Gradient vertical
   //   [ -1,- 2,-1 ]
   //   [  0,  0, 0 ]
   //   [  1,  2, 1 ]
   delta2 = (c6 + 2*c7 + c8)-(c1 + 2*c2 + c3);

   // calcul
   value =  sqrt(mul(delta1,delta1) + mul(delta2,delta2)) ;

   // Gamma adaptatif à proximité d'une transition
   cori = ori;
   if ((value >= seuil-diff*1.15)&&(value <= seuil)) cori = pow(ori,1./(1-value/(10.5-ICG/10)));
   //if ((value >= seuil-diff*1.15)&&(value <= seuil)) cori = float4(1,0,0,0);

   return cori;
}
Emmanuel Piat
Contributeur HCFR 2016
Contributeur HCFR 2016
 
Messages: 9871
Inscription: 10 Oct 2000 2:00
Localisation: Besançon, FRANCE
  • offline

Message » 01 Fév 2015 18:05

oups trompé de post :oops:
Message déplacé
Dernière édition par Olivier C. le 01 Fév 2015 18:35, édité 2 fois.
Hifi: PC | DAC DIY | Enceinte Klinger-Favre D46 | Ampli Klinger-Favre | Câble HP Acrolink 7N-S1000III - modul & secteur Odeion et DIY | Traitement acoustique passif et actif
HC : Projecteur Epson TW5000 | Plasma Panasonic | PCHC | Préampli HC Onkyo
Olivier C.
 
Messages: 2781
Inscription: 19 Sep 2001 2:00
Localisation: Yutz (Nord-Est, France)
  • offline

Message » 01 Fév 2015 18:21

Emmanuel Piat a écrit:
// Gradient vertical
// [ -1,- 2,-1 ]
// [ 0, 0, 0 ]
// [ 1, 2, 1 ]



Je ne suis pas un pro de PS, donc peut-être qu'une subtilité liée à PS m'échappe, mais est-ce que par hasard il ne faudrait pas inverser les 1ère et 3ème lignes de la matrice du gradient vertical ?

// [ 1, 2, 1 ]
// [ 0, 0, 0 ]
// [ -1, -2, -1 ]
Hifi: PC | DAC DIY | Enceinte Klinger-Favre D46 | Ampli Klinger-Favre | Câble HP Acrolink 7N-S1000III - modul & secteur Odeion et DIY | Traitement acoustique passif et actif
HC : Projecteur Epson TW5000 | Plasma Panasonic | PCHC | Préampli HC Onkyo
Olivier C.
 
Messages: 2781
Inscription: 19 Sep 2001 2:00
Localisation: Yutz (Nord-Est, France)
  • offline

Message » 02 Fév 2015 1:35

J'ai pris le filtre de sobel du PS "Sharpen complex 2.hlsl". Ca me semble correct car sur les PS, je crois que l'origine du repère des textures bitmap est en haut à gauche, l'axe des abscisse vers la droite et l'axe des ordonnées vers le bas.
Emmanuel Piat
Contributeur HCFR 2016
Contributeur HCFR 2016
 
Messages: 9871
Inscription: 10 Oct 2000 2:00
Localisation: Besançon, FRANCE
  • offline

Message » 02 Fév 2015 1:40

Ah oui très juste, l'axe des y est vers le bas
Hifi: PC | DAC DIY | Enceinte Klinger-Favre D46 | Ampli Klinger-Favre | Câble HP Acrolink 7N-S1000III - modul & secteur Odeion et DIY | Traitement acoustique passif et actif
HC : Projecteur Epson TW5000 | Plasma Panasonic | PCHC | Préampli HC Onkyo
Olivier C.
 
Messages: 2781
Inscription: 19 Sep 2001 2:00
Localisation: Yutz (Nord-Est, France)
  • offline

Message » 04 Fév 2015 21:25

Les PS sont à copier ds le dossier shaders de MPC-HC (il y en a déjà plein) avec l'extension .hlsl
La compilation est automatiquement gérée par MPC-HC, il n'y a rien à faire.

Ds MPC-HC, tout se passe via un clic droit sur l'image/Effets vidéo/Sélectionner les effets... qui permet de se créer des profils, chaque profils contenant un ou plusieurs PS enchainés les uns après les autres. Une fois un profil créé, son nom apparait directement ds Effets vidéo et on peut le sélectionner. Comme cela on peut se créer des profils différents pour son moniteur, son projo, sa TV etc.

Pour se créer un profil ds "Sélectionner les effets" :

sélectionner chaque PS à enchaîner ds la liste de PS à gauche, puis cliquer ds "Ajout Après redimensionnement" (c'est ce qui consomme le moins de ressource au niveau de la CG). Ds la liste de PS actifs (en bas), vous pouvez modifier l'ordre de leur enchainement via les flèches sur le bord et les supprimer via le "x". Ensuite pour donner un nom à votre profil, tapez le ds "Présélections d'effets" puis cliquez sur le bouton sauvegarder juste en dessous : votre profil apparaitra ds Effets vidéo.

Pour vous entrainer, utilisez par exemple le PS grayscale qui affiche l'image en niveau de gris et sauvegardez le ds un profil appelé "test". Puis créez vous un autre profil sans PS appelé "Pixels shaders off". Ds "Effets vidéo" vous pourrez alors alterner entre les deux profils pour afficher ou pas votre image en niveau de gris...

L'option Effets video/Débugger les effets vidéo... permet de vérifier si la compil de chaque PS est OK.

Pour cela il faut sélectionner le PS à tester ds la liste déroulante et regarder la console en dessous qui affiche le code ASM compilé de chaque ligne du PS.
S'il y a un pb de compilation à une ligne donnée, c'est alors indiqué.
Emmanuel Piat
Contributeur HCFR 2016
Contributeur HCFR 2016
 
Messages: 9871
Inscription: 10 Oct 2000 2:00
Localisation: Besançon, FRANCE
  • offline

Message » 18 Fév 2015 9:56

Bonjour, juste un "petit" mot pour tenter d'expliquer notre vision des travaux d' Emmanuel PIAT sur l'amélioration possible d'une image et ce depuis un vidéoprojecteur assez basique (model data dans son cas c'est pour dire) via un traitement depuis un PC.
Un ami nous a emmené ma femme et moi même visiter l'univers d'Emmanuel, car il n'y pas pas d'autres mots pour décrire son installation HC si particulière!

Tout d'abord, encore merci pour ton accueil si sympathique Emmanuel !
Alors nous pénétrons dans la salle qui comporte un grand volume de 60m2 sur 3.50 de hauteur, doté d'un écran de 5m60 de base tout de même et là de suite, on se dit mon dieu, comment l'image va être sur tant de m2 ?
Emmanuel nous décrit donc la salle coté structure, côté son et pour finir l'image et met tout en route: et là, c'est la claque absolue, une image si belle avec une fluidité, une colorimétrie et des détails à couper le souffle!
Et ce avec une grandeur d'image qui nous immerge totalement sans être trop grand ce qui en est même étonnant!
C'est très certainement dû au final à la qualité globale de l' image que cela ne nous provoquent aucune gêne dans une telle immersion!

Emmanuel nous explique alors le travail fait sur l' image avec son langage heu comment dire: assez hiéroglyphique pour nous avouons le bien, mais remis à notre portée fort heureusement, alors nous avons donc bien compris tout l'acheminement (fort passionnant) et bien sûre l’intérêt!

Nous avons testés sur des extraits de films et comparé sur des mires et ce avec et sans traitement, c 'est le jour et la nuit !!!
Ce qui est troublant au final, c'est que certainement la quasi totalité des projecteurs sur le marché sont capables de produire une image de Haute Qualité et ce indépendamment du prix initial !!!

En conclusion et pour faire simple à tout cela, nous sortons de chez Emmanuel avec une bonne remise en question sur nos aprioris (nous sommes tellement conditionnés et formatés) mais il faut surtout souligner le travail extraordinaire du traitement d' Emmanuel, le résultat est vraiment-vraiment au rendez-vous !!!
Pascal et Muriel
klipschman25
 
Messages: 15
Inscription: 24 Nov 2014 22:08
  • offline

Message » 18 Fév 2015 19:11

Ce qui est troublant au final, c'est que certainement la quasi totalité des projecteurs sur le marché sont capables de produire une image de Haute Qualité et ce indépendamment du prix initial !!!


Je comprends le trouble...

C'est sûr que des traitements adaptés et bien mis en oeuvre permettent de rattraper pas mal de choses pour finalement donner un résultat assez étonnant même sur des projos franchement pas terribles sur le papier (et donc aussi ds les faits). Maintenant, il faut aussi voir les points faibles dont on parle. Avoir une bonne optique, ça aide bien par exemple. C'est le cas du Canon. Un CR on:off assez faible sur un projo lumineux, ça se "camoufle" assez bien avec des courbes gamma particulières et un gamma (légèrement) dynamique. Une résiduelle élevée (classique sur les projos pro forte puissance), on ne peut rien y faire mais on peut faire en sorte que ça ne gène pas la sensation de contraste en faisant qq concessions, etc. Et puis il y a aussi des effets psychologiques propres à la taille et à la courbure de l'image. Être immergé (ratio recul/base de l'ordre de 1.15 !) dans une image de très grande base avec une courbure sphérique crée un effet "whaouu" qu'on n'a pas l'habitude de voir ds un HC classique. Et comme tu le soulignes, il n'y a pas de gène malgré l'immersion. Par contre, on s'habitue vite :mdr:

Maintenant, il faut savoir raison garder : un projo performant à la base (comme ton SIM) fera *toujours* mieux qu'un projo qu'on aura du corriger massivement en usant de mille et une astuces. Et lui sera performant en *toute* circonstance une fois bien mis en oeuvre ds un env. dédié avec un PCHC. Par ailleurs, avec un projo performant, on peut vraiment aller très loin en terme de rendu naturel avec du post-traitement. Je ronge mon frein pour avoir ce type de projo un jour chez moi. Grâce à Mustang, j'aurais pu acquérir un tri DLP d'occaz très HDG à un prix très intéressant, mais j'ai préféré temporiser avec un modèle de transition low-cost. Ce sera pour ds qq années... En attendant, ce LCoS Canon pro fait réellement le job sur plus de 5m de base et, boosté comme il l'est, il le fait déjà très bien pour un prix inférieur à un Sony HW40 remisé (car c'est un modèle de démo)...
Emmanuel Piat
Contributeur HCFR 2016
Contributeur HCFR 2016
 
Messages: 9871
Inscription: 10 Oct 2000 2:00
Localisation: Besançon, FRANCE
  • offline

Message » 22 Déc 2015 0:12

Bonjour Emmanuel,

Tout d'abord, un grand merci pour ton "petit code basique" posté plus haut.

Depuis un certain temps je calibre des appareils JVC par le biais d'une 3DLUT qui globalement fait de très bonnes choses à mes yeux. Sur ces appareils, j'aime utiliser un gamma linéaire à 2.4
Le soucis que je rencontrais était celui des noirs bouchés. En sortie de 3DLUT je perdais généralement les barres 17 et 18 sur la mire de clipping black d'AVS. Ceci est du au fait que le noir JVC est profond et ma sonde i1D3 n'arrive pas à le lire (grosso modo de 0 à 2%).
J'ai pensé à plusieurs solutions mais la seule solution qui me paraissait intéressante (car n'augmentant pas la résiduelle) était de retoucher le gamma manuellement entre 0 et 2% justement.

En partant de ton code plus haut, j'ai réussi à obtenir exactement ce que je voulais. Voici mon PS :

Code: Tout sélectionner
// vidéo equalizer déboucheur de noirs

sampler s0 : register(s0);
float4 p1 : register(c1);

// correction gamma dépendante du gamma natif du projo
#define gamma 1.0

// Video equalizer avec 5 points de contrôle entre 0 et 255
#define l1 1
#define d1 1

#define l2 2
#define d2 1

#define l3 4
#define d3 1

#define l4 8
#define d4 1

#define l5 16
#define d5 1

float4 main( float2 tex : TEXCOORD0 ) : COLOR
{   float4 color;
   float g1, g2, g3, g4, g5;
   float o1, o2, o3, o4, o5;

   color = pow(tex2D(s0, tex),gamma);
   
   g1 = 1.0*l1/255;   o1 = 1.8*d1/255;   
   g2 = 1.0*l2/255;   o2 = 1.8*d2/255;
   g3 = 1.0*l3/255;   o3 = 1.4*d3/255;
   g4 = 1.0*l4/255;   o4 = 1.2*d4/255;
   g5 = 1.0*l5/255;   o5 = 1.0*d5/255;
           
// traitement du rouge     
   if (color.r <= g1) color.r = (g1+o1)/g1*color.r;
  else if (color.r <= g2) color.r = ((g2-g1+o2-o1)*color.r + o1*g2-o2*g1)/(g2-g1);
  else if (color.r <= g3) color.r = ((g3-g2+o3-o2)*color.r + o2*g3-o3*g2)/(g3-g2);
  else if (color.r <= g4) color.r = ((g4-g3+o4-o3)*color.r + o3*g4-o4*g3)/(g4-g3);
  else if (color.r <= g5) color.r = ((g5-g4+o5-o4)*color.r + o4*g5-o5*g4)/(g5-g4);
  else color.r = ((1.0-g5-o5)*color.r + o5)/(1.0-g5);

// traitement du vert
   if (color.g <= g1) color.g = (g1+o1)/g1*color.g;
  else if (color.g <= g2) color.g = ((g2-g1+o2-o1)*color.g + o1*g2-o2*g1)/(g2-g1);
  else if (color.g <= g3) color.g = ((g3-g2+o3-o2)*color.g + o2*g3-o3*g2)/(g3-g2);
  else if (color.g <= g4) color.g = ((g4-g3+o4-o3)*color.g + o3*g4-o4*g3)/(g4-g3);
  else if (color.g <= g5) color.g = ((g5-g4+o5-o4)*color.g + o4*g5-o5*g4)/(g5-g4);
  else color.g = ((1.0-g5-o5)*color.g + o5)/(1.0-g5);

// traitement du bleu
   if (color.b <= g1) color.b = (g1+o1)/g1*color.b;
  else if (color.b <= g2) color.b = ((g2-g1+o2-o1)*color.b + o1*g2-o2*g1)/(g2-g1);
  else if (color.b <= g3) color.b = ((g3-g2+o3-o2)*color.b + o2*g3-o3*g2)/(g3-g2);
  else if (color.b <= g4) color.b = ((g4-g3+o4-o3)*color.b + o3*g4-o4*g3)/(g4-g3);
  else if (color.b <= g5) color.b = ((g5-g4+o5-o4)*color.b + o4*g5-o5*g4)/(g5-g4);
  else color.b = ((1.0-g5-o5)*color.b + o5)/(1.0-g5);
 
   return color;
}


Le résultat est excellent. La résiduelle est toujours aussi faible, les barres 17 et 18 débouchées et le dégradé sur l'ensemble des barres clignotantes est très bon.

J'illustre avec mes relevés de voisinage du noir :

- en sortie de 3DLUT sans PS (barres 17/18 bouchées)

sansPS.jpg
(27.44 Kio) Pas encore téléchargé


- en sortie de 3DLUT avec le PS

avecPS.jpg
(28.4 Kio) Pas encore téléchargé


- à l'époque où je remontais le 5% du gamma editor JVC, la barre 17 restait bouchée et on voit bien que le dégradé était mauvais

JVCeditor.jpg
(28.82 Kio) Pas encore téléchargé
cadre 2.35:1 / JVC RS45 / HTPC / i1 Display Pro
bradpulay
 
Messages: 384
Inscription: 18 Nov 2013 19:10
Localisation: Yvelines (78)
  • offline

Message » 22 Déc 2015 13:05

Bonjour Emmanuel,
Effectivement ton code est passé à la trappe et pourtant il permet de déboucher les noirs de n'importe quel projo et ça c'est très fort ;-)
Penses tu qu'on pourrait proposer ton code à madshi pour qu'il l'intègre à madvr (dans l'hypothèse ou ça l'intéresse). C'est très simple pour lui d'intégrer un code en pixel shaders.

Merci et bonnes fêtes !
++
HiFi: Nad C320BEE + Marantz CD-63 MkII Ki Signature + Klipsch EPIC CF-3 rev3 + DAC Gustard X20U
HC: Onkyo TX-SR875 + Boston VR2 + CR8 + VRC + Caisson MJ Acoustic Ref1 MKII
TV: Panasonic P50ST50E/JVC DLA-X500 + HTPC (ffdshow+Avisynth-MPC-BE-MadVr+3dlut)
Francois76l
 
Messages: 681
Inscription: 19 Mai 2009 19:35
Localisation: Essonne
  • offline


Retourner vers Logiciel PC Home-cinéma