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;i 255) 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;i 0.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;i 0) { 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