Modérateurs: Modération Forum Home-Cinéma, Le Bureau de l’Association HCFR • Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 46 invités

Toutes les solutions à base d'ordinateur (PC, Mac, Linux...)

[MPC] Filtre(s) Pixels shaders ...

Message » 15 Avr 2009 13:23

Ok, donc le shader, c'est plus du traitement photo (chaque image d'une séquence traitée individuellement)
Merci pour la précision.

[HS]
Sinon, j'ai pu faire fonctionner le motion frame interpolation avec avisynth sous windows 7, c'était bien compatible, juste une étape oubliée ;)
Ca marche plutôt bien avec reclock et powerstrip bien réglés. Plus de saccades, du moins quand le fichier est bien encodé.
Ca crée des artefacts/déformations d'image (algo pas parfait), ça créé ces même artefacts autour des sous titres, mais le confort d'une image qui saccade pas
est vraiment apréciable.[/HS]

Merci beaucoup ;)
David7578
 
Messages: 15
Inscription Forum: 09 Avr 2009 12:19
  • offline

Message » 15 Avr 2009 14:46

Bonjour.

Dans MPC-HC j'ai mis en œuvre le shader de GAMUT expliqué dans tuto de tobal et calculé via la moulinette excel d'AVS. Ça marche vraiment bien.

Ma config HC est un peu particulière car j'utilise une lentille désanamorphisante quand le ratio de l'image est en 2.35, je retire la lentille pour les films avec un ratio inférieur. La lentille influe sur la calibration je suis donc obligé d'avoir une correction de GAMUT sans lentille et une correction de GAMUT avec lentille.

La difficulté est de pouvoir déterminer le nombre de lignes actives en hauteur donc entre les bandes noires. Pour le nombre de pixel ça n'a pas d'importance car c'est fixe : 1920 ou 1280

Est-ce que quelqu'un peut jeter un oeil sur le PS que je compte faire ? Je ne sais pas si height vaut la hauteur de l'image hors bande noire ou si elle inclue les bandes noires ( je pense que c'est sans )

Merci :)

Code: Tout sélectionner
sampler s0 : register(s0);
float4 p0 : register(c0);

#define width (p0[0])
#define height (p0[1])

//GAMUT_1 = correction quand lentille
static float4x4 r2r_1 =
{
0.942611143071864,-0.0080608762551173,0.0654497331832544,0,
0.0247351359332918,0.975048867751808,0.000215996314904491,0,
0.0150122600076486,0.0933459517699223,0.891641788222431,0,
0, 0, 0, 0
};

//GAMUT_2 = correction sans lentille
static float4x4 r2r_2 =
{
0.942611143071864,-0.0080608762551173,0.0654497331832544,0,
0.0247351359332918,0.975048867751808,0.000215996314904491,0,
0.0150122600076486,0.0933459517699223,0.891641788222431,0,
0, 0, 0, 0
};

float4 main(float2 tex : TEXCOORD0) : COLOR
{

 //SI le ratio largeur/hauteur est sup. à 2.3 alors GAMUT_1
 if ( ( width / height) >= 2.3 ) {
   
    float4 c0 = tex2D(s0, tex);
    c0 = pow(c0, 1/0.45);
    c0 = mul(r2r_1, c0);
    c0 = saturate(c0);
    c0 = pow(c0, 0.45);
    }
  //sinon GAMUT_2
  Else {
 
    float4 c0 = tex2D(s0, tex);
    c0 = pow(c0, 1/0.45);
    c0 = mul(r2r_2, c0);
    c0 = saturate(c0);
    c0 = pow(c0, 0.45);
  }
   
    return c0;
}
alex_t
Membre HCFR Contributeur
Membre HCFR Contributeur
 
Messages: 10852
Inscription Forum: 29 Oct 2005 23:04
Localisation: Ile-de-France, 77
  • offline

Message » 16 Avr 2009 12:01

