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

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

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

Message » 01 Mar 2008 1:05

chambolle a écrit:Oui je comprend ce que tu dis. Normalement on definit dx et dy pourqu'ils correspondent a 1 pixel, mais ce n'est pas ce que leeperry a fait et le systeme ne fait pas des arrondis. J'ai donc cherche a savoir ce qu'il faisait.
Ok, Ok ... Tu étais un peu en avance sur moi !

Mais un peu de recherche sur google t'aurais permis de comprendre !! (paresseux, va !).

En fait, mon analyse n'était pas vraiment assez poussée (mais je me posais la même question que toi) : la frame, remappée dans un espace 0-1, 0.1 est une TEXTURE ! (magique vraiment).

La fonction "Tex2D" est ce qu'ils appellent une fonction intrinsèque du langage des shaders (HSL-je-sais-plus-quoi).

s0 est un objet de type "texture", et le deuxième argument est une position (en float2) dans la texture.

Tex2D retourne la couleur de la texture à cette position (sous forme de float4).

Je vais creuser la question, parce qu'il est vrai qu'une texture n'est qu'une matrice de float4 à la base (256*256, 512*512, etc.). J'imagine que la fonction Tex2D utilise ses propres algorythmes pour rendre une couleur si la cible n'est pas un des points de la matrice de floats (c'est quand même un peu normal pour un langage de "haut niveau").

=> Voilà pourquoi ça marche (même en mettant 0.152648956658448547 en 2ème argument), et je répète c'est un peu magique quand même.

En somme, rien de bien compliqué...
oli2
 
Messages: 1038
Inscription Forum: 09 Oct 2004 19:55
Localisation: Dijon
  • offline

Message » 01 Mar 2008 1:11

Du coup ... mon analyse de quelques posts au dessus est un peu dans le vent : une frame n'est pas un tableau de pixel de ce point vue, mais (modélisée en texture) un objet du langage...

Ceci dit ça tombe bien car je viens de visionner pendant 2 heures un film. à 1.0 j'ai trouvé l'image encore un peu "dure".

Je vais donc baisser à 0.8. Peut être que dans 2 jours j'arriverai à 0.65 :mdr: :mdr:
oli2
 
Messages: 1038
Inscription Forum: 09 Oct 2004 19:55
Localisation: Dijon
  • offline

Message » 01 Mar 2008 1:34

J'insiste ...

On voit que "jim.ro" dans son "edge Sharpen" soit :
1) n'a pas voulu s'embêter
2) ou n'a pas "vu" la différence ! (dont je parle plus haut).

Il utilise la variable "nbPixel" comme "effect_width" est utilisée dans le sharpen de base.

Faites le test de faire passer la ligne de :

#define NbPixel 1

à

#define NbPixel 0.65


et vous verrez ! L'image sera moins dure. (utilisez l'astuce de Chambolle pour marquer les contours, vous verrez l'effet immédiatement).

Du reste, comme le principe de résolution finale de la couleur du pixel a l'air plus "velu" que dans le simple sharpen, je pense qu'il faudrait le prioriser.

Je vais continuer mes analyses sur les autre Sharpen ...
oli2
 
Messages: 1038
Inscription Forum: 09 Oct 2004 19:55
Localisation: Dijon
  • offline

Message » 01 Mar 2008 1:43

oli2 a écrit:Je vais continuer mes analyses sur les autre Sharpen ...

Tu veux savoir quoi ? :mdr:
Seb.26
 
Messages: 3255
Inscription Forum: 04 Mar 2004 16:43
  • offline

Message » 01 Mar 2008 1:56

Seb.26 a écrit: Tu veux savoir quoi ? :mdr:
Comment je peux aider à faire avancer le schmmilblick ? :wink:

PMI, tu utilises quoi comme sharpen ? (avec quels paramètres)

Quelles valeurs contiennent les registres C0 et C1 ? (je suspecte des coquilles dans les sharpen "complex")
oli2
 
Messages: 1038
Inscription Forum: 09 Oct 2004 19:55
Localisation: Dijon
  • offline

Message » 01 Mar 2008 14:03

oli2 a écrit:
Seb.26 a écrit: Tu veux savoir quoi ? :mdr:
Comment je peux aider à faire avancer le schmmilblick ? :wink:

Et c'est quoi le shmmilblick ?

oli2 a écrit:PMI, tu utilises quoi comme sharpen ? (avec quels paramètres)

J'en utilise pas, je me suis amusé avec pour la déconne, mais je regarde mes films sans ...

