Beta3 et probablement la dernière pour diffuseurs 720p car après de longs comparos hier avec LSF (strength 40), je suis plutôt satisfait du résultat.
Changements :
- Disparition param ForceGamma (codé en dur ds les calculs)
- nouveau param FinesseRendu 0 => 0: très fin, 1: fin, 2: moyen, 3: grossier
C'est en gros la largeur du trait (0 correspond à un comportement très proche de LSF)
- nouveau param SeuilBruit
c'est un seuil pour éviter l'accentuation par masque flou sur le bruit de fond et les petits détails dans les textures
La valeur par défaut (0.15) marche pour tout. Si jamais dans un BR déjà très propre et très "sharpenisé", vous voyez apparaitre des artefacts dans les tous petits détails (du style des textures en mouvement qui manquent de stabilité), vous pouvez pousser à 0.2 pour ne pas traiter ces détails
- modif param diff : comme j'ai modifié les réglages internes ds le filtre, l'échelle pour diff est désormais la suivante (c'est en gros l'intensité du trait) :
// 0.49 => 3D-Like + présent
// 0.50 => 3D-Like présent
// 0.51 => 3D-Like - présent
- Code: Tout sélectionner
// SuperResolution720p - Beta3
// Emmanuel - 31/03/2010
// Filtre de super résolution adapté aux diffuseurs 720p
// Ce filtre est conçu comme un filtre de post-traitement d'un
// filtre de sharpen tel que le filtre "unsharp mask" de ffdshow
#define FinesseRendu 0 // 0: très fin, 1: fin, 2: moyen, 3: grossier
#define SeuilBruit 0.15 // pour éviter la remontée du bruit de fond et
// l'accentuation de petits détails dans les textures
// Entre 0.1 et 0.2
#define diff 0.49 // influe sur le rendu "3D-Like"
// Après unsharp mask à 19 dans ffdshow:
// 0.49 => 3D-Like + présent
// 0.50 => 3D-Like présent
// 0.51 => 3D-Like - présent
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));
// 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 > SeuilBruit) && (value < seuil-diff)) cori = 2*cori - flou;
return cori;
}
@+
Emmanuel