11 closest(int Y, int Cb, int Cr)
15 int rgb, R, G, B, v, i;
24 //print("YCbCr: %d %d %d, RGB: %g %g %g\n", Y, Cb, Cr, r, g, b);
30 R = (rgb >> 16) & 0xFF;
31 G = (rgb >> 8) & 0xFF;
32 B = (rgb >> 0) & 0xFF;
33 diff = (R-r)*(R-r) + (G-g)*(G-g) + (B-b)*(B-b);
34 y1 = 0.5870*G + 0.114*B + 0.299*R;
40 if(Y==256-16 && y1<256-16)
42 // if(Cb==0 && cb1!=0)
44 if(Cb==256-16 && cb1<256-16)
46 // if(Cr==0 && cr1!=0)
48 if(Cr==256-16 && cr1<256-16)
50 //print("%d %d %d\n", R, G, B);
61 main(int argc, char *argv[])
67 uchar close[16*16*16];
69 //print("%d\n", closest(atoi(argv[1]), atoi(argv[2]), atoi(argv[3])));
73 print("uint ycbcrmap[256] = {\n");
81 Y = 0.5870*g + 0.114*b + 0.299*r;
82 Cr = (r-Y)/1.402 + 128.;
83 Cb = (b-Y)/1.772 + 128.;
84 if(Y<0. || Y>=256. || Cr<0. || Cr>=256. || Cb<0. || Cb>=256.)
85 print("bad at %d: %d %d %d; %g %g %g\n", i, r, g, b, Y, Cb, Cr);
89 print("0x%.6ulX, ", (r<<16) | (g<<8) | b);
96 print("uchar closestycbcr[16*16*16] = {\n");
97 for(y=0; y<256; y+=16)
98 for(cb=0; cb<256; cb+=16)
99 for(cr=0; cr<256; cr+=16)
100 close[(cr/16)+16*((cb/16)+16*(y/16))] = closest(y, cb, cr);
102 /*weird: set white for nearly white */
103 for(cb=128-32; cb<=128+32; cb+=16)
104 for(cr=128-32; cr<=128+32; cr+=16)
105 close[(cr/16)+16*((cb/16)+16*(255/16))] = 0;
106 /*weird: set black for nearly black */
107 for(cb=128-32; cb<=128+32; cb+=16)
108 for(cr=128-32; cr<=128+32; cr+=16)
109 close[(cr/16)+16*((cb/16)+16*(0/16))] = 255;
111 for(i=0; i<16*16*16; i++){
114 print("%d,", close[i]);