www.pudn.com > jseg.rar > imgutil.c


#include 
#include 
#include 
#include 
#include "mathutil.h"
#include "imgutil.h"

void yuv2rgb(unsigned char *img,int size)
{
  int crv,cbu,cgu,cgv,r,g,b,y,u,v,i;

  crv = 117504;
  cbu = 138453;
  cgu = 13954;
  cgv = 34903;
/*
  crv = 104597;
  cbu = 132201;
  cgu = 25675;
  cgv = 53279;
*/

  for (i=0;i>16;
    g = (y - cgu*u - cgv*v + 32768)>>16;
    b = (y + cbu*u         + 32786)>>16;
    if (r>255) r=255; if (r<0) r=0;
    if (g>255) g=255; if (g<0) g=0;
    if (b>255) b=255; if (b<0) b=0;
    img[i] = (unsigned char) r;
    img[i+1] = (unsigned char) g;
    img[i+2] = (unsigned char) b;
  }
}

void rgb2yuv(unsigned char *img,int size)
{
  int r,g,b,i;
  double y,u,v;

  for (i=0;i255) y=255; if (y<0) y=0;
    if (u>255) u=255; if (u<0) u=0;
    if (v>255) v=255; if (v<0) v=0;

    img[i] = (unsigned char) round(y);
    img[i+1] = (unsigned char) round(u);
    img[i+2] = (unsigned char) round(v);
  }
}

void rgb2luv(unsigned char *RGB,float *LUV,int size)
{
  int i;
  double x,y,X,Y,Z,den,u2,v2,X0,Z0,Y0,u20,v20,r,g,b;

  X0 = (0.607+0.174+0.201);
  Y0 = (0.299+0.587+0.114);
  Z0 = (      0.066+1.117);

/* Y0 = 1.0 */
  u20 = 4*X0/(X0+15*Y0+3*Z0);
  v20 = 9*Y0/(X0+15*Y0+3*Z0);

  for (i=0;i0.008856) LUV[i] = (float) (116*pow(Y,1.0/3.0)-16);
    else LUV[i] = (float) (903.3*Y);
    LUV[i+1] = (float) (13*LUV[i]*(u2-u20));
    LUV[i+2] = (float) (13*LUV[i]*(v2-v20));
  }
}

void luv2rgb(unsigned char *RGB,float *LUV,int size)
{
  int i,k;
  double x,y,X,Y,Z,den,u2,v2,X0,Z0,Y0,u20,v20,vec[3];

  X0 = (0.607+0.174+0.201);
  Y0 = (0.299+0.587+0.114);
  Z0 = (      0.066+1.117);

/* Y0 = 1.0 */
  u20 = 4*X0/(X0+15*Y0+3*Z0);
  v20 = 9*Y0/(X0+15*Y0+3*Z0);

  for (i=0;i0)
    {
      if (LUV[i]<8.0) Y=((double) LUV[i])/903.3;
      else Y=pow(( ((double) LUV[i]) +16)/116.0,3.0);
      u2=((double) LUV[i+1])/13.0/((double) LUV[i])+u20;
      v2=((double) LUV[i+2])/13.0/((double) LUV[i])+v20;

      den = 6+3*u2-8*v2;
      if (den<0) printf("den<0\n");
      if (den==0) printf("den==0\n");
      x = 4.5*u2/den;
      y = 2.0*v2/den;

      X=x/y*Y;
      Z=(1-x-y)/y*Y;
    }
    else { X=0.0; Y=0.0; Z=0.0; }

    vec[0] = ( 3.240479*X-1.537150*Y-0.498536*Z);
    vec[1] = (-0.969256*X+1.875992*Y+0.041556*Z);
    vec[2] = ( 0.055648*X-0.204043*Y+1.057311*Z);
    for (k=0;k<3;k++)
    {
      if  (vec[k]<=0.018) vec[k] = 255*4.5*vec[k];
      else vec[k] = 255*(1.099*pow(vec[k],0.45)-0.099);
      if (vec[k]>255) vec[k] = 255;
      else if (vec[k]<0) vec[k] = 0;
      RGB[i+k] = (unsigned char) round(vec[k]);
    }
  }
}

void extendbounduc(unsigned char *img,unsigned char *imgout,int ny,int nx,int offset,int dim)
{
  int iy,ix,i,j,sy,ey,sx,ex,nx2,jump,loc;
  unsigned char f1,f2;

  nx2 = nx+2*offset;
  sy = offset; ey = ny+offset;
  sx = offset; ex = nx+offset;
  jump = 2*offset*dim;

  i = 0;
  loc = LOC(sy,sx,0,nx2,dim);
  for (iy=sy;iy