Dialhot a écrit:Sauf erreur en PS on travaille en spatial et pas en temporel (on a connaissance que de la frame courrante).

Ouaip ... j'y avait pensé il y a un moment, mais les codeurs de MPC veulent pas ajouter plusieurs frames ... quel régal si on avait les frames "n-1" et "n-2" pour les scripts ... à nous les convo3D ...

Si tout le monde le demande, ils le feront peut être ... :mdr:
Seb.26
 
Messages: 3256
Inscription Forum: 04 Mar 2004 16:43
  • offline

Message » 17 Avr 2009 7:53

Seb.26 a écrit:
Dialhot a écrit:Sauf erreur en PS on travaille en spatial et pas en temporel (on a connaissance que de la frame courrante).

Ouaip ... j'y avait pensé il y a un moment, mais les codeurs de MPC veulent pas ajouter plusieurs frames ... quel régal si on avait les frames "n-1" et "n-2" pour les scripts ... à nous les convo3D ...

Si tout le monde le demande, ils le feront peut être ... :mdr:


et n+1, n+2 ... n+i pour le l'estimation de mouvement...

Les processeurs deviennent si performants, la mémoire si peu chère, que c'est dommage de ne pas en avoir au moins la possibilité.
Ca permet de garder un lecteur performant et compatible, léger aussi, mais qui peut à la demande faire des traitements plus lourds.
David7578
 
Messages: 15
Inscription Forum: 09 Avr 2009 12:19
  • offline

Message » 17 Avr 2009 10:23

David7578 a écrit:Les processeurs deviennent si performants, la mémoire si peu chère, que c'est dommage de ne pas en avoir au moins la possibilité.

On est en train de parler de PS. Le pipeline des shadders n'est pas si étendu que cela. Pour certaines cartes (serie 38..), il est déja difficile d'utiliser des shadders un peu evolués style "sharpen complex" qui n'a pourtant besoin que d'une copie de l'image courrante. Si c'est pour travailler sans accélaration matérielle, avisynth (via ffdshow) fait très bien tout cela.
Avatar de l’utilisateur
Dialhot
Supervision Technique Forum
Supervision Technique Forum
 
Messages: 30683
Inscription Forum: 25 Aoû 2005 13:26
Localisation: Doral, FL
  • offline

Message » 17 Avr 2009 11:22

David7578 a écrit:et n+1, n+2 ... n+i pour le l'estimation de mouvement...

De l'estimation de mouvement en PS ??? ... :lol:
Seb.26
 
Messages: 3256
Inscription Forum: 04 Mar 2004 16:43
  • offline

Message » 22 Avr 2009 20:54

Hello,

Super le shader de correction de convergence, mais j'ai trouvé un petit bug dedans :

Il faut remplacer :
res.b = tex2D(s0,tex+float2(B_Offset.y*dx,B_Offset.y*dy)).b;
par
res.b = tex2D(s0,tex+float2(B_Offset.x*dx,B_Offset.y*dy)).b;

Ce qui donne :

Code: Tout sélectionner
//----------------------------
//pixel shader: 6blocks
//

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

#define dx (p1[0])
#define dy (p1[1])

// A B C
// D E F


#define A_R_Offset_X 0.0
#define A_R_Offset_Y 0.0
#define A_G_Offset_X 0.0
#define A_G_Offset_Y 0.0
#define A_B_Offset_X 0.0
#define A_B_Offset_Y 0.0

#define B_R_Offset_X 0.0
#define B_R_Offset_Y 0.0
#define B_G_Offset_X 0.0
#define B_G_Offset_Y 0.0
#define B_B_Offset_X 0.0
#define B_B_Offset_Y 0.0

#define C_R_Offset_X 0.0
#define C_R_Offset_Y 0.0
#define C_G_Offset_X 0.0
#define C_G_Offset_Y 0.0
#define C_B_Offset_X 0.0
#define C_B_Offset_Y 0.0