oli2 a écrit:Quelles valeurs contiennent les registres C0 et C1 ? (je suspecte des coquilles dans les sharpen "complex")

C0 et C1 contiennent chacun un float4,
C0 = largeur de la frame, hauteur de la frame, counter, clock
C1 = le pitch horizontal, le pitch vertical, RFU, RFU

Quoi d'autre ?
Seb.26
 
Messages: 3255
Inscription Forum: 04 Mar 2004 16:43
  • offline

Message » 01 Mar 2008 20:28

SharpenFlou est la modif est SEULEMENT FAITE pour la luminance.
On fait tous les calculs normalement, mais a la fin, on prend la luminance (Y du YUV du RGB) obtenue et on reconstruit un pixel en RGB avec le U et le V inchange.

Precisement, on calcul newY et avec Cb et Cr d'origine on fabrique un nouveau RGB;

Apres test je ne vois pas la difference, mais j'ai fait un seul test su per rapide

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

#define width (p0[0])
#define height (p0[1])
#define counter (p0[2])
#define clock (p0[3])
#define one_over_width (p1[0])
#define one_over_height (p1[1])

//#define effect (0.65)
#define effect (1)

#define PI acos(-1)

float4 main( float2 tex : TEXCOORD0 ) : COLOR
{
float dx = effect/width;
float dy = effect/height;

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

float4 ori = tex2D(s0, tex);
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));

// calcul image floue (filtre gaussien)
float multipliers[9]=
{1,2,1,
2,4,2,
1,2,1};

float4 total=0;
total += c1 * multipliers[0];
total += c2 * multipliers[1];
total += c3 * multipliers[2];
total += c4 * multipliers[3];
total += ori * multipliers[4];
total += c5 * multipliers[5];
total += c6 * multipliers[6];
total += c7 * multipliers[7];
total += c8 * multipliers[8];

// 1/(1+2+1+2+4+2+1+2+1) = 1/ 16 = .0625
total *= 0.0625f;

// soustraction de l'image flou à l'image originale
total = 2*ori - total;
// soustraction de l'image flou à l'image originale
// SEULE La luminance est modifiee
// On prend le luma de total et on garde les couleurs d'origine
float y=0.299*total.r + 0.587*total.g + 0.114*total.b;
float Cbori=-0.172*ori.r -0.339*ori.g +0.511*ori.b;
float Crori=0.511*ori.r -0.428*ori.g -0.083*ori.b;

float r=y+1.371*Crori;
float g=y-0.698*Crori-0.336*Cbori;
float b=y+1.732*Cbori;

//return ori;
return float4(r,g,b,0);
}
chambolle
 
Messages: 628
Inscription Forum: 14 Nov 2006 10:52
  • offline

Message » 01 Mar 2008 20:36

J'ai pris le sharpen flou parce que avec un effect de 1 ca correspond au sharpen normal. Et un effect a 1 c'est propre (au sens des formules). En plus, ca utilise un flou gaussien et moi si je suis une bille en musique, je suis mathematicien et Gauss c'est UNE pointure en math.
Donc Hommage a Gauss. :mdr: :mdr:
chambolle
 
Messages: 628
Inscription Forum: 14 Nov 2006 10:52
  • offline

Message » 01 Mar 2008 21:10

Les règles de conversion YUV2 <-> RGB32 sont si "simples " !!?????

En attendant, la force du "luma Sharpen" est d'être intégré dans l'algo de resize dans ffdshow ...

Je ne suis pas sûr qu'on puisse vraiment "tirer" beaucoup de ce code, tant que le sharpen n'est pas dans le resize.

Quelqu'un pourrait-il fournir le code du resize bicubic intégré à MPC ? (qu'on puisse jouer avec)

PS : ça me forcerait à refaire un peu de Catmull-Rom, Splines et consort : ça me ferait les pieds !!
oli2
 
Messages: 1038
Inscription Forum: 09 Oct 2004 19:55
Localisation: Dijon
  • offline

Message » 01 Mar 2008 21:35

un resize lanczos 4X en PS a la place du bicubic d'origine.....ca r0xerait trop :mdr:
leeperry
 
Messages: 7025
Inscription Forum: 06 Jan 2007 19:44
  • offline

Message » 01 Mar 2008 21:58

Ah non, pas lui !!! :o
Un spline please !!! :mdr:

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 nov 2024 :
Nouvelles pages à découvrir sur mon site: Isolation acoustique et correction acoustique ;-)
Avatar de l’utilisateur
kazuya
Pro-Divers.
Pro-Divers.
 
