SharpenComplex2.txt

(3 KB) Pobierz
// from mpc-hc

//////////////////////////////////////////////////// 
// Sharpen complex v2 (n馗essite ps >=2a)
//////////////////////////////////////////////////// 
sampler s0 : register(s0); 
float4 p0 : register(c0); 
float4 p1 : register(c1); 

// r駸olution de l'image
#define width (p0[0]) 
#define height (p0[1]) 
// "largeur" d'un pixel
#define px (p1[0])
#define py (p1[1])


//////////////////////////////////////////////////// 
// Param鑼res
//////////////////////////////////////////////////// 
  // pour le calcul du flou
#define moyenne 0.6
#define dx (moyenne*px)
#define dy (moyenne*py)

#define CoefFlou 2
#define CoefOri (1+ CoefFlou)

  // pour le sharpen
#define SharpenEdge       0.2
#define Sharpen_val0       2 
#define Sharpen_val1       ((Sharpen_val0-1) / 8.0)


//////////////////////////////////////////////////// 
float4 main( float2 tex : TEXCOORD0 ) : COLOR 
{ 
  // recup du pixel original
                float4 ori = tex2D(s0, tex); ; 

//////////////////////////////////////////////////// 
// calcul image floue (filtre gaussien) 
//////////////////////////////////////////////////// 
                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)); 

  // filtre gaussien
  //   [ 1, 2 , 1 ] 
  //   [ 2, 4 , 2 ] 
  //   [ 1, 2 , 1 ] 
  // 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 
                float4 flou = (c1+c3+c6+c8 + 2*(c2+c4+c5+c7)+ 4*ori)*0.0625; 

  // soustraction de l'image flou ・l'image originale 
                float4 cori = CoefOri*ori - CoefFlou*flou; 

//////////////////////////////////////////////////// 
// d騁ection des contours 
//////////////////////////////////////////////////// 
  // r馗upp駻ation des 9 voisins 
  //   [ c1, c2 , c3 ] 
  //   [ c4,ori , c5 ] 
  //   [ c6, c7 , c8 ] 
                c1 = tex2D(s0, tex + float2(-px,-py)); 
                c2 = tex2D(s0, tex + float2(0,-py)); 
                c3 = tex2D(s0, tex + float2(px,-py)); 
                c4 = tex2D(s0, tex + float2(-px,0)); 
                c5 = tex2D(s0, tex + float2(px,0)); 
                c6 = tex2D(s0, tex + float2(-px,py)); 
                c7 = tex2D(s0, tex + float2(0,py)); 
                c8 = tex2D(s0, tex + float2(px,py)); 

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

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

   // calcul 
                if( sqrt( mul(delta1,delta1) + mul(delta2,delta2) ) >SharpenEdge ) 
                { 
//////////////////////////////////////////////////// 
// si contour, sharpen 
                               //            return  float4(1,0,0,0);
                               return ori*Sharpen_val0 - (c1 + c2 + c3 + c4 + c5 + c6 + c7 + c8 ) * Sharpen_val1 ;  
                } 
                else 
                { 
//////////////////////////////////////////////////// 
// sinon, image corrig馥 
                               return cori; 
                } 
}

Zgłoś jeśli naruszono regulamin