#define D_R_Offset_X 0.0
#define D_R_Offset_Y 0.0
#define D_G_Offset_X 0.0
#define D_G_Offset_Y 0.0
#define D_B_Offset_X 0.0
#define D_B_Offset_Y 0.0

#define E_R_Offset_X 0.0
#define E_R_Offset_Y 0.0
#define E_G_Offset_X 0.0
#define E_G_Offset_Y 0.0
#define E_B_Offset_X 0.0
#define E_B_Offset_Y 0.0

#define F_R_Offset_X 0.0
#define F_R_Offset_Y 0.0
#define F_G_Offset_X 0.0
#define F_G_Offset_Y 0.0
#define F_B_Offset_X 0.0
#define F_B_Offset_Y 0.0

float4 RGBOffset(float2 tex, float2 R_Offset, float2 G_Offset, float2 B_Offset){
   float4 res = 0;

   res.r = tex2D(s0,tex+float2(R_Offset.x*dx,R_Offset.y*dy)).r;
   res.g = tex2D(s0,tex+float2(G_Offset.x*dx,G_Offset.y*dy)).g;
   res.b = tex2D(s0,tex+float2(B_Offset.x*dx,B_Offset.y*dy)).b;

   return( res );
}


float4 main(float2 tex : TEXCOORD0) : COLOR
{
float4 res;

if (tex.y < 0.5){
if (tex.x < 0.33){
//res=float4(1,0,0,0);
res=RGBOffset(tex,float2(A_R_Offset_X,A_R_Offset_Y),float2(A_G_Offset_X,A_G_Offset_Y),float2(A_B_Offset_X,A_B_Offset_Y));
}
if (tex.x >= 0.33 && tex.x < 0.66){
//res=float4(0,1,0,0);
res=RGBOffset(tex,float2(B_R_Offset_X,B_R_Offset_Y),float2(B_G_Offset_X,B_G_Offset_Y),float2(B_B_Offset_X,B_B_Offset_Y));
}
if (tex.x >= 0.66){
//res=float4(0,0,1,0);
res=RGBOffset(tex,float2(C_R_Offset_X,C_R_Offset_Y),float2(C_G_Offset_X,C_G_Offset_Y),float2(C_B_Offset_X,C_B_Offset_Y));
}
} else {
if (tex.x < 0.33){
//res=float4(0.5,0,0,0);
res=RGBOffset(tex,float2(D_R_Offset_X,D_R_Offset_Y),float2(D_G_Offset_X,D_G_Offset_Y),float2(D_B_Offset_X,D_B_Offset_Y));
}
if (tex.x >= 0.33 && tex.x < 0.66){
//res=float4(0,0.5,0,0);
res=RGBOffset(tex,float2(E_R_Offset_X,E_R_Offset_Y),float2(E_G_Offset_X,E_G_Offset_Y),float2(E_B_Offset_X,E_B_Offset_Y));
}
if (tex.x >= 0.66){
//res=float4(0,0,0.5,0);
res=RGBOffset(tex,float2(F_R_Offset_X,F_R_Offset_Y),float2(F_G_Offset_X,F_G_Offset_Y),float2(F_B_Offset_X,F_B_Offset_Y));
}
}
return res;
}


Par contre, est-ce que ça serait compliqué de faire exactement la même chose, mais sur 25 zones au lieu de 9 ? (5x5 donc)
Avec mon projo qui a des convergences foireuses qui varient suivant l'emplacement, 9 zones c'est pas assez fin, surtout depuis que je suis obligé d'utiliser le lens shift pour que le projo soit à un emplacement plus WAF-compatible...

stoub2000
stoub2000
 
Messages: 700
Inscription Forum: 03 Juin 2002 19:26
Localisation: Toulouse
  • offline

Message » 30 Mar 2010 9:37

shader SuperRésolution 720p :

Shader dédié aux diffuseurs 720p (version 1080p en préparation) qui a pour objectif de faire croire que la réso augmente de 10 à 30% en gros.

A mettre uniquement en bout de chaine de traitement.