Messages: 19442
Inscription Forum: 19 Oct 2004 16:37
Localisation: Région Parisienne
  • offline

Message » 01 Mar 2008 22:20

Dans l'idéal, ne faudrait il pas extraire le luma de chacun des 9 points, faire le sharpen et réinjecter le nouveau luma avec les chromas originaux ... ? ...
Seb.26
 
Messages: 3255
Inscription Forum: 04 Mar 2004 16:43
  • offline

Message » 01 Mar 2008 22:41

kazuya a écrit:Ah non, pas lui !!! :o
Un spline please !!! :mdr:


Image
leeperry
 
Messages: 7025
Inscription Forum: 06 Jan 2007 19:44
  • offline

Message » 01 Mar 2008 22:54

Seb.26 a écrit:Dans l'idéal, ne faudrait il pas extraire le luma de chacun des 9 points, faire le sharpen et réinjecter le nouveau luma avec les chromas originaux ... ? ...


Peut-etre, mais ce n'est peut-etre pas necessaire car c'est probablement equivalent. J'ai la flemme de verifier, je le ferai plus tard.
chambolle
 
Messages: 628
Inscription Forum: 14 Nov 2006 10:52
  • offline

Message » 01 Mar 2008 23:35

chambolle a écrit:
Seb.26 a écrit:Dans l'idéal, ne faudrait il pas extraire le luma de chacun des 9 points, faire le sharpen et réinjecter le nouveau luma avec les chromas originaux ... ? ...


Peut-etre, mais ce n'est peut-etre pas necessaire car c'est probablement equivalent. J'ai la flemme de verifier, je le ferai plus tard.

Ca donnerait quelque chose comme çà, Chambolle ?
------------------------------------------
sampler s0 : register(s0);
float4 p0 : register(c0);
float4 p1 : register(c1);

#define width (p0[0])
#define height (p0[1])
#define counter (p0[2])
#define clock (p0[3])
#define one_over_width (p1[0])
#define one_over_height (p1[1])

//#define effect (0.65)
#define effect (1)

#define PI acos(-1)

float4 main( float2 tex : TEXCOORD0 ) : COLOR
{
float dx = effect/width;
float dy = effect/height;

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

float4 ori = tex2D(s0, tex);
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));

// calcul image floue (filtre gaussien)
float multipliers[9]=
{1,2,1,
2,4,2,
1,2,1};

float yc1=0.299*c1.r + 0.587*c1.g + 0.114*c1.b;
float yc2=0.299*c2.r + 0.587*c2.g + 0.114*c2.b;
float yc3=0.299*c3.r + 0.587*c3.g + 0.114*c3.b;
float yc4=0.299*c4.r + 0.587*c4.g + 0.114*c4.b;
float yori=0.299*ori.r + 0.587*ori.g + 0.114*ori.b;
float yc5=0.299*c5.r + 0.587*c5.g + 0.114*c5.b;
float yc6=0.299*c6.r + 0.587*c6.g + 0.114*c6.b;
float yc7=0.299*c7.r + 0.587*c7.g + 0.114*c7.b;
float yc8=0.299*c8.r + 0.587*c8.g + 0.114*c8.b;

float total=0;
total += yc1 * multipliers[0];
total += yc2 * multipliers[1];
total += yc3 * multipliers[2];
total += yc4 * multipliers[3];
total += yori * multipliers[4];
total += yc5 * multipliers[5];
total += yc6 * multipliers[6];
total += yc7 * multipliers[7];
total += yc8 * multipliers[8];

// 1/(1+2+1+2+4+2+1+2+1) = 1/ 16 = .0625
total *= 0.0625f;

// soustraction de l'image flou à l'image originale
total = 2*yori - total;
// soustraction de l'image flou à l'image originale
// SEULE La luminance est modifiee
// On prend le luma de total et on garde les couleurs d'origine
float y=total;
float Cbori=-0.172*ori.r -0.339*ori.g +0.511*ori.b;
float Crori=0.511*ori.r -0.428*ori.g -0.083*ori.b;

float r=y+1.371*Crori;
float g=y-0.698*Crori-0.336*Cbori;
float b=y+1.732*Cbori;

//return ori;
return float4(r,g,b,0);
}
---------------------------------------

En tout cas , ce code compile, et ca affiche une image ! ( :wink: )
oli2
 
Messages: 1038
Inscription Forum: 09 Oct 2004 19:55
Localisation: Dijon
  • offline


Retourner vers Matériel PC Home-cinéma