Principe :

le shader n'agit pas sur les maxima ou minima des edges vu qu'en principe ceux-ci ont déjà été boostés avant par des algos de sharpen. Par contre il modifie de manière adaptative le gamma à proximité de ces maxima ou minima. Plus la transition est forte et + le gamma est boosté. Loin des transitions, le shader accentue légèrement les textures par masque flou. La combi des deux donne l'effet SuperRésolution. L'effet est subtil mais se voit bien sur les plans larges à forte profondeur de champ.

Deux versions sont dispo, dont une pour les ANIME qui sature un peu + les couleurs.

Deux paramètres sont réglables : ForceGamma et diff (voir code). Les réglages par défauts sont ceux qui me plaisent le + sur mon écran LCD de test.

Version Film
Code: Tout sélectionner
// SuperResolution720p - Beta1
// Emmanuel - 27/03/2010
// Filtre de super résolution adapté aux diffuseurs 720p


#define ForceGamma 0.5   // entre 0 et 1 (0: modif gamma faible, 1: forte)
#define diff 0.58         // influe sur le rendu "3D-Like"
                  // 0.2 => 3D-Like + présent
                  // 0.7 => 3D-Like - présent
                  // typ: 0.58 sur bon BD (après un unsharp mask à 19)

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

#define dx (p1[0])
#define dy (p1[1])
 
float4 main( float2 tex : TEXCOORD0 ) : COLOR
{
   #define seuil 0.85    // ne devrait pas être modifié !

   // pixels original, flouté, corrigé, final
   float4 ori = tex2D(s0, tex);
   float4 flou;
   float4 cori;
   float4 final;

   // 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-ForceGamma)));

   // Masque flou pour renforcer les textures

   // calcul image floue (filtre gaussien)
   // pour normaliser les valeurs, il faut diviser par la somme des coef
   // 1/(1+2+1+2+4+2+1+2+1) = 1/ 16 = .0625

   flou = (c1+c3+c6+c8 + 2*(c2+c4+c5+c7)+ 4*cori)*0.0625;

   // Accentuation des textures si on est loin d'un bord
   if (value > seuil-diff)  final = cori;  else final = 2*cori - flou;
   return final;
}


Version ANIME

Code: Tout sélectionner
// SuperResolution720p - Beta1
// Emmanuel - 27/03/2010
// Filtre de super résolution adapté aux diffuseurs 720p


#define ForceGamma 0.5   // entre 0 et 1 (0: modif gamma faible, 1: forte)
#define diff 0.58         // influe sur le rendu "3D-Like"
                  // 0.2 => 3D-Like + présent
                  // 0.7 => 3D-Like - présent
                  // typ: 0.58 sur bon BD (après un unsharp mask à 19)

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

#define dx (p1[0])
#define dy (p1[1])
 
float4 main( float2 tex : TEXCOORD0 ) : COLOR
{
   #define seuil 0.85    // ne devrait pas être modifié !

   // pixels original, flouté, corrigé, final
   float4 ori = tex2D(s0, tex);
   float4 flou;
   float4 cori;
   float4 final;

   // 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 hormis sur le max d'une transition
   if (value >seuil) cori = ori;
   else cori = pow(ori,1./(1-value/(10-ForceGamma)));

   // Masque flou pour renforcer les textures

   // calcul image floue (filtre gaussien)
   // pour normaliser les valeurs, il faut diviser par la somme des coef
   // 1/(1+2+1+2+4+2+1+2+1) = 1/ 16 = .0625

   flou = (c1+c3+c6+c8 + 2*(c2+c4+c5+c7)+ 4*cori)*0.0625;

   // Accentuation des textures si on est loin d'un bord
   if (value > seuil-diff)  final = cori;  else final = 2*cori - flou;
   return final;
}


Exemple sur BR avec juste un unsharp mask à 19 ds ffdshow (sortie YV12) et un downsize bilinear 1080p->720p ds MPCHC en EVR Custom.

Iron man : Bon BR
Walk the line : BR correct
Into the Wild : BR pourri
L'age de Glace 3 : BR moyen (pour un animé)

Image
Dernière édition par Emmanuel Piat le 30 Mar 2010 10:04, édité 2 fois.
Emmanuel Piat
Contributeur HCFR 2016
 
Messages: 10347
Inscription Forum: 10 Oct 2000 2:00
Localisation: Besançon, FRANCE
  • offline

Message » 30 Mar 2010 9:42

Cliquez pour avoir l'image en zoom 100%

Image

Image
Emmanuel Piat
Contributeur HCFR 2016
 
Messages: 10347
Inscription Forum: 10 Oct 2000 2:00
Localisation: Besançon, FRANCE
  • offline

Message » 30 Mar 2010 9:43

Image
Emmanuel Piat
Contributeur HCFR 2016
 
Messages: 10347
Inscription Forum: 10 Oct 2000 2:00
Localisation: Besançon, FRANCE
  • offline

Message » 30 Mar 2010 9:45

Image

Image
Emmanuel Piat
Contributeur HCFR 2016
 
Messages: 10347
Inscription Forum: 10 Oct 2000 2:00
Localisation: Besançon, FRANCE
  • offline

Message » 30 Mar 2010 9:50

Image

Image

Image

Image

Image

Image

Image

Image
Emmanuel Piat
Contributeur HCFR 2016
 
Messages: 10347
Inscription Forum: 10 Oct 2000 2:00
Localisation: Besançon, FRANCE
  • offline

Message » 30 Mar 2010 10:11

Si tu ne joins pas l'originale ça va être difficile de se rendre compte ! :mdr:

C'est quelle version de shader ? 2.0 ?

La configuration dans mon profil


Etude et réalisation de Cinémas Privés, Calibration A/V, conception enceintes et Config Kaz 9 pour PCHC.
NEW mars 2024 :
Nouvel article de blog : Réflexions sur les préamplis audio-vidéo (haut de gamme) ;-)
Avatar de l’utilisateur
kazuya
Pro-Divers.
Pro-Divers.
 
Messages: 19373
Inscription Forum: 19 Oct 2004 16:37
Localisation: Région Parisienne
  • offline

Message » 30 Mar 2010 10:17

Ok, je viens de tester. C'est pas mal, mais ça modifie trop le gamma à mon goût. Genre des plans d'herbes entiers qui s'assombrissent en arrière plan.
Sinon pour quelqu'un qui peut pas utiliser LSF c'est intéressant !

La configuration dans mon profil


Etude et réalisation de Cinémas Privés, Calibration A/V, conception enceintes et Config Kaz 9 pour PCHC.
NEW mars 2024 :
Nouvel article de blog : Réflexions sur les préamplis audio-vidéo (haut de gamme) ;-)
Avatar de l’utilisateur
kazuya
Pro-Divers.
Pro-Divers.
 
Messages: 19373
Inscription Forum: 19 Oct 2004 16:37
Localisation: Région Parisienne
  • offline

Message » 30 Mar 2010 10:31

Je confirme, LSF fait le même effet quasiment et sans toucher au gamma :

Juste unsharp mask @10

Image

unsharp + super résolution

Image

unsharp + LSF

Image

Juste unsharp mask @10

Image

unsharp + super résolution

Image

unsharp + LSF

Image

La configuration dans mon profil


Etude et réalisation de Cinémas Privés, Calibration A/V, conception enceintes et Config Kaz 9 pour PCHC.
NEW mars 2024 :
Nouvel article de blog : Réflexions sur les préamplis audio-vidéo (haut de gamme) ;-)
Avatar de l’utilisateur
kazuya
Pro-Divers.
Pro-Divers.
 
Messages: 19373
Inscription Forum: 19 Oct 2004 16:37
Localisation: Région Parisienne
  • offline


Retourner vers Matériel PC Home-cinéma