#include #include #include #include typedef struct control_data { unsigned int edge; unsigned int sizey; int et; double a; int edon; int dither; int lpfon; double pw; double pw2; int bun; int kmon; double lpfk; double per; double bai; int omh; int cs; double t; int div; int hasyori; double r; double g; double b; double gamma; double bgamma; double rgamma; double ygamma; char InputFileName[128]; char OutputFileName[128]; } CNTL; int hsize; int vsize; char inputfile[128]; char outputfile[128]; //#include "mediancut8.c" #define RD 0 #define GD 0 #define BD 0 #define HASYORI 20 #define MHASYORI 250 #define IROSUU 256 #define YGAMMA 1.0 #define YMULT 6.0//1.0*255.0/pow(255.0,YGAMMA)*6.0 #define RMULT 3.0//1.0*3.0 #define BMULT 1.0//1.0*1.0 #define EDGETH 30//25 void print_help( CNTL *ptr ) { fprintf( stderr, "Usage: bmp_color_reducer[options]\n" ); fprintf( stderr, "\toptions: \n" ); fprintf( stderr, "\t -help : \n" ); fprintf( stderr, "\t -i : input file name(BMP 24bit true color)\n" ); fprintf( stderr, "\t -o : outputfilename(BMP 8bit pallet color [kakutyousi .bmp ga jidoude tukerareru]\n" ); fprintf( stderr, "\t -edge : edge kensyutu no houhou sentaku 0:rinsetu gaso kan sabun sqrt(suihei^2+suityoku^2) 1,2=rinsetu gasokansabun dokuritu 3=sobel filter 4=edgerasisa 5=sobel filter2 6=rinsetu gaso kan sabun sqrt2, 4 wo sentaku sitatiki kmean ha off surukoto\n" ); // fprintf( stderr, "\t -et : edge threshold -edge 0,1,2,3,5 notoki (0<=et<=255) et ijyou wo edge to minasu -et 512 tositeokeba edge kensyutusinai gennsyoku ga dekiru\n" ); fprintf( stderr, "\t -et : edge threshold (0<=et<=255) et ijyou wo edge to minasu -et 512 tositeokeba edge kensyutusinai gennsyoku ga dekiru\n" ); fprintf( stderr, "\t -bai : edgerasisa -edge 4 no toki yuukou edge no ookisa wo bai bai suru tuneni 1.0 suisyou 0.0 de edgerasisa off 1 yori ookihodo yowai edge made mushisuru \n" ); fprintf( stderr, "\t -kmon : kmean onoff switch 1:on 0:off\n" ); fprintf( stderr, "\t -edon : error diffusion onoff switch 1:on ,RGB space de dither 0:off 2:on ,henkan iro kuukan de dither \n" ); fprintf( stderr, "\t -r : R (v,B) zahyoujiku kakudairitu R3 V4 v1 B1 G4\n" ); fprintf( stderr, "\t -g : G (L,Y) zahyoujiku kakudairitu G6 Y4 L1 L1 C4\n" ); fprintf( stderr, "\t -b : B (u,A) zahyoujiku kakudairitu B1 U3 u1 A1 S4\n" ); fprintf( stderr, "\t -cs : color space 0:RGB 1:Lab 2:Luv 3:YUV 4.GCS(iZYINSgamma) 5.YUV(S ji gamma -a option yuukou) 6.RGB(S ji gamma -a option yuukou) 7.RGB(iZyins gamma) 8.YUV(iZyins gamma) 9.YUV(izyins irokuukan gamma ha nashi)\n" ); fprintf( stderr, "\t -gamma : RGB no green gamma. 1yori ookiito akaruibubunn ga komakaku iro wo kubetsushi kuraibubunn ga oozappa ni naru\n" ); fprintf( stderr, "\t -rgamma : RGB no red gamma. 1yori ookiito akaruibubunn ga komakaku iro wo kubetsushi kuraibubunn ga oozappa ni naru\n" ); fprintf( stderr, "\t -bgamma : RGB no blue gamma. 1yori ookiito akaruibubunn ga komakaku iro wo kubetsushi kuraibubunn ga oozappa ni naru\n" ); fprintf( stderr, "\t -ygamma : YUV only Y no gamma. LAB.Luv deha 1.0 ni surukoto.1yori ookiito akaruibubunn ga komakaku iro wo kubetsushi kuraibubunn ga oozappa ni naru\n" ); fprintf( stderr, "\t -omh : cut method 0:ohtsu 1:median 2:heikin 3.syousuu_ohtsu 4.syousuu_ohtsu2\n" ); fprintf( stderr, "\t -hasyori : RGB mode only. dark color threshold 20 kurai ga ii. RGB igaiha 0 ni surukoto.\n" ); fprintf( stderr, "\t -dither : dither mode 0:floyd steinburg 1:Sierra Lite 2: Stucki 3.Jarvis,Judice and Nink\n" ); fprintf( stderr, "\t -per : dither kyoudo 0 kara 1 made , 0.57 recommended. \n" ); //fprintf( stderr, "\t -div : 1. heikin karano kyori no 2jyouwa ga ookii mono wo bunkatu.\n" ); //fprintf( stderr, "\t : 0. heikin karano kyori no wa ga ookii mono wo bunkatu.\n" ); fprintf( stderr, "\t -pw : heikin kara gasoti no kyori wo nan jyou suruka 1.0 de kyori 2.0 de kyori no 2jyou \n" ); fprintf( stderr, "\t -pw2 : -edge 4 edgerasisa no toki yuukou 1.0 yori ookiito ookina edge ga iro sentaku no sai musi sareru. 1.0yori tiisai toki ookina edge dakedenaku tiisana edge mo musisareyasui \n" ); fprintf( stderr, "\t -bun : bunkatsu ryouiki sentaku hou 0:maxdistance*num max 1.distance^pw sum max 2.max bunsan*num max3.max bunsan 4.max bunsan no houkou no MAX-MIN ga max 5. max bunsan no houkou no MAX-MIN *num ga max \n" ); fprintf( stderr, "\t -lpfon : LPF SW 1:on 0:off \n" ); fprintf( stderr, "\t -lpfk : LPF kyoudo 0.5(tuyoi) kara 1.0(yowai) 1.0 de lpfoff \n" ); fprintf( stderr, "\t -t : color space kido jiku wo tyuusin ni kaiten sono kakudo DEGREE 0~90\n" ); fprintf( stderr, "\t -a : S ji tone curve gamma keisuu\n" ); fprintf( stderr, "\t -edge 0 notoki rinsetugaso kan sabun tate yoko square root\n" ); fprintf( stderr, "\t -edge 1,2 notoki rinsetugaso kan sabun tate yoko dokuritu\n" ); fprintf( stderr, "\t -edge 3 notoki sobel tate yoko square root\n" ); fprintf(stderr,"DEFAULT PARAM. edge=%d,et=%d,bai=%f,kmon=%d,edon=%d,r=%f,g=%f,b=%f,cs=%d,gamma=%f,rgamma=%f,bgamma=%f,ygamma=%f,omh=%d,hasyori=%d,dither=%d,per=%f,pw=%f,pw2=%f,bun=%d,lpfon=%d,t=%f,a=%f,lpfk=%f\n",ptr->edge,ptr->et,ptr->bai,ptr->kmon,ptr->edon,ptr->r,ptr->g,ptr->b,ptr->cs,ptr->gamma,ptr->rgamma,ptr->bgamma,ptr->ygamma,ptr->omh,ptr->hasyori,ptr->dither,ptr->per,ptr->pw,ptr->pw2,ptr->bun,ptr->lpfon,ptr->t,ptr->a,ptr->lpfk); } void option_set( int argc, char* argv[],CNTL *ptr) { int i; for(i=1;iInputFileName,argv[++i]); } else if(!strcmp(&argv[i][1],"o")){ strcpy(ptr->OutputFileName,argv[++i]); } else if(!strcmp(&argv[i][1],"edge")){ ptr->edge = atoi(argv[++i]); } else if(!strcmp(&argv[i][1],"edon")){ ptr->edon = atoi(argv[++i]); } else if(!strcmp(&argv[i][1],"kmon")){ ptr->kmon = atoi(argv[++i]); } else if(!strcmp(&argv[i][1],"cs")){ ptr->cs = atoi(argv[++i]); } else if(!strcmp(&argv[i][1],"et")){ ptr->et = atoi(argv[++i]); } else if(!strcmp(&argv[i][1],"omh")){ ptr->omh = atoi(argv[++i]); } else if(!strcmp(&argv[i][1],"hasyori")){ ptr->hasyori = atoi(argv[++i]); } else if(!strcmp(&argv[i][1],"y")){ ptr->sizey = atoi(argv[++i]); } else if(!strcmp(&argv[i][1],"dither")){ ptr->dither = atoi(argv[++i]); } else if(!strcmp(&argv[i][1],"div")){ ptr->div = atoi(argv[++i]); } else if(!strcmp(&argv[i][1],"bun")){ ptr->bun = atoi(argv[++i]); } else if(!strcmp(&argv[i][1],"lpfon")){ ptr->lpfon = atoi(argv[++i]); } else if(!strcmp(&argv[i][1],"r")){ ptr->r = atof(argv[++i]); } else if(!strcmp(&argv[i][1],"g")){ ptr->g = atof(argv[++i]); } else if(!strcmp(&argv[i][1],"b")){ ptr->b = atof(argv[++i]); } else if(!strcmp(&argv[i][1],"gamma")){ ptr->gamma = atof(argv[++i]); } else if(!strcmp(&argv[i][1],"rgamma")){ ptr->rgamma = atof(argv[++i]); } else if(!strcmp(&argv[i][1],"bgamma")){ ptr->bgamma = atof(argv[++i]); } else if(!strcmp(&argv[i][1],"ygamma")){ ptr->ygamma = atof(argv[++i]); } else if(!strcmp(&argv[i][1],"per")){ ptr->per = atof(argv[++i]); } else if(!strcmp(&argv[i][1],"pw")){ ptr->pw = atof(argv[++i]); } else if(!strcmp(&argv[i][1],"pw2")){ ptr->pw2 = atof(argv[++i]); } else if(!strcmp(&argv[i][1],"t")){ ptr->t = atof(argv[++i]); } else if(!strcmp(&argv[i][1],"a")){ ptr->a = atof(argv[++i]); } else if(!strcmp(&argv[i][1],"bai")){ ptr->bai = atof(argv[++i]); } else if(!strcmp(&argv[i][1],"lpfk")){ ptr->lpfk = atof(argv[++i]); } else { exit(0); } } } struct IRO { int INDEX; int CNT; int RGB; unsigned char R; unsigned char G; unsigned char B; double CONVV; double CONVY; double CONVU; }; //struct IRO *iro; //iro =(struct IRO*)malloc(sizeof(struct IRO)*hsize*vsize); struct palet//パレット構造体 { int U_R; int U_G; int U_B; int IG_R; int IG_G; int IG_B; int INDEXNUM; int INDEXNO; double MAXDISTANCE; double IGENMAX; }; struct palet PT[2][IROSUU]; struct palet *PTP; int Jacobi(int n, int ct, double eps, double **A, double **A1, double **A2, double **X1, double **X2) { double max, s, t, v, sn, cs1; int i1, i2, k = 0, ind = 1, p = 0, q = 0; // 初期設定 for (i1 = 0; i1 < n; i1++) { for (i2 = 0; i2 < n; i2++) { A1[i1][i2] = A[i1][i2]; X1[i1][i2] = 0.0; } X1[i1][i1] = 1.0; } // 計算 while (ind > 0 && k < ct) { // 最大要素の探索 max = 0.0; for (i1 = 0; i1 < n; i1++) { for (i2 = 0; i2 < n; i2++) { if (i2 != i1) { if (fabs(A1[i1][i2]) > max) { max = fabs(A1[i1][i2]); p = i1; q = i2; } } } } // 収束判定 // 収束した if (max < eps) ind = 0; // 収束しない else { // 準備 s = -A1[p][q]; t = 0.5 * (A1[p][p] - A1[q][q]); v = fabs(t) / sqrt(s * s + t * t); sn = sqrt(0.5 * (1.0 - v)); if (s*t < 0.0) sn = -sn; cs1 = sqrt(1.0 - sn * sn); // Akの計算 for (i1 = 0; i1 < n; i1++) { if (i1 == p) { for (i2 = 0; i2 < n; i2++) { if (i2 == p) A2[p][p] = A1[p][p] * cs1 * cs1 + A1[q][q] * sn * sn - 2.0 * A1[p][q] * sn * cs1; else if (i2 == q) A2[p][q] = 0.0; else A2[p][i2] = A1[p][i2] * cs1 - A1[q][i2] * sn; } } else if (i1 == q) { for (i2 = 0; i2 < n; i2++) { if (i2 == q) A2[q][q] = A1[p][p] * sn * sn + A1[q][q] * cs1 * cs1 + 2.0 * A1[p][q] * sn * cs1; else if (i2 == p) A2[q][p] = 0.0; else A2[q][i2] = A1[q][i2] * cs1 + A1[p][i2] * sn; } } else { for (i2 = 0; i2 < n; i2++) { if (i2 == p) A2[i1][p] = A1[i1][p] * cs1 - A1[i1][q] * sn; else if (i2 == q) A2[i1][q] = A1[i1][q] * cs1 + A1[i1][p] * sn; else A2[i1][i2] = A1[i1][i2]; } } } // Xkの計算 for (i1 = 0; i1 < n; i1++) { for (i2 = 0; i2 < n; i2++) { if (i2 == p) X2[i1][p] = X1[i1][p] * cs1 - X1[i1][q] * sn; else if (i2 == q) X2[i1][q] = X1[i1][q] * cs1 + X1[i1][p] * sn; else X2[i1][i2] = X1[i1][i2]; } } // 次のステップへ k++; for (i1 = 0; i1 < n; i1++) { for (i2 = 0; i2 < n; i2++) { A1[i1][i2] = A2[i1][i2]; X1[i1][i2] = X2[i1][i2]; } } } } return ind; } void LuvtoRGB(double L, double u, double v, double *R, double *G, double *B) { double X, Y, Z,a,b,c,d,ud,vd,u0,v0,TEMP,L1; double RR, GG, BB; double eps = 216.0/24389.0; double k = 24389.0/27.0; double Xr = 0.964221; // reference white D50 double Yr = 1.0; double Zr = 0.825211; u0 = 4.0*Xr / (Xr + 15.0*Yr + 3.0*Zr); v0 = 9.0*Yr / (Xr + 15.0*Yr + 3.0*Zr); L1 = ((double)(L))/1.0; if((double)(L1) > k*eps){ TEMP = (((double)(L1)+16.0)/116.0); Y = TEMP*TEMP*TEMP; } else { Y = ((double)(L1))/k; } if((L==0) && (u == 0) && (v == 0)){ X = 0; Y = 0; Z = 0; } else { ud=(u/(13.0*L1)+u0); vd=(v/(13.0*L1)+v0); X=(ud/vd)*Y*9.0/4.0; Z=(Y/vd-((ud/vd)*Y/4.0+15.0*Y/9.0))*3.0; } // a=((52.0*L)/(u+13.0*L*u0)-1.0)/3.0; // b=-5.0*Y; // c=-1.0/3.0; // d=Y*( (39.0*((double)(L))/(v+13.0*L*v0))-5.0 ); // X=(d-b)/(a-c); // Z=X*a+b; // fY = pow((L + 16.0) / 116.0, 3.0); // if (fY < 0.008856) // fY = L / 903.3; // Y = fY; // if (fY > 0.008856) // fY = pow(fY, 1.0/3.0); // else // fY = 7.787 * fY + 16.0/116.0; // fX = a / 500.0 + fY; // if (fX > 0.206893) // X = pow(fX, 3.0); // else // X = (fX - 16.0/116.0) / 7.787; // fZ = fY - b /200.0; // if (fZ > 0.206893) // Z = pow(fZ, 3.0); // else // Z = (fZ - 16.0/116.0) / 7.787; X *= 255.0;//(0.950456 * 255); Y *= 255.0; Z *= 255.0;//(1.088754 * 255); RR = (3.2404813432005*X - 1.5371515162713*Y - 0.49853632616889*Z ); GG = (-0.96925494999657*X + 1.8759900014899*Y + 0.041555926558293*Z ); BB = (0.055646639135177*X - 0.20404133836651*Y + 1.0573110696453*Z ); *R = RR;// < 0 ? 0 : RR > 255 ? 255 : RR; *G = GG;// < 0 ? 0 : GG > 255 ? 255 : GG; *B = BB;// < 0 ? 0 : BB > 255 ? 255 : BB; } void RGBtoLuv(double R, double G, double B, double *L, double *u, double *v) { double X, Y, Z;//, fX, fY, fZ; /* double r,g,b; r = R/255.f; //R 0..1 g = G/255.f; //G 0..1 b = B/255.f; //B 0..1 if (r <= 0.04045) r = r/12; else r = (double) pow((r+0.055)/1.055,2.4); if (g <= 0.04045) g = g/12; else g = (double) pow((g+0.055)/1.055,2.4); if (b <= 0.04045) b = b/12; else b = (double) pow((b+0.055)/1.055,2.4); */ X = 0.412453*R + 0.357580*G + 0.180423*B; Y = 0.212671*R + 0.715160*G + 0.072169*B; Z = 0.019334*R + 0.119193*G + 0.950227*B; X /= 255.0;//(255 * 0.950456); Y /= 255.0;// 255; Z /= 255.0;//(255 * 1.088754); // X = 0.412453*R + 0.357580*G + 0.180423*B; // Y = 0.212671*R + 0.715160*G + 0.072169*B; // Z = 0.019334*R + 0.119193*G + 0.950227*B; //X = 0.436052025f*r + 0.385081593f*g + 0.143087414f *b; // Y = 0.222491598f*r + 0.71688606f *g + 0.060621486f *b; // Z = 0.013929122f*r + 0.097097002f*g + 0.71418547f *b; double L1,u1, v1, u2, v2, ur2, vr2,yr,eps,k; eps = 216.0/24389.0; k = 24389.0/27.0; double Xr = 0.964221; // reference white D50 double Yr = 1.0;//1.0; double Zr = 0.825211; // u2 = 4.0*X / (X + 15.0*Y + 3.0*Z); // v2 = 9.0*Y / (X + 15.0*Y + 3.0*Z); u2 = 4.0*X / (X + 15.0*Y + 3.0*Z); v2 = 9.0*Y / (X + 15.0*Y + 3.0*Z); ur2 = 4.0*Xr / (Xr + 15.0*Yr + 3.0*Zr); vr2 = 9.0*Yr / (Xr + 15.0*Yr + 3.0*Zr); yr = Y/Yr; if ( yr > eps ){ L1 = (116.0 * pow(yr, 1.0/3.0) - 16.0); // L1 = (double) (116.0 * pow(yr, 0.3333333333333) - 16.0); // L1 = (double) (116.0 * yr - 16.0); //debug start // fprintf(stderr,"YATTER\n"); //debug end } else { L1 = k * yr; } // u1 = 13.0*(L1)*(u2 -ur2); // v1 = 13.0*(L1)*(v2 -vr2); u1 = 13.0*(L1)*(u2-ur2);// -ur2); v1 = 13.0*(L1)*(v2-vr2);// -vr2); // u1 = L1; // v1 = L1; if( X==0.0 && Y==0.0 && Z==0.0){ *L = 0.0; *u = 0.0; *v = 0.0; } else { // *L = (int) (2.55*(L1) + 0.5); *L = /*(int) ((*/L1/*) + 0.5)*/; *u = /*(int) (*/u1/* + 0.5)*/; *v = /*(int) (*/v1/* + 0.5)*/; } // *L = R; // *u = G; // *v = B; // X /= (255 * 0.950456); // Y /= 255; // Z /= (255 * 1.088754); // if (Y > 0.008856) // { // fY = pow(Y, 1.0/3.0); // *L = (int)(116.0*fY - 16.0 + 0.5); // } // else // { // fY = 7.787*Y + 16.0/116.0; // *L = (int)(903.3*Y + 0.5); // } // if (X > 0.008856) // fX = pow(X, 1.0/3.0); // else // fX = 7.787*X + 16.0/116.0; // if (Z > 0.008856) // /fZ = pow(Z, 1.0/3.0); // else // fZ = 7.787*Z + 16.0/116.0; // *a = (int)(500.0*(fX - fY) + 0.5); // *b = (int)(200.0*(fY - fZ) + 0.5); } void LABtoRGB(double L, double a, double b, double *R, double *G, double *B) { // Convert between RGB and CIE-Lab color spaces // Uses ITU-R recommendation BT.709 with D65 as reference white. // algorithm contributed by "Mark A. Ruzon" double X, Y, Z, fX, fY, fZ; double RR, GG, BB; fY = (L + 16.0) / 116.0; fX = fY+a/500.0; fZ = fY-b/200.0; if(fY > pow(0.008856,1.0/3.0)){ Y = pow(fY,3.0); } else { Y=27.0/29.0/29.0/29.0*(116.0*fY-16.0); } if(fX > pow(0.008856,1.0/3.0)){ X= pow(fX,3.0); } else { X=27.0/29.0/29.0/29.0*(116.0*fX-16.0); } if(fZ > pow(0.008856,1.0/3.0)){ Z= pow(fZ,3.0); } else { Z=27.0/29.0/29.0/29.0*(116.0*fZ-16.0); } X *= (0.950456 * 255.0); Y *= 255; Z *= (1.088754 * 255.0); RR = (3.2408109640905*X - 1.5373099569082*Y - 0.49858604825854*Z ); GG = (-0.96924116992192*X + 1.8759664973723*Y + 0.041553922456843*Z ); BB = (0.05563752111349*X - 0.20400735547233*Y + 1.0571298579506*Z ); *R = RR;// < 0 ? 0 : RR > 255 ? 255 : RR; *G = GG;// < 0 ? 0 : GG > 255 ? 255 : GG; *B = BB;// < 0 ? 0 : BB > 255 ? 255 : BB; } void RGBtoLAB(double R, double G, double B, double *L, double *a, double *b) { // Convert between RGB and CIE-Lab color spaces // Uses ITU-R recommendation BT.709 with D65 as reference white. // algorithm contributed by "Mark A. Ruzon" double X, Y, Z, fX, fY, fZ,tempX,tempY,tempZ; /* X = 0.412453*R + 0.357580*G + 0.180423*B; Y = 0.212671*R + 0.715160*G + 0.072169*B; Z = 0.019334*R + 0.119193*G + 0.950227*B; */ X= 0.412411*R+ 0.357585*G+ 0.180454*B; Y= 0.212649*R+ 0.715169*G+ 0.072182*B; Z= 0.019332*R+ 0.119195*G+ 0.950390*B; X /= (255.0 * 0.950456); Y /= 255.0; Z /= (255.0 * 1.088754); if (Y > 0.008856) { tempY = pow(Y, 1.0/3.0); } else { tempY = (29.0*29.0*29.0/27.0*Y+16.0)/116.0; } if (X > 0.008856){ tempX = pow(X, 1.0/3.0); } else { tempX = (29.0*29.0*29.0/27.0*X+16.0)/116.0; } if (Z > 0.008856){ tempZ = pow(Z, 1.0/3.0); } else tempZ = (29.0*29.0*29.0/27.0*Z+16.0)/116.0; *a = ((500.0*(tempX - tempY) )); *b = ((200.0*(tempY - tempZ))); *L = ((116.0*tempY - 16.0 )); } int ohtsu (int NUM,int *X){ int i,j,k,l,m,n,o,p; //int SUM1; //int X[NUM] = {-10,-10,-10,-10,-10, // -10,-10,-10,-10,-10, // -3,-3,-3,-3,-3, // -1,-1,0,1,1, // 3,3,3,3,3, // 10,10,10,10,10, // 10,10,10,10,10}; int MAX = -10000; int MIN = 99999; for(i=0;i *(X+i)){ MIN = *(X+i); } if(MAX < *(X+i)){ MAX = *(X+i); } } int NODEHANI; NODEHANI = MAX - MIN + 1; int *HIST; HIST = (int *)malloc(sizeof(int)*NODEHANI); //ND //0- -11 //1- -10 //11- 0 //22- 11 for(i=0;i *(X+i)){ MIN = *(X+i); } if(MAX < *(X+i)){ MAX = *(X+i); } } int CMAX,CMIN; if(MAX > 0.0){ CMAX = (int)MAX; } else if(MAX== 0.0){ CMAX = 0.0; } else { CMAX = (int)MAX-1; } if(MIN > 0.0){ CMIN = (int)MIN; } else if(MIN == 0.0){ CMIN = 0.0; } else { if(MIN-(double)((int)(MIN))!=0.0){ CMIN = (int)MIN-1; } else { CMIN = (int)MIN; } } int NODEHANI; NODEHANI = CMAX - CMIN + 1; //int *HIST; //HIST = (int *)malloc(sizeof(int)*NODEHANI); //ND //0- -11 //1- -10 // -6.7 - 5.3 // -7 - 6 14 //11- 0 //22- 11 //for(i=0;i HANTEI2){ MIN2 = HANTEI2; THRESH2 = i; } } } THRESH += CMIN; THRESH2 += CMIN; //debug start fprintf(stderr,"CMIN=%d,THRESH=%d,THRESH2=%d,CMAX=%d\n",CMIN,THRESH,THRESH2,CMAX); // while(1); //debug end // printf("ohtsu2 end!!\n"); if(omh == 3){ return (THRESH); } else if(omh == 4){ return (THRESH2); } // return (0); }//main kansuu end int media (int NUM,int *X){ int i,j,k,l,m,n,o,p; //int SUM1; //int X[NUM] = {-10,-10,-10,-10,-10, // -10,-10,-10,-10,-10, // -3,-3,-3,-3,-3, // -1,-1,0,1,1, // 3,3,3,3,3, // 10,10,10,10,10, // 10,10,10,10,10}; int MAX = -10000; int MIN = 99999; for(i=0;i *(X+i)){ MIN = *(X+i); } if(MAX < *(X+i)){ MAX = *(X+i); } } int NODEHANI; NODEHANI = MAX - MIN + 1; int *HIST; HIST = (int *)malloc(sizeof(int)*NODEHANI); //ND //0- -11 //1- -10 //11- 0 //22- 11 for(i=0;i=1) && (j <= (hsize-2)) ){ YIN[j*vsize+i] = lpfk*(double)RIN[j*vsize+i]+koi*(double)RIN[(j-1)*vsize+i]+koi*(double)RIN[(j+1)*vsize+i]; UIN[j*vsize+i] = lpfk*(double)GIN[j*vsize+i]+koi*(double)GIN[(j-1)*vsize+i]+koi*(double)GIN[(j+1)*vsize+i]; VIN[j*vsize+i] = lpfk*(double)BIN[j*vsize+i]+koi*(double)BIN[(j-1)*vsize+i]+koi*(double)BIN[(j+1)*vsize+i]; } } //if(i==1){while(1);} } // while(1); for(i=0;i=1) && (j <= (vsize-2)) ){ RIN[i*vsize+j] = (unsigned char)(lpfk*(double)YIN[i*vsize+j]+koi*(double)YIN[i*vsize+(j-1)]+koi*(double)YIN[i*vsize+(j+1)]+0.5); GIN[i*vsize+j] = (unsigned char)(lpfk*(double)UIN[i*vsize+j]+koi*(double)UIN[i*vsize+(j-1)]+koi*(double)UIN[i*vsize+(j+1)]+0.5); BIN[i*vsize+j] = (unsigned char)(lpfk*(double)VIN[i*vsize+j]+koi*(double)VIN[i*vsize+(j-1)]+koi*(double)VIN[i*vsize+(j+1)]+0.5); } } } } //else { // for(i=0;i MHASYORI){ // RIN[i] = MHASYORI; // } // if(GIN[i] > MHASYORI){ // GIN[i] = MHASYORI; // } // if(BIN[i] > MHASYORI){ // BIN[i] = MHASYORI; // } } for(i=0;i= 0.117647058823529411764705882352941){ RrIN[i] = 255.0*pow((double)(RrIN[i])/255.0,3.0/2.2); } else { RrIN[i] = 255.0*pow((double)(RrIN[i])/255.0/**0.1429136476*/,1.0/2.2)*0.1429136476; } if((double)(GIN[i])/255.0 >= 0.117647058823529411764705882352941){ GgIN[i] = 255.0*pow((double)(GgIN[i])/255.0,3.0/2.2); } else { GgIN[i] = 255.0*pow((double)(GgIN[i])/255.0/**0.1429136476*/,1.0/2.2)*0.1429136476; } if((double)(BIN[i])/255.0 >= 0.117647058823529411764705882352941){ BbIN[i] = 255.0*pow((double)(BbIN[i])/255.0,3.0/2.2); } else { BbIN[i] = 255.0*pow((double)(BbIN[i])/255.0/*0.1429136476*/,1.0/2.2)*0.1429136476; } *(YIN+i) = (0.2989*(float)(*(RrIN+i))+0.5866*(float)(*(GgIN+i))+0.1145*(float)(*(BbIN+i)) /*+0.5*/); *(UIN+i) = ((-0.1350*(float)(*(RrIN+i))-0.2650*(float)(*(GgIN+i))+0.40000*(float)(*(BbIN+i)))); *(VIN+i) = (0.4000*(float)(*(RrIN+i))-0.3346*(float)(*(GgIN+i))-0.0653*(float)(*(BbIN+i))); // n1= (double)r*0.2989+(double)g*0.5866+(double)b*0.1145; // n2=-(double)r*0.1350-(double)g*0.2650+(double)b*0.4000; // n3= (double)r*0.4000-(double)g*0.3346-(double)b*0.0653; } } else if(cs == 5){ for(i=0;i= 0.1176470588){ RrIN[i] = 255.0*pow((double)(RrIN[i])/255.0,3.0/2.2); } else { RrIN[i] = 255.0*pow((double)(RrIN[i])/255.0/**0.1429136476*/,1.0/2.2)*0.1429136476; } if((double)(GIN[i])/255.0 >= 0.1176470588){ GgIN[i] = 255.0*pow((double)(GgIN[i])/255.0,3.0/2.2); } else { GgIN[i] = 255.0*pow((double)(GgIN[i])/255.0/**0.1429136476*/,1.0/2.2)*0.1429136476; } if((double)(BIN[i])/255.0 >= 0.1176470588){ BbIN[i] = 255.0*pow((double)(BbIN[i])/255.0,3.0/2.2); } else { BbIN[i] = 255.0*pow((double)(BbIN[i])/255.0/**0.1429136476*/,1.0/2.2)*0.1429136476; } *(YIN+i) = GgIN[i]; *(UIN+i) = BbIN[i];//((-0.1350*(float)(*(RrIN+i))-0.2650*(float)(*(GgIN+i))+0.40000*(float)(*(BbIN+i)))); *(VIN+i) = RrIN[i];//(0.4000*(float)(*(RrIN+i))-0.3346*(float)(*(GgIN+i))-0.0653*(float)(*(BbIN+i))); } } else if(cs == 8){ for(i=0;i= 0.1176470588){ RrIN[i] = 255.0*pow((double)(RrIN[i])/255.0,3.0/2.2); } else { RrIN[i] = 255.0*pow((double)(RrIN[i])/255.0/**0.1429136476*/,1.0/2.2)*0.1429136476; } if((double)(GIN[i])/255.0 >= 0.1176470588){ GgIN[i] = 255.0*pow((double)(GgIN[i])/255.0,3.0/2.2); } else { GgIN[i] = 255.0*pow((double)(GgIN[i])/255.0/**0.1429136476*/,1.0/2.2)*0.1429136476; } if((double)(BIN[i])/255.0 >= 0.1176470588){ BbIN[i] = 255.0*pow((double)(BbIN[i])/255.0,3.0/2.2); } else { BbIN[i] = 255.0*pow((double)(BbIN[i])/255.0/**0.1429136476*/,1.0/2.2)*0.1429136476; } //for(i=0;i(hsize-1)){n=2*(hsize-1)-n;} if(m<0){m=-m;} if(m>(vsize-1)){m=2*(vsize-1)-m;} HHEDGER[j*vsize+i] += SOBEL2[3*k+l]*(int)RIN[n*vsize+m]; HHEDGEG[j*vsize+i] += SOBEL2[3*k+l]*(int)GIN[n*vsize+m]; HHEDGEB[j*vsize+i] += SOBEL2[3*k+l]*(int)BIN[n*vsize+m]; VVEDGER[j*vsize+i] += SOBEL[3*k+l]*(int)RIN[n*vsize+m]; VVEDGEG[j*vsize+i] += SOBEL[3*k+l]*(int)GIN[n*vsize+m]; VVEDGEB[j*vsize+i] += SOBEL[3*k+l]*(int)BIN[n*vsize+m]; //printf("%d\n",RIN[n*vsize+m]); } } } } } if((vvv >= 0 && vvv <= 2) || vvv == 6){ for(i=0;i(hsize-1)){k=2*(hsize-1)-k;} if(l<0){l=-l;} if(l>(hsize-1)){l=2*(hsize-1)-l;} HHEDGER[j*vsize+i] = abs(IRIN[k*vsize+i]-IRIN[l*vsize+i]); // EDGER[j*vsize+i]=1; // } else { // EDGER[j*vsize+i]=0; // } HHEDGEG[j*vsize+i] = abs(IGIN[k*vsize+i]-IGIN[l*vsize+i]); // EDGEG[j*vsize+i]=1; // } else { // EDGEG[j*vsize+i]=0; // } HHEDGEB[j*vsize+i] = abs(IBIN[k*vsize+i]-IBIN[l*vsize+i]); // EDGEB[j*vsize+i]=1; // } else { // EDGEB[j*vsize+i]=0; // } if((abs(IRIN[k*vsize+i]-IRIN[l*vsize+i]))>=et){ EDGER[j*vsize+i]=1; } else { EDGER[j*vsize+i]=0; } if((abs(IGIN[k*vsize+i]-IGIN[l*vsize+i]))>=et){ EDGEG[j*vsize+i]=1; } else { EDGEG[j*vsize+i]=0; } if((abs(IBIN[k*vsize+i]-IBIN[l*vsize+i]))>=et){ EDGEB[j*vsize+i]=1; } else { EDGEB[j*vsize+i]=0; } } } for(i=0;i(vsize-1)){ l=2*(vsize-1)-l; } VVEDGER[i*vsize+j] = abs(IRIN[i*vsize+l]-IRIN[i*vsize+k]); // VEDGER[i*vsize+j] = 1; // } else { // VEDGER[i*vsize+j] = 0; // } VVEDGEG[i*vsize+j] = abs(IGIN[i*vsize+l]-IGIN[i*vsize+k]); // VEDGEG[i*vsize+j] = 1; // } else { // VEDGEG[i*vsize+j] = 0; // } VVEDGEB[i*vsize+j] = abs(IBIN[i*vsize+l]-IBIN[i*vsize+k]); // VEDGEB[i*vsize+j] = 1; // } else { // VEDGEB[i*vsize+j] = 0; // } if(abs(IRIN[i*vsize+l]-IRIN[i*vsize+k])>=et){ VEDGER[i*vsize+j] = 1; } else { VEDGER[i*vsize+j] = 0; } if(abs(IGIN[i*vsize+l]-IGIN[i*vsize+k])>=et){ VEDGEG[i*vsize+j] = 1; } else { VEDGEG[i*vsize+j] = 0; } if(abs(IBIN[i*vsize+l]-IBIN[i*vsize+k])>=et){ VEDGEB[i*vsize+j] = 1; } else { VEDGEB[i*vsize+j] = 0; } } } for(i=0,k=0;i= et*sqrt(2.0)) || (sqrt((float)HHEDGEG[j*vsize+i]*(float)HHEDGEG[j*vsize+i] + (float)VVEDGEG[j*vsize+i] * (float)VVEDGEG[j*vsize+i]) >= et*sqrt(2.0)) || (sqrt((float)HHEDGEB[j*vsize+i]*(float)HHEDGEB[j*vsize+i] + (float)VVEDGEB[j*vsize+i] * (float)VVEDGEB[j*vsize+i]) >= et*sqrt(2.0)) ){ *(index3+j*vsize+i)=-1; k++; } else { *(index3+j*vsize+i)=1; }} if(vvv == 6){ if( sqrt((((float)HHEDGER[j*vsize+i]*(float)HHEDGER[j*vsize+i] + (float)VVEDGER[j*vsize+i] * (float)VVEDGER[j*vsize+i])) + (((float)HHEDGEG[j*vsize+i]*(float)HHEDGEG[j*vsize+i] + (float)VVEDGEG[j*vsize+i] * (float)VVEDGEG[j*vsize+i]) ) + (((float)HHEDGEB[j*vsize+i]*(float)HHEDGEB[j*vsize+i] + (float)VVEDGEB[j*vsize+i] * (float)VVEDGEB[j*vsize+i]))) >= et*sqrt(6.0) ){ *(index3+j*vsize+i)=-1; k++; } else { *(index3+j*vsize+i)=1; }} if(vvv == 1){ if( HHEDGER[j*vsize+i] >= et || VVEDGER[j*vsize+i] >= et || HHEDGEG[j*vsize+i] >= et || VVEDGEG[j*vsize+i] >= et || HHEDGEB[j*vsize+i] >= et || VVEDGEB[j*vsize+i] >= et ){ *(index3+j*vsize+i)=-1; k++; } else { *(index3+j*vsize+i)=1; }} if(vvv == 2){ if(EDGER[j*vsize+i] == 1 || EDGEG[j*vsize+i] == 1 || EDGEB[j*vsize+i] == 1 || VEDGER[j*vsize+i] == 1 || VEDGEG[j*vsize+i] == 1 || VEDGEB[j*vsize+i] == 1){ *(index3+j*vsize+i)=-1; k++; } else { *(index3+j*vsize+i)=1; } } } } }//cnt if end if(vvv == 3 || vvv == 5){ for(i=0,k=0;i= et*4.0*sqrt(2.0)) || (sqrt((float)HHEDGEG[j*vsize+i]*(float)HHEDGEG[j*vsize+i] + (float)VVEDGEG[j*vsize+i] * (float)VVEDGEG[j*vsize+i]) >= et*4.0*sqrt(2.0)) || (sqrt((float)HHEDGEB[j*vsize+i]*(float)HHEDGEB[j*vsize+i] + (float)VVEDGEB[j*vsize+i] * (float)VVEDGEB[j*vsize+i]) >= et*4.0*sqrt(2.0)) ){ *(index3+j*vsize+i)=-1; k++; } else { *(index3+j*vsize+i)=1; } } if(vvv == 5){ // printf("%f\n",sqrt(((float)HHEDGER[j*vsize+i]*(float)HHEDGER[j*vsize+i] + (float)VVEDGER[j*vsize+i] * (float)VVEDGER[j*vsize+i]) // +((float)HHEDGEG[j*vsize+i]*(float)HHEDGEG[j*vsize+i] + (float)VVEDGEG[j*vsize+i] * (float)VVEDGEG[j*vsize+i]) // +((float)HHEDGEB[j*vsize+i]*(float)HHEDGEB[j*vsize+i] + (float)VVEDGEB[j*vsize+i] * (float)VVEDGEB[j*vsize+i]))); if( sqrt(((float)HHEDGER[j*vsize+i]*(float)HHEDGER[j*vsize+i] + (float)VVEDGER[j*vsize+i] * (float)VVEDGER[j*vsize+i]) +((float)HHEDGEG[j*vsize+i]*(float)HHEDGEG[j*vsize+i] + (float)VVEDGEG[j*vsize+i] * (float)VVEDGEG[j*vsize+i]) +((float)HHEDGEB[j*vsize+i]*(float)HHEDGEB[j*vsize+i] + (float)VVEDGEB[j*vsize+i] * (float)VVEDGEB[j*vsize+i])) >= et*4.0*sqrt(6.0)){ *(index3+j*vsize+i)=-1; k++; } else { *(index3+j*vsize+i)=1; } } } } } double *EDGERASISAY,REDGE,GEDGE,BEDGE; if(vvv == 4){ EDGERASISAY = (double*)malloc(sizeof(double)*hsize*vsize); //for(i=0,k=0;i= et*4.0) || //(sqrt((float)HHEDGEG[j*vsize+i]*(float)HHEDGEG[j*vsize+i] + (float)VVEDGEG[j*vsize+i] * (float)VVEDGEG[j*vsize+i]) >= et*4.0) || //(sqrt((float)HHEDGEB[j*vsize+i]*(float)HHEDGEB[j*vsize+i] + (float)VVEDGEB[j*vsize+i] * (float)VVEDGEB[j*vsize+i]) >= et*4.0) //){ //*(index3+j*vsize+i)=-1; //k++; //} else { //*(index3+j*vsize+i)=1; //} //} //} // EDGERASMAX = -9999999.9e64; for(i=0;i EDGERASMAX){ // EDGERASMAX = EDGERASISAY[j*vsize+i]; // } } } // printf("EDGERASMAX=%f\n",EDGERASMAX);while(1); k=0; } //debug start] //if(vvv == 4){ // printf("EDGE rasisa mode\n"); //} else { printf("EDGE gasosuu=%d\n",k); //} //debug end // if(0/*omh==3*/){ /* int tempju;double tempuj; int *RGB;double *CONVY,*CONVU,*CONVV; RGB =(int*)malloc(sizeof(int)*hsize*vsize); CONVY =(double*)malloc(sizeof(double)*hsize*vsize); CONVU =(double*)malloc(sizeof(double)*hsize*vsize); CONVV =(double*)malloc(sizeof(double)*hsize*vsize); for(i=0,m=0;ii;j--){ if(RGB[j-1] > RGB[j]){ tempju = RGB[j-1]; RGB[j-1] = RGB[j]; RGB[j] = tempju; tempuj = CONVY[j-1]; CONVY[j-1] = CONVY[j]; CONVY[j] = tempuj; tempuj = CONVU[j-1]; CONVU[j-1] = CONVU[j]; CONVU[j] = tempuj; tempuj = CONVV[j-1]; CONVV[j-1] = CONVV[j]; CONVV[j] = tempuj; tempju = IROINDEX[j-1]; IROINDEX[j-1] = IROINDEX[j]; IROINDEX[j] = tempju; } } } for(i=0;iRGB = RGB[0]; iro->CONVY = CONVY[0]; iro->CONVU = CONVU[0]; iro->CONVV = CONVV[0]; iro->INDEX = IROINDEX[0]; i=0;j=1;k=1; while(iRGB = RGB[i]; (iro+k)->CONVY = CONVY[i]; (iro+k)->CONVU = CONVU[i]; (iro+k)->CONVV = CONVV[i]; (iro+k-1)->CNT = j; (iro+k)->INDEX = IROINDEX[i]; j=1;k++;FLAGY=0; }else{ j++;FLAGY=1; } } if(FLAGY==0){ (iro+k)->RGB = RGB[i]; (iro+k)->CONVY = CONVY[i]; (iro+k)->CONVU = CONVU[i]; (iro+k)->CONVV = CONVV[i]; (iro+k-1)->CNT = 1; (iro+k)->INDEX = IROINDEX[i]; } else if(FLAGY==1){ (iro+k-1)->CNT = j; } int IROSUUU; IROSUUU = k; printf("\n");//k ni iro no syuruisuu ga kioku sareteiru. for(i=0;iRGB,(iro+i)->CNT); }//while(1); printf("IROSUU=%d\n",IROSUUU); //while(1); } */ DIVIDENUM =1; MEN=0; RDIV = RD; GDIV = GD; BDIV = BD; if(MEN == 1){ NMEN = 0; } else { NMEN = 1; } //MEN = 0,NMEN = 1 U_R=0.0; U_G=0.0; U_B=0.0; for(i=0;i>RDIV); //U_G = (U_G>>GDIV); // U_B = (U_B>>BDIV); //U_R,U_G,U_Bは平均 ct = 1000; eps = 1.0e-10; n = 3; A = new double * [n]; A1 = new double * [n]; A2 = new double * [n]; X1 = new double * [n]; X2 = new double * [n]; for (i1 = 0; i1 < n; i1++) { A[i1] = new double [n]; A1[i1] = new double [n]; A2[i1] = new double [n]; X1[i1] = new double [n]; X2[i1] = new double [n]; } //A[0][0],A[0][1],A[0][2],A[1][0],A[1][1],A[1][2],A[2][0],A[2][1],A[2][2]に分散共分散を入れる TMP_RR=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(RIN+i))>>RDIV)-U_R); TMP_GG=0.0;//(((*(GIN+i))>>GDIV)-U_G)*(((*(GIN+i))>>GDIV)-U_G); TMP_BB=0.0;//(((*(BIN+i))>>BDIV)-U_B)*(((*(BIN+i))>>BDIV)-U_B); TMP_RG=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(GIN+i))>>GDIV)-U_G); TMP_RB=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(BIN+i))>>BDIV)-U_B); TMP_GB=0.0;//(((*(GIN+i))>>GDIV)-U_G)*(((*(BIN+i))>>BDIV)-U_B); for(i=0;i 0){ fprintf(stderr,"Jacobi syuusoku simasen!!\n"); exit(0); } // if((A1[0][0] == A1[1][1]) || (A1[1][1] == A1[2][2]) || (A1[0][0] == A1[2][2]) ){ // fprintf(stderr,"Igen Value duplication!!\n"); // exit(0); // } //debug start // for(i=0;i<3;i++){ // for(j=0;j<3;j++){ // fprintf(stderr,"%f ",A1[i][j]); // } // fprintf(stderr,"\n"); // } //debug end IGENMAX = -999999999999999999.9; for(i=0;i<3;i++){ if(A1[i][i] > IGENMAX ){ IGENMAX = A1[i][i]; Y = i; } } //debug start // fprintf(stderr,"Y=%d\n",Y); // fprintf(stderr,"IGENVEC=%f %f %f\n",X1[0][Y],X1[1][Y],X1[2][Y]); // while(1); //debug end //Yは最大固有値の番号 //(X1[0][Y],X1[1][Y],X1[2][Y]) 最大分散の固有ベクトル //ohtsu tuika start double *RR; double *GG; double *BB; double *RRR; double *GGG; double *BBB; double V[3]; double *XXX; double *YYY; double *ZZZ; double MAXX,MINN; int THRESH; double DTHRESH; RR = (double *)malloc(sizeof(double)*hsize*vsize); GG = (double *)malloc(sizeof(double)*hsize*vsize); BB = (double *)malloc(sizeof(double)*hsize*vsize); XXX = (double *)malloc(sizeof(double)); YYY = (double *)malloc(sizeof(double)); ZZZ = (double *)malloc(sizeof(double)); RRR = (double *)malloc(sizeof(double)*hsize*vsize); GGG = (double *)malloc(sizeof(double)*hsize*vsize); BBB = (double *)malloc(sizeof(double)*hsize*vsize); for(i=0;i=0.0){ if((double)(*(RRR+i))>=DTHRESH){ *(INDEX+i) = PT[MEN][0].INDEXNO; k++; } else { *(INDEX+i) = PT[MEN][1].INDEXNO; l++; } } } PT[MEN][0].INDEXNUM = k; PT[MEN][1].INDEXNUM = l; //maxdistance tuika start U_R=0.0; U_G=0.0; U_B=0.0; //0側のmaxdistanceを求める for(i=0;i>RDIV); // U_G = (U_G>>GDIV); // U_B = (U_B>>BDIV); if(bun == 0){ MAXD = 0.0; for(i=0;i 255.0){ EDGERASISAYD = 255.0; } TEMP += pow(((((*(YIN+i))) - U_R)*(((*(YIN+i))) - U_R) + (((*(UIN+i))) - U_G)*(((*(UIN+i))) - U_G) + (((*(VIN+i))) - U_B)*(((*(VIN+i))) - U_B)),pw/2.0)*pow((255.0-EDGERASISAYD)/255.0,pw2); // if( MAXD < TEMP){ // MAXD = TEMP; // } //printf("EDGERASISAYD = %f\n",EDGERASISAYD); } } } }//div !=4 if end PT[MEN][0].MAXDISTANCE = TEMP; } else if(bun == 2 || bun == 3 || bun == 4 || bun == 5){ //while(1); TMP_RR=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(RIN+i))>>RDIV)-U_R); TMP_GG=0.0;//(((*(GIN+i))>>GDIV)-U_G)*(((*(GIN+i))>>GDIV)-U_G); TMP_BB=0.0;//(((*(BIN+i))>>BDIV)-U_B)*(((*(BIN+i))>>BDIV)-U_B); TMP_RG=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(GIN+i))>>GDIV)-U_G); TMP_RB=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(BIN+i))>>BDIV)-U_B); TMP_GB=0.0;//(((*(GIN+i))>>GDIV)-U_G)*(((*(BIN+i))>>BDIV)-U_B); for(i=0;i 0){ fprintf(stderr,"Jacobi syuusoku simasen!!\n"); exit(0); } // if((A1[0][0] == A1[1][1]) || (A1[1][1] == A1[2][2]) || (A1[0][0] == A1[2][2]) ){ // fprintf(stderr,"Igen Value duplication!!\n"); // exit(0); // } //debug start // for(i=0;i<3;i++){ // for(j=0;j<3;j++){ // fprintf(stderr,"%f ",A1[i][j]); // } // fprintf(stderr,"\n"); // } //debug end IGENMAX = -999999999999999999.9; for(i=0;i<3;i++){ if(A1[i][i] > IGENMAX ){ IGENMAX = A1[i][i]; Y = i; } } if(bun == 2){ PT[MEN][0].MAXDISTANCE = IGENMAX * (double)(PT[MEN][0].INDEXNUM); } if(bun == 3){ PT[MEN][0].MAXDISTANCE = IGENMAX; } if(bun == 4 || bun == 5){ for(i=0;i RRRRRR[i]){ MINN = RRRRRR[i]; } } if(bun == 4){ PT[MEN][0].MAXDISTANCE = MAXX - MINN; } if(bun == 5){ PT[MEN][0].MAXDISTANCE = (MAXX - MINN)*(double)PT[MEN][0].INDEXNUM; } }//bun == 4 if end }//bun == 1 if end } else { PT[MEN][0].MAXDISTANCE = 0.0; } U_R=0.0; U_G=0.0; U_B=0.0; //1側のmaxdistanceを求める for(i=0;i>RDIV); // U_G = (U_G>>GDIV); // U_B = (U_B>>BDIV); if( bun == 0){ MAXD = 0.0; for(i=0;i 255.0){ EDGERASISAYD = 255.0; } TEMP += pow(((((*(YIN+i))) - U_R)*(((*(YIN+i))) - U_R) + (((*(UIN+i))) - U_G)*(((*(UIN+i))) - U_G) + (((*(VIN+i))) - U_B)*(((*(VIN+i))) - U_B)),pw/2.0)*pow((255.0-EDGERASISAYD)/255.0,pw2); // if( MAXD < TEMP){ // MAXD = TEMP; // } } } } } PT[MEN][1].MAXDISTANCE = TEMP; } else if(bun == 2 || bun == 3 || bun == 4 || bun == 5){ TMP_RR=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(RIN+i))>>RDIV)-U_R); TMP_GG=0.0;//(((*(GIN+i))>>GDIV)-U_G)*(((*(GIN+i))>>GDIV)-U_G); TMP_BB=0.0;//(((*(BIN+i))>>BDIV)-U_B)*(((*(BIN+i))>>BDIV)-U_B); TMP_RG=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(GIN+i))>>GDIV)-U_G); TMP_RB=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(BIN+i))>>BDIV)-U_B); TMP_GB=0.0;//(((*(GIN+i))>>GDIV)-U_G)*(((*(BIN+i))>>BDIV)-U_B); for(i=0;i 0){ fprintf(stderr,"Jacobi syuusoku simasen!!\n"); exit(0); } // if((A1[0][0] == A1[1][1]) || (A1[1][1] == A1[2][2]) || (A1[0][0] == A1[2][2]) ){ // fprintf(stderr,"Igen Value duplication!!\n"); // exit(0); // } //debug start // for(i=0;i<3;i++){ // for(j=0;j<3;j++){ // fprintf(stderr,"%f ",A1[i][j]); // } // fprintf(stderr,"\n"); // } //debug end IGENMAX = -999999999999999999.9; for(i=0;i<3;i++){ if(A1[i][i] > IGENMAX ){ IGENMAX = A1[i][i]; Y = i; } } if(bun == 2){ PT[MEN][1].MAXDISTANCE = IGENMAX * (double)(PT[MEN][0].INDEXNUM); } if(bun == 3){ PT[MEN][1].MAXDISTANCE = IGENMAX; } //while(1); if(bun == 4 || bun == 5){ for(i=0;i RRRRRR[i]){ MINN = RRRRRR[i]; } } if(bun == 4){ PT[MEN][1].MAXDISTANCE = MAXX - MINN; } if(bun == 5){ PT[MEN][1].MAXDISTANCE = (MAXX - MINN)*(double)PT[MEN][1].INDEXNUM; } } }// bun == 1 if end } else { PT[MEN][1].MAXDISTANCE = 0.0; } //max distance div end //ohtsu tuika end //debug start // fprintf(stderr,"%d %d\n",k,l); // while(1); //debug end //2回目の分轄 //分轄の中の画素数が多いものを分轄 // if(PT[MEN][0].INDEXNUM >= PT[MEN][1].INDEXNUM){ if((bun == 1) || (bun == 2) || (bun == 3) || (bun == 4) || (bun == 5)){ if(PT[MEN][0].MAXDISTANCE/**PT[MEN][0].INDEXNUM*/ >= PT[MEN][1].MAXDISTANCE/**PT[MEN][1].INDEXNUM*/){//maxdistance div tuika j=0;//INDEXNO } else { j=1; } } else if(bun == 0){ if(PT[MEN][0].MAXDISTANCE*PT[MEN][0].INDEXNUM >= PT[MEN][1].MAXDISTANCE*PT[MEN][1].INDEXNUM){//maxdistance div tuika j=0;//INDEXNO } else { j=1; } } U_R=0.0; U_G=0.0; U_B=0.0; for(i=0;i>RDIV); // U_G = (U_G>>GDIV); // U_B = (U_B>>BDIV); //debug start // fprintf(stderr,"2kaimeheikin %d %d %d\n",U_R,U_G,U_B); //debug end TMP_RR=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(RIN+i))>>RDIV)-U_R); TMP_GG=0.0;//(((*(GIN+i))>>GDIV)-U_G)*(((*(GIN+i))>>GDIV)-U_G); TMP_BB=0.0;//(((*(BIN+i))>>BDIV)-U_B)*(((*(BIN+i))>>BDIV)-U_B); TMP_RG=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(GIN+i))>>GDIV)-U_G); TMP_RB=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(BIN+i))>>BDIV)-U_B); TMP_GB=0.0;//(((*(GIN+i))>>GDIV)-U_G)*(((*(BIN+i))>>BDIV)-U_B); for(i=0;i 0){ fprintf(stderr,"Jacobi syuusoku simasen!!\n"); exit(0); } // if((A1[0][0] == A1[1][1]) || (A1[1][1] == A1[2][2]) || (A1[0][0] == A1[2][2]) ){ // fprintf(stderr,"Igen Value duplication!!\n"); // exit(0); // } //debug start // for(i=0;i<3;i++){ // for(m=0;m<3;m++){ // fprintf(stderr,"%f ",A1[i][m]); // } // fprintf(stderr,"\n"); // } //debug end IGENMAX = -999999999999999999.9; for(i=0;i<3;i++){ if(A1[i][i] > IGENMAX ){ IGENMAX = A1[i][i]; Y = i; } } DIVIDENUM = 3; //ohtsu tuika start for(i=0;i=0.0){ if(*(RRR33+i)>=DTHRESH){ *(INDEX+i) = DIVIDENUM-1; k++; } else { ; l++; } } } PT[MEN][0].INDEXNO = j; PT[MEN][1].INDEXNO = DIVIDENUM - 1; PT[MEN][0].INDEXNUM = l; PT[MEN][1].INDEXNUM = k; //max distance div tuika //maxdistance tuika start U_R=0.0; U_G=0.0; U_B=0.0; //0側のmaxdistanceを求める for(i=0;i>RDIV); // U_G = (U_G>>GDIV); // U_B = (U_B>>BDIV); if(bun == 0){ MAXD = 0.0; for(i=0;i 255.0){ EDGERASISAYD = 255.0; } TEMP += pow(((((*(YIN+i))) - U_R)*(((*(YIN+i))) - U_R) + (((*(UIN+i))) - U_G)*(((*(UIN+i))) - U_G) + (((*(VIN+i))) - U_B)*(((*(VIN+i))) - U_B)),pw/2.0)*pow((255.0-EDGERASISAYD)/255.0,pw2); // if( MAXD < TEMP){ // MAXD = TEMP; // } } } } } PT[MEN][0].MAXDISTANCE = TEMP; } else if(bun == 2 || bun == 3 || bun == 4 || bun == 5){ TMP_RR=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(RIN+i))>>RDIV)-U_R); TMP_GG=0.0;//(((*(GIN+i))>>GDIV)-U_G)*(((*(GIN+i))>>GDIV)-U_G); TMP_BB=0.0;//(((*(BIN+i))>>BDIV)-U_B)*(((*(BIN+i))>>BDIV)-U_B); TMP_RG=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(GIN+i))>>GDIV)-U_G); TMP_RB=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(BIN+i))>>BDIV)-U_B); TMP_GB=0.0;//(((*(GIN+i))>>GDIV)-U_G)*(((*(BIN+i))>>BDIV)-U_B); for(i=0;i 0){ fprintf(stderr,"Jacobi syuusoku simasen!!\n"); exit(0); } // if((A1[0][0] == A1[1][1]) || (A1[1][1] == A1[2][2]) || (A1[0][0] == A1[2][2]) ){ // fprintf(stderr,"Igen Value duplication!!\n"); // exit(0); // } //debug start // for(i=0;i<3;i++){ // for(m=0;m<3;m++){ // fprintf(stderr,"%f ",A1[i][m]); // } // fprintf(stderr,"\n"); // } //debug end IGENMAX = -999999999999999999.9; for(i=0;i<3;i++){ if(A1[i][i] > IGENMAX ){ IGENMAX = A1[i][i]; Y = i; } } if(bun == 2){ PT[MEN][0].MAXDISTANCE = IGENMAX*(double)(PT[MEN][0].INDEXNUM); } if(bun == 3){ PT[MEN][0].MAXDISTANCE = IGENMAX; } if(bun == 4 || bun == 5){ for(i=0;i RRRRRR[i]){ MINN = RRRRRR[i]; } } if(bun == 4){ PT[MEN][0].MAXDISTANCE = MAXX - MINN; } if(bun == 5){ PT[MEN][0].MAXDISTANCE = (MAXX - MINN)*(double)PT[MEN][0].INDEXNUM; } } }//bun == 1 if end } else { PT[MEN][0].MAXDISTANCE = 0.0; } U_R=0.0; U_G=0.0; U_B=0.0; //1側のmaxdistanceを求める for(i=0;i>RDIV); // U_G = (U_G>>GDIV); // U_B = (U_B>>BDIV); if(bun == 0){ MAXD = 0.0; for(i=0;i 255.0){ EDGERASISAYD = 255.0; } TEMP += pow(((((*(YIN+i))) - U_R)*(((*(YIN+i))) - U_R) + (((*(UIN+i))) - U_G)*(((*(UIN+i))) - U_G) + (((*(VIN+i))) - U_B)*(((*(VIN+i))) - U_B)),pw/2.0)*pow((255.0-EDGERASISAYD)/255.0,pw2); // if( MAXD < TEMP){ // MAXD = TEMP; // } } } } } PT[MEN][1].MAXDISTANCE = TEMP; } else if(bun == 2 || bun == 3 || bun == 4 || bun == 5){ TMP_RR=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(RIN+i))>>RDIV)-U_R); TMP_GG=0.0;//(((*(GIN+i))>>GDIV)-U_G)*(((*(GIN+i))>>GDIV)-U_G); TMP_BB=0.0;//(((*(BIN+i))>>BDIV)-U_B)*(((*(BIN+i))>>BDIV)-U_B); TMP_RG=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(GIN+i))>>GDIV)-U_G); TMP_RB=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(BIN+i))>>BDIV)-U_B); TMP_GB=0.0;//(((*(GIN+i))>>GDIV)-U_G)*(((*(BIN+i))>>BDIV)-U_B); for(i=0;i 0){ fprintf(stderr,"Jacobi syuusoku simasen!!\n"); exit(0); } // if((A1[0][0] == A1[1][1]) || (A1[1][1] == A1[2][2]) || (A1[0][0] == A1[2][2]) ){ // fprintf(stderr,"Igen Value duplication!!\n"); // exit(0); // } //debug start // for(i=0;i<3;i++){ // for(m=0;m<3;m++){ // fprintf(stderr,"%f ",A1[i][m]); // } // fprintf(stderr,"\n"); // } //debug end IGENMAX = -999999999999999999.9; for(i=0;i<3;i++){ if(A1[i][i] > IGENMAX ){ IGENMAX = A1[i][i]; Y = i; } } if(bun == 2){ PT[MEN][1].MAXDISTANCE = IGENMAX*(double)(PT[MEN][1].INDEXNUM); } if(bun == 3){ PT[MEN][1].MAXDISTANCE = IGENMAX; } if(bun == 4 || bun == 5){ for(i=0;i RRRRRR[i]){ MINN = RRRRRR[i]; } } if(bun == 4){ PT[MEN][1].MAXDISTANCE = MAXX - MINN; } if(bun == 5){ PT[MEN][1].MAXDISTANCE = (MAXX - MINN)*(double)PT[MEN][1].INDEXNUM; } } }//bun == 1 if end } else { PT[MEN][1].MAXDISTANCE = 0.0; } //max distance div end if(j == 0){ for(i=2;i<=DIVIDENUM-1;i++){ PT[MEN][i].INDEXNO =PT[NMEN][i-1].INDEXNO; PT[MEN][i].INDEXNUM =PT[NMEN][i-1].INDEXNUM; PT[MEN][i].MAXDISTANCE = PT[NMEN][i-1].MAXDISTANCE;//max distance div tuika } } if((j >= 1) && (j <=(DIVIDENUM-3))){ for(i=2;i<=j+1;i++){ //// i i-2 PT[MEN][i].INDEXNO =PT[NMEN][i-2].INDEXNO; PT[MEN][i].INDEXNUM =PT[NMEN][i-2].INDEXNUM; PT[MEN][i].MAXDISTANCE = PT[NMEN][i-2].MAXDISTANCE;//max distance div tuika } for(i=j+2;i<=DIVIDENUM-1;i++){ //// i i-1 PT[MEN][i].INDEXNO =PT[NMEN][i-1].INDEXNO; PT[MEN][i].INDEXNUM =PT[NMEN][i-1].INDEXNUM; PT[MEN][i].MAXDISTANCE = PT[NMEN][i-1].MAXDISTANCE;//max distance div tuika } } if(j == (DIVIDENUM-2)){ for(i=2;i<=j+1;i++){ //// i i-2 PT[MEN][i].INDEXNO =PT[NMEN][i-2].INDEXNO; PT[MEN][i].INDEXNUM =PT[NMEN][i-2].INDEXNUM; PT[MEN][i].MAXDISTANCE = PT[NMEN][i-2].MAXDISTANCE;//max distance div tuika } } double MAXBUNSAN = 100.0; //9/9 kokokara while(DIVIDENUM < 256){ //最大画素数のブロックをさがし、そのINDEXNOを調べる。 MAXINDEXNUM = -1.0; if((bun == 1) || (bun == 2) || (bun == 3) ||(bun == 4) ||(bun == 5)){ for(i=0;i MAXINDEXNUM) // MAXINDEXNUM = PT[MEN][i].INDEXNUM; if(PT[MEN][i].MAXDISTANCE/**PT[MEN][i].INDEXNUM*/ > MAXINDEXNUM){ MAXINDEXNUM = PT[MEN][i].MAXDISTANCE/**PT[MEN][i].INDEXNUM*/;//max distance tuika NUM = i; } } } else if(bun == 0){ for(i=0;i MAXINDEXNUM) // MAXINDEXNUM = PT[MEN][i].INDEXNUM; if(PT[MEN][i].MAXDISTANCE*PT[MEN][i].INDEXNUM > MAXINDEXNUM){ MAXINDEXNUM = PT[MEN][i].MAXDISTANCE*PT[MEN][i].INDEXNUM;//max distance tuika NUM = i; } } } FLAG = 0; label: //debug start if(DIVIDENUM == 41){ fprintf(stderr,"NUM= %d\n",NUM); fprintf(stderr,"PT[MEN][%d].INDEXNO=%d\n",NUM,PT[MEN][NUM].INDEXNO); } //debug end //次に分轄するブロックNO----- NUM //次に分轄するINDEXNO-------- PT[MEN][NUM].INDEXNO U_R=0.0; U_G=0.0; U_B=0.0; for(i=0;i>RDIV); // U_G = (U_G>>GDIV); // U_B = (U_B>>BDIV); //debug start // if(DIVIDENUM == 41){ // fprintf(stderr,"AVE= %d %d %d\n",U_R,U_G,U_B); // fprintf(stderr,"NUM= %d\n",NUM); // } //debug end TMP_RR=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(RIN+i))>>RDIV)-U_R); TMP_GG=0.0;//(((*(GIN+i))>>GDIV)-U_G)*(((*(GIN+i))>>GDIV)-U_G); TMP_BB=0.0;//(((*(BIN+i))>>BDIV)-U_B)*(((*(BIN+i))>>BDIV)-U_B); TMP_RG=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(GIN+i))>>GDIV)-U_G); TMP_RB=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(BIN+i))>>BDIV)-U_B); TMP_GB=0.0;//(((*(GIN+i))>>GDIV)-U_G)*(((*(BIN+i))>>BDIV)-U_B); for(i=0;i 0){ fprintf(stderr,"Jacobi syuusoku simasen!!\n"); exit(0); } // if((A1[0][0] == A1[1][1]) || (A1[1][1] == A1[2][2]) || (A1[0][0] == A1[2][2]) ){ // fprintf(stderr,"Igen Value duplication!!\n"); // exit(0); // } //debug start //if(DIVIDENUM == 4){ // for(i=0;i<3;i++){ // for(m=0;m<3;m++){ // fprintf(stderr,"%f ",A1[i][m]); // } // fprintf(stderr,"\n"); // } //} //debug end IGENMAX = -999999999999999999.9; for(i=0;i<3;i++){ if(A1[i][i] > IGENMAX ){ IGENMAX = A1[i][i]; Y = i; } } DIVIDENUM++; //ohtsu tuika start for(i=0;i=0.0){ if(*(RRR33+i)>=DTHRESH){ *(INDEX+i) = DIVIDENUM-1; k++; } else { ; l++; } } } if(MEN == 1){ MEN = 0; NMEN = 1; } else { MEN = 1; NMEN = 0; } PT[MEN][0].INDEXNO = PT[NMEN][NUM].INDEXNO; PT[MEN][1].INDEXNO = DIVIDENUM - 1; PT[MEN][0].INDEXNUM = l; PT[MEN][1].INDEXNUM = k; //debug start if(DIVIDENUM == 5 || DIVIDENUM == 6){ fprintf(stderr,"INDEXNO%d %d\n",PT[MEN][0].INDEXNO,l); fprintf(stderr,"INDEXNO%d %d\n",PT[MEN][1].INDEXNO,k); } //while(1); //debug end //max distance divide tuika //maxdistance tuika start U_R=0.0; U_G=0.0; U_B=0.0; //0側のmaxdistanceを求める for(i=0;i>RDIV); // U_G = (U_G>>GDIV); // U_B = (U_B>>BDIV); if(bun == 0){ MAXD = 0.0; for(i=0;i 255.0){ EDGERASISAYD = 255.0; } TEMP += pow(((((*(YIN+i))) - U_R)*(((*(YIN+i))) - U_R) + (((*(UIN+i))) - U_G)*(((*(UIN+i))) - U_G) + (((*(VIN+i))) - U_B)*(((*(VIN+i))) - U_B)),pw/2.0)*pow((255.0-EDGERASISAYD)/255.0,pw2); // if( MAXD < TEMP){ // MAXD = TEMP; // } } } } } PT[MEN][0].MAXDISTANCE = TEMP; } else if(bun == 2 || bun == 3 || bun == 4 || bun == 5){ TMP_RR=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(RIN+i))>>RDIV)-U_R); TMP_GG=0.0;//(((*(GIN+i))>>GDIV)-U_G)*(((*(GIN+i))>>GDIV)-U_G); TMP_BB=0.0;//(((*(BIN+i))>>BDIV)-U_B)*(((*(BIN+i))>>BDIV)-U_B); TMP_RG=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(GIN+i))>>GDIV)-U_G); TMP_RB=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(BIN+i))>>BDIV)-U_B); TMP_GB=0.0;//(((*(GIN+i))>>GDIV)-U_G)*(((*(BIN+i))>>BDIV)-U_B); for(i=0;i 0){ fprintf(stderr,"Jacobi syuusoku simasen!!\n"); exit(0); } // if((A1[0][0] == A1[1][1]) || (A1[1][1] == A1[2][2]) || (A1[0][0] == A1[2][2]) ){ // fprintf(stderr,"Igen Value duplication!!\n"); // exit(0); // } //debug start //if(DIVIDENUM == 4){ // for(i=0;i<3;i++){ // for(m=0;m<3;m++){ // fprintf(stderr,"%f ",A1[i][m]); // } // fprintf(stderr,"\n"); // } //} //debug end IGENMAX = -999999999999999999.9; for(i=0;i<3;i++){ if(A1[i][i] > IGENMAX ){ IGENMAX = A1[i][i]; Y = i; } } if(bun == 2){ PT[MEN][0].MAXDISTANCE = IGENMAX*(double)PT[MEN][0].INDEXNUM; } if(bun == 3){ PT[MEN][0].MAXDISTANCE = IGENMAX; } if(bun == 4 || bun == 5){ for(i=0;i RRRRRR[i]){ MINN = RRRRRR[i]; } } if(bun == 4){ PT[MEN][0].MAXDISTANCE = MAXX - MINN; } if(bun == 5){ PT[MEN][0].MAXDISTANCE = (MAXX - MINN)*(double)PT[MEN][0].INDEXNUM; } } }//bun == 1 if end } else { PT[MEN][0].MAXDISTANCE = 0.0; } U_R=0.0; U_G=0.0; U_B=0.0; //1側のmaxdistanceを求める for(i=0;i>RDIV); // U_G = (U_G>>GDIV); // U_B = (U_B>>BDIV); if(bun == 0){ MAXD = 0.0; for(i=0;i 255.0){ EDGERASISAYD = 255.0; } TEMP += pow(((((*(YIN+i))) - U_R)*(((*(YIN+i))) - U_R) + (((*(UIN+i))) - U_G)*(((*(UIN+i))) - U_G) + (((*(VIN+i))) - U_B)*(((*(VIN+i))) - U_B)),pw/2.0)*pow((255.0-EDGERASISAYD)/255.0,pw2); // if( MAXD < TEMP){ // MAXD = TEMP; // } } } } } PT[MEN][1].MAXDISTANCE = TEMP; } else if(bun == 2 || bun == 3 || bun == 4 || bun == 5){ TMP_RR=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(RIN+i))>>RDIV)-U_R); TMP_GG=0.0;//(((*(GIN+i))>>GDIV)-U_G)*(((*(GIN+i))>>GDIV)-U_G); TMP_BB=0.0;//(((*(BIN+i))>>BDIV)-U_B)*(((*(BIN+i))>>BDIV)-U_B); TMP_RG=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(GIN+i))>>GDIV)-U_G); TMP_RB=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(BIN+i))>>BDIV)-U_B); TMP_GB=0.0;//(((*(GIN+i))>>GDIV)-U_G)*(((*(BIN+i))>>BDIV)-U_B); for(i=0;i 0){ fprintf(stderr,"Jacobi syuusoku simasen!!\n"); exit(0); } // if((A1[0][0] == A1[1][1]) || (A1[1][1] == A1[2][2]) || (A1[0][0] == A1[2][2]) ){ // fprintf(stderr,"Igen Value duplication!!\n"); // exit(0); // } //debug start //if(DIVIDENUM == 4){ // for(i=0;i<3;i++){ // for(m=0;m<3;m++){ // fprintf(stderr,"%f ",A1[i][m]); // } // fprintf(stderr,"\n"); // } //} //debug end IGENMAX = -999999999999999999.9; for(i=0;i<3;i++){ if(A1[i][i] > IGENMAX ){ IGENMAX = A1[i][i]; Y = i; } } if(bun == 2){ PT[MEN][1].MAXDISTANCE = IGENMAX*(double)PT[MEN][1].INDEXNUM; } if(bun == 3){ PT[MEN][1].MAXDISTANCE = IGENMAX; } if(bun == 4 || bun == 5){ for(i=0;i RRRRRR[i]){ MINN = RRRRRR[i]; } } if(bun == 4){ PT[MEN][1].MAXDISTANCE = MAXX - MINN; } if(bun == 5){ PT[MEN][1].MAXDISTANCE = (MAXX - MINN)*(double)PT[MEN][1].INDEXNUM; } } }//bun == 1 if end } else { PT[MEN][1].MAXDISTANCE = 0.0; } //max distance div end //分割しなかったボックスのパラメータを違うMEN*に保存 if(NUM == 0){ for(i=2;i<=DIVIDENUM-1;i++){ PT[MEN][i].INDEXNO =PT[NMEN][i-1].INDEXNO; PT[MEN][i].INDEXNUM =PT[NMEN][i-1].INDEXNUM; PT[MEN][i].MAXDISTANCE = PT[NMEN][i-1].MAXDISTANCE; } } if((NUM >= 1) && (NUM <=(DIVIDENUM-3))){ for(i=2;i<=NUM+1;i++){ // i i-2 PT[MEN][i].INDEXNO =PT[NMEN][i-2].INDEXNO; PT[MEN][i].INDEXNUM =PT[NMEN][i-2].INDEXNUM; PT[MEN][i].MAXDISTANCE = PT[NMEN][i-2].MAXDISTANCE; } for(i=NUM+2;i<=DIVIDENUM-1;i++){ // i i-1 PT[MEN][i].INDEXNO =PT[NMEN][i-1].INDEXNO; PT[MEN][i].INDEXNUM =PT[NMEN][i-1].INDEXNUM; PT[MEN][i].MAXDISTANCE = PT[NMEN][i-1].MAXDISTANCE; } } if(NUM == (DIVIDENUM-2)){ for(i=2;i<=NUM+1;i++){ // i i-2 PT[MEN][i].INDEXNO =PT[NMEN][i-2].INDEXNO; PT[MEN][i].INDEXNUM =PT[NMEN][i-2].INDEXNUM; PT[MEN][i].MAXDISTANCE = PT[NMEN][i-2].MAXDISTANCE; } } //debug start if(DIVIDENUM == 256 ){ for(i=0;i=0.0540269630587776405948631399435028){ KAARII = pow(KAARII/255.0,2.2/3.0)*255.0; }else{ KAARII = pow(KAARII/255.0/0.142913647595774056881018286010431,2.2)*255.0; } FREDUCE_R[i] = KAARII; // r3=colortrim2(R/255/16384); // if (r3>=0.0540269630587776405948631399435028) // rr=Math.Pow(r3,2.2/3.0)*255; // else // rr=Math.Pow(r3/0.142913647595774056881018286010431,2.2)*255; KAARII = ((((float)(Y_JYUSHIN[i])*1.0000893144198046)-0.4320813565838843*((float)(U_JYUSHIN[i]))-0.89314419804726*((float)(V_JYUSHIN[i])))); if(KAARII/255.0 >=0.0540269630587776405948631399435028){ KAARII = pow(KAARII/255.0,2.2/3.0)*255.0; }else{ KAARII = pow(KAARII/255.0/0.142913647595774056881018286010431,2.2)*255.0; } FREDUCE_G[i] = KAARII; KAARII = ((((float)(Y_JYUSHIN[i])*1.0000000115762946)+2.213731098385467*((float)(U_JYUSHIN[i]))-0.00011576294529099052*((float)(V_JYUSHIN[i])))); if(KAARII/255.0 >=0.0540269630587776405948631399435028){ KAARII = pow(KAARII/255.0,2.2/3.0)*255.0; }else{ KAARII = pow(KAARII/255.0/0.142913647595774056881018286010431,2.2)*255.0; } FREDUCE_B[i] = KAARII; FREDUCE_R[i] = 255.0*pow(((float)FREDUCE_R[i])/255.0,1.0/rgamma);//(int)((((float)(Y_JYUSHIN[i])/((float)(YMULT)))+1.40200*((float)(V_JYUSHIN[i])/((float)(RMULT))-128.0))+0.5); FREDUCE_G[i] = 255.0*pow(((float)FREDUCE_G[i])/255.0,1.0/gamma);//(int)((((float)(Y_JYUSHIN[i])/((float)(YMULT)))-0.34414*((float)(U_JYUSHIN[i])/((float)(BMULT))-128.0)-0.71414*((float)(V_JYUSHIN[i])/((float)(RMULT))-128.0))+0.5); FREDUCE_B[i] = 255.0*pow(((float)FREDUCE_B[i])/255.0,1.0/bgamma);//(int)((((float)(Y_JYUSHIN[i])/((float)(YMULT)))+1.77200*((float)(U_JYUSHIN[i]/((float)(BMULT)))-128.0))+0.5); IREDUCE_R[i]=(int)(FREDUCE_R[i]+0.5); IREDUCE_G[i]=(int)(FREDUCE_G[i]+0.5); IREDUCE_B[i]=(int)(FREDUCE_B[i]+0.5); } } else if(cs == 5){ for(i=0;i=0.0540269630587776405948631399435028){ KAARII = pow(KAARII/255.0,2.2/3.0)*255.0; }else{ KAARII = pow(KAARII/255.0/0.142913647595774056881018286010431,2.2)*255.0; } FREDUCE_R[i] = KAARII; // r3=colortrim2(R/255/16384); // if (r3>=0.0540269630587776405948631399435028) // rr=Math.Pow(r3,2.2/3.0)*255; // else // rr=Math.Pow(r3/0.142913647595774056881018286010431,2.2)*255; KAARII = Y_JYUSHIN[i];//)*1.0000893144198046)-0.4320813565838843*((float)(U_JYUSHIN[i]))-0.89314419804726*((float)(V_JYUSHIN[i])))); if(KAARII/255.0 >=0.0540269630587776405948631399435028){ KAARII = pow(KAARII/255.0,2.2/3.0)*255.0; }else{ KAARII = pow(KAARII/255.0/0.142913647595774056881018286010431,2.2)*255.0; } FREDUCE_G[i] = KAARII; KAARII = U_JYUSHIN[i];//))-0.00011576294529099052*((float)(V_JYUSHIN[i])))); if(KAARII/255.0 >=0.0540269630587776405948631399435028){ KAARII = pow(KAARII/255.0,2.2/3.0)*255.0; }else{ KAARII = pow(KAARII/255.0/0.142913647595774056881018286010431,2.2)*255.0; } FREDUCE_B[i] = KAARII; FREDUCE_R[i] = 255.0*pow(((float)FREDUCE_R[i])/255.0,1.0/rgamma);//(int)((((float)(Y_JYUSHIN[i])/((float)(YMULT)))+1.40200*((float)(V_JYUSHIN[i])/((float)(RMULT))-128.0))+0.5); FREDUCE_G[i] = 255.0*pow(((float)FREDUCE_G[i])/255.0,1.0/gamma);//(int)((((float)(Y_JYUSHIN[i])/((float)(YMULT)))-0.34414*((float)(U_JYUSHIN[i])/((float)(BMULT))-128.0)-0.71414*((float)(V_JYUSHIN[i])/((float)(RMULT))-128.0))+0.5); FREDUCE_B[i] = 255.0*pow(((float)FREDUCE_B[i])/255.0,1.0/bgamma);//(int)((((float)(Y_JYUSHIN[i])/((float)(YMULT)))+1.77200*((float)(U_JYUSHIN[i]/((float)(BMULT)))-128.0))+0.5); IREDUCE_R[i]=(int)(FREDUCE_R[i]+0.5); IREDUCE_G[i]=(int)(FREDUCE_G[i]+0.5); IREDUCE_B[i]=(int)(FREDUCE_B[i]+0.5); } } else if(cs == 8){ for(i=0;i=0.0540269630587776405948631399435028){ KAARII = pow(KAARII/255.0,2.2/3.0)*255.0; }else{ KAARII = pow(KAARII/255.0/0.142913647595774056881018286010431,2.2)*255.0; } FREDUCE_R[i] = KAARII; // r3=colortrim2(R/255/16384); // if (r3>=0.0540269630587776405948631399435028) // rr=Math.Pow(r3,2.2/3.0)*255; // else // rr=Math.Pow(r3/0.142913647595774056881018286010431,2.2)*255; KAARII = FREDUCE_G[i];//)*1.0000893144198046)-0.4320813565838843*((float)(U_JYUSHIN[i]))-0.89314419804726*((float)(V_JYUSHIN[i])))); if(KAARII/255.0 >=0.0540269630587776405948631399435028){ KAARII = pow(KAARII/255.0,2.2/3.0)*255.0; }else{ KAARII = pow(KAARII/255.0/0.142913647595774056881018286010431,2.2)*255.0; } FREDUCE_G[i] = KAARII; KAARII = FREDUCE_B[i];//))-0.00011576294529099052*((float)(V_JYUSHIN[i])))); if(KAARII/255.0 >=0.0540269630587776405948631399435028){ KAARII = pow(KAARII/255.0,2.2/3.0)*255.0; }else{ KAARII = pow(KAARII/255.0/0.142913647595774056881018286010431,2.2)*255.0; } FREDUCE_B[i] = KAARII; FREDUCE_R[i] = 255.0*pow(((float)FREDUCE_R[i])/255.0,1.0/rgamma);//(int)((((float)(Y_JYUSHIN[i])/((float)(YMULT)))+1.40200*((float)(V_JYUSHIN[i])/((float)(RMULT))-128.0))+0.5); FREDUCE_G[i] = 255.0*pow(((float)FREDUCE_G[i])/255.0,1.0/gamma);//(int)((((float)(Y_JYUSHIN[i])/((float)(YMULT)))-0.34414*((float)(U_JYUSHIN[i])/((float)(BMULT))-128.0)-0.71414*((float)(V_JYUSHIN[i])/((float)(RMULT))-128.0))+0.5); FREDUCE_B[i] = 255.0*pow(((float)FREDUCE_B[i])/255.0,1.0/bgamma);//(int)((((float)(Y_JYUSHIN[i])/((float)(YMULT)))+1.77200*((float)(U_JYUSHIN[i]/((float)(BMULT)))-128.0))+0.5); IREDUCE_R[i]=(int)(FREDUCE_R[i]+0.5); IREDUCE_G[i]=(int)(FREDUCE_G[i]+0.5); IREDUCE_B[i]=(int)(FREDUCE_B[i]+0.5); } } for(i=0;i 255){ REDUCE_R[i] = 255; } else if(IREDUCE_R[i] < 0){ REDUCE_R[i] = 0; } else { REDUCE_R[i] = (unsigned char)(IREDUCE_R[i]); } if(IREDUCE_G[i] > 255){ REDUCE_G[i] = 255; } else if(IREDUCE_G[i] < 0){ REDUCE_G[i] = 0; } else { REDUCE_G[i] = (unsigned char)(IREDUCE_G[i]); } if(IREDUCE_B[i] > 255){ REDUCE_B[i] = 255; } else if(IREDUCE_B[i] < 0){ REDUCE_B[i] = 0; } else { REDUCE_B[i] = (unsigned char)(IREDUCE_B[i]); } } //debug start // for(i=0;i 255.0){ r=255.0; } if(r < 0.0){ r=0.0; } if(g > 255.0){ g=255.0; } if(g < 0.0){ g=0.0; } if(b > 255.0){ b=255.0; } if(b < 0.0){ b=0.0; }*/ // r= (*(IIRIN+x*vsize+y));//+((*(errorR+adr))/16); // g= (*(IIGIN+x*vsize+y));//+((*(errorG+adr))/16); // b= (*(IIBIN+x*vsize+y));//+((*(errorB+adr))/16); bst = 0; est = 999999.9e33; for(i=0;iee){ bst = i; est = ee; } } //debug start // printf("gosa=%d\n",(int)est); //debug end re = r-(double)(REDUCE_R[bst]); ge = g-(double)(REDUCE_G[bst]); be = b-(double)(REDUCE_B[bst]); // (*(errorR+adr+1)) += re*7; // (*(errorG+adr+1)) += ge*7; // (*(errorB+adr+1)) += be*7; // (*(errorR+adr+mx-1)) += re*3; // (*(errorG+adr+mx-1)) += ge*3; // (*(errorB+adr+mx-1)) += be*3; // (*(errorR+adr+mx)) += re*5; // (*(errorG+adr+mx)) += ge*5; // (*(errorB+adr+mx)) += be*5; // (*(errorR+adr+mx+1)) += re; // (*(errorG+adr+mx+1)) += ge; // (*(errorB+adr+mx+1)) += be; if(dither == 0){ (*(errorR+adr+1)) += re*7.0; (*(errorG+adr+1)) += ge*7.0; (*(errorB+adr+1)) += be*7.0; (*(errorR+adr+mx-1)) += re*3.0; (*(errorG+adr+mx-1)) += ge*3.0; (*(errorB+adr+mx-1)) += be*3.0; (*(errorR+adr+mx)) += re*5.0; (*(errorG+adr+mx)) += ge*5.0; (*(errorB+adr+mx)) += be*5.0; (*(errorR+adr+mx+1)) += re; (*(errorG+adr+mx+1)) += ge; (*(errorB+adr+mx+1)) += be; // (*(errorR+adr+mx)) += re*1; // (*(errorG+adr+mx)) += ge*1; // (*(errorB+adr+mx)) += be*1; } else if(dither == 1){ (*(errorR+adr+1)) += re*2.0; (*(errorG+adr+1)) += ge*2.0; (*(errorB+adr+1)) += be*2.0; (*(errorR+adr+mx-1)) += re; (*(errorG+adr+mx-1)) += ge; (*(errorB+adr+mx-1)) += be; (*(errorR+adr+mx)) += re; (*(errorG+adr+mx)) += ge; (*(errorB+adr+mx)) += be; // (*(errorR+adr+mx+1)) += re; // (*(errorG+adr+mx+1)) += ge; // (*(errorB+adr+mx+1)) += be; } else if(dither ==2){ (*(errorR+adr+1)) += re*8.0; (*(errorG+adr+1)) += ge*8.0; (*(errorB+adr+1)) += be*8.0; (*(errorR+adr+2)) += re*4.0; (*(errorG+adr+2)) += ge*4.0; (*(errorB+adr+2)) += be*4.0; (*(errorR+adr+mx-2)) += re*2.0; (*(errorG+adr+mx-2)) += ge*2.0; (*(errorB+adr+mx-2)) += be*2.0; (*(errorR+adr+mx-1)) += re*4.0; (*(errorG+adr+mx-1)) += ge*4.0; (*(errorB+adr+mx-1)) += be*4.0; (*(errorR+adr+mx)) += re*8.0; (*(errorG+adr+mx)) += ge*8.0; (*(errorB+adr+mx)) += be*8.0; (*(errorR+adr+mx+1)) += re*4.0; (*(errorG+adr+mx+1)) += ge*4.0; (*(errorB+adr+mx+1)) += be*4.0; (*(errorR+adr+mx+2)) += re*2.0; (*(errorG+adr+mx+2)) += ge*2.0; (*(errorB+adr+mx+2)) += be*2.0; (*(errorR+adr+mx*2-2)) += re; (*(errorG+adr+mx*2-2)) += ge; (*(errorB+adr+mx*2-2)) += be; (*(errorR+adr+mx*2-1)) += re*2.0; (*(errorG+adr+mx*2-1)) += ge*2.0; (*(errorB+adr+mx*2-1)) += be*2.0; (*(errorR+adr+mx*2)) += re*4.0; (*(errorG+adr+mx*2)) += ge*4.0; (*(errorB+adr+mx*2)) += be*4.0; (*(errorR+adr+mx*2+1)) += re*2.0; (*(errorG+adr+mx*2+1)) += ge*2.0; (*(errorB+adr+mx*2+1)) += be*2.0; (*(errorR+adr+mx*2+2)) += re; (*(errorG+adr+mx*2+2)) += ge; (*(errorB+adr+mx*2+2)) += be; } else if(dither == 3){ (*(errorR+adr+1)) += re*7.0; (*(errorG+adr+1)) += ge*7.0; (*(errorB+adr+1)) += be*7.0; (*(errorR+adr+2)) += re*5.0; (*(errorG+adr+2)) += ge*5.0; (*(errorB+adr+2)) += be*5.0; (*(errorR+adr+mx-2)) += re*3.0; (*(errorG+adr+mx-2)) += ge*3.0; (*(errorB+adr+mx-2)) += be*3.0; (*(errorR+adr+mx-1)) += re*4.0; (*(errorG+adr+mx-1)) += ge*4.0; (*(errorB+adr+mx-1)) += be*4.0; (*(errorR+adr+mx)) += re*7.0; (*(errorG+adr+mx)) += ge*7.0; (*(errorB+adr+mx)) += be*7.0; (*(errorR+adr+mx+1)) += re*5.0; (*(errorG+adr+mx+1)) += ge*5.0; (*(errorB+adr+mx+1)) += be*5.0; (*(errorR+adr+mx+2)) += re*3.0; (*(errorG+adr+mx+2)) += ge*3.0; (*(errorB+adr+mx+2)) += be*3.0; (*(errorR+adr+mx*2-2)) += re; (*(errorG+adr+mx*2-2)) += ge; (*(errorB+adr+mx*2-2)) += be; (*(errorR+adr+mx*2-1)) += re*3.0; (*(errorG+adr+mx*2-1)) += ge*3.0; (*(errorB+adr+mx*2-1)) += be*3.0; (*(errorR+adr+mx*2)) += re*5.0; (*(errorG+adr+mx*2)) += ge*5.0; (*(errorB+adr+mx*2)) += be*5.0; (*(errorR+adr+mx*2+1)) += re*3.0; (*(errorG+adr+mx*2+1)) += ge*3.0; (*(errorB+adr+mx*2+1)) += be*3.0; (*(errorR+adr+mx*2+2)) += re; (*(errorG+adr+mx*2+2)) += ge; (*(errorB+adr+mx*2+2)) += be; } (*(IIRIN+x*vsize+y)) = (REDUCE_R[bst]); (*(IIGIN+x*vsize+y)) = (REDUCE_G[bst]); (*(IIBIN+x*vsize+y)) = (REDUCE_B[bst]); // (*(IIRIN+x*vsize+y)) = (int)(REDUCE_R[*(PALETGAZOU+x*vsize+y)]); // (*(IIGIN+x*vsize+y)) = (int)(REDUCE_G[*(PALETGAZOU+x*vsize+y)]); // (*(IIBIN+x*vsize+y)) = (int)(REDUCE_B[*(PALETGAZOU+x*vsize+y)]); } if(dither == 0 || dither == 1){ for(j=0;j 255.0){ r=255.0; } if(r < 0.0){ r=0.0; } if(g > 255.0){ g=255.0; } if(g < 0.0){ g=0.0; } if(b > 255.0){ b=255.0; } if(b < 0.0){ b=0.0; }*/ // r= (*(IIRIN+x*vsize+y));//+((*(errorR+adr))/16); // g= (*(IIGIN+x*vsize+y));//+((*(errorG+adr))/16); // b= (*(IIBIN+x*vsize+y));//+((*(errorB+adr))/16); bst = 0; est = 999999.9e33; for(i=0;iee){ bst = i; est = ee; } } //debug start // printf("gosa=%d\n",(int)est); //debug end re = r-(double)(V_JYUSHIN1[bst]); ge = g-(double)(Y_JYUSHIN1[bst]); be = b-(double)(U_JYUSHIN1[bst]); // (*(errorR+adr+1)) += re*7; // (*(errorG+adr+1)) += ge*7; // (*(errorB+adr+1)) += be*7; // (*(errorR+adr+mx-1)) += re*3; // (*(errorG+adr+mx-1)) += ge*3; // (*(errorB+adr+mx-1)) += be*3; // (*(errorR+adr+mx)) += re*5; // (*(errorG+adr+mx)) += ge*5; // (*(errorB+adr+mx)) += be*5; // (*(errorR+adr+mx+1)) += re; // (*(errorG+adr+mx+1)) += ge; // (*(errorB+adr+mx+1)) += be; if(dither == 0){ (*(errorR+adr+1)) += re*7.0; (*(errorG+adr+1)) += ge*7.0; (*(errorB+adr+1)) += be*7.0; (*(errorR+adr+mx-1)) += re*3.0; (*(errorG+adr+mx-1)) += ge*3.0; (*(errorB+adr+mx-1)) += be*3.0; (*(errorR+adr+mx)) += re*5.0; (*(errorG+adr+mx)) += ge*5.0; (*(errorB+adr+mx)) += be*5.0; (*(errorR+adr+mx+1)) += re; (*(errorG+adr+mx+1)) += ge; (*(errorB+adr+mx+1)) += be; // (*(errorR+adr+mx)) += re*1; // (*(errorG+adr+mx)) += ge*1; // (*(errorB+adr+mx)) += be*1; } else if(dither == 1){ (*(errorR+adr+1)) += re*2.0; (*(errorG+adr+1)) += ge*2.0; (*(errorB+adr+1)) += be*2.0; (*(errorR+adr+mx-1)) += re; (*(errorG+adr+mx-1)) += ge; (*(errorB+adr+mx-1)) += be; (*(errorR+adr+mx)) += re; (*(errorG+adr+mx)) += ge; (*(errorB+adr+mx)) += be; // (*(errorR+adr+mx+1)) += re; // (*(errorG+adr+mx+1)) += ge; // (*(errorB+adr+mx+1)) += be; } else if(dither ==2){ (*(errorR+adr+1)) += re*8.0; (*(errorG+adr+1)) += ge*8.0; (*(errorB+adr+1)) += be*8.0; (*(errorR+adr+2)) += re*4.0; (*(errorG+adr+2)) += ge*4.0; (*(errorB+adr+2)) += be*4.0; (*(errorR+adr+mx-2)) += re*2.0; (*(errorG+adr+mx-2)) += ge*2.0; (*(errorB+adr+mx-2)) += be*2.0; (*(errorR+adr+mx-1)) += re*4.0; (*(errorG+adr+mx-1)) += ge*4.0; (*(errorB+adr+mx-1)) += be*4.0; (*(errorR+adr+mx)) += re*8.0; (*(errorG+adr+mx)) += ge*8.0; (*(errorB+adr+mx)) += be*8.0; (*(errorR+adr+mx+1)) += re*4.0; (*(errorG+adr+mx+1)) += ge*4.0; (*(errorB+adr+mx+1)) += be*4.0; (*(errorR+adr+mx+2)) += re*2.0; (*(errorG+adr+mx+2)) += ge*2.0; (*(errorB+adr+mx+2)) += be*2.0; (*(errorR+adr+mx*2-2)) += re; (*(errorG+adr+mx*2-2)) += ge; (*(errorB+adr+mx*2-2)) += be; (*(errorR+adr+mx*2-1)) += re*2.0; (*(errorG+adr+mx*2-1)) += ge*2.0; (*(errorB+adr+mx*2-1)) += be*2.0; (*(errorR+adr+mx*2)) += re*4.0; (*(errorG+adr+mx*2)) += ge*4.0; (*(errorB+adr+mx*2)) += be*4.0; (*(errorR+adr+mx*2+1)) += re*2.0; (*(errorG+adr+mx*2+1)) += ge*2.0; (*(errorB+adr+mx*2+1)) += be*2.0; (*(errorR+adr+mx*2+2)) += re; (*(errorG+adr+mx*2+2)) += ge; (*(errorB+adr+mx*2+2)) += be; } else if(dither == 3){ (*(errorR+adr+1)) += re*7.0; (*(errorG+adr+1)) += ge*7.0; (*(errorB+adr+1)) += be*7.0; (*(errorR+adr+2)) += re*5.0; (*(errorG+adr+2)) += ge*5.0; (*(errorB+adr+2)) += be*5.0; (*(errorR+adr+mx-2)) += re*3.0; (*(errorG+adr+mx-2)) += ge*3.0; (*(errorB+adr+mx-2)) += be*3.0; (*(errorR+adr+mx-1)) += re*4.0; (*(errorG+adr+mx-1)) += ge*4.0; (*(errorB+adr+mx-1)) += be*4.0; (*(errorR+adr+mx)) += re*7.0; (*(errorG+adr+mx)) += ge*7.0; (*(errorB+adr+mx)) += be*7.0; (*(errorR+adr+mx+1)) += re*5.0; (*(errorG+adr+mx+1)) += ge*5.0; (*(errorB+adr+mx+1)) += be*5.0; (*(errorR+adr+mx+2)) += re*3.0; (*(errorG+adr+mx+2)) += ge*3.0; (*(errorB+adr+mx+2)) += be*3.0; (*(errorR+adr+mx*2-2)) += re; (*(errorG+adr+mx*2-2)) += ge; (*(errorB+adr+mx*2-2)) += be; (*(errorR+adr+mx*2-1)) += re*3.0; (*(errorG+adr+mx*2-1)) += ge*3.0; (*(errorB+adr+mx*2-1)) += be*3.0; (*(errorR+adr+mx*2)) += re*5.0; (*(errorG+adr+mx*2)) += ge*5.0; (*(errorB+adr+mx*2)) += be*5.0; (*(errorR+adr+mx*2+1)) += re*3.0; (*(errorG+adr+mx*2+1)) += ge*3.0; (*(errorB+adr+mx*2+1)) += be*3.0; (*(errorR+adr+mx*2+2)) += re; (*(errorG+adr+mx*2+2)) += ge; (*(errorB+adr+mx*2+2)) += be; } (*(IIRIN+x*vsize+y)) = (V_JYUSHIN1[bst]); (*(IIGIN+x*vsize+y)) = (Y_JYUSHIN1[bst]); (*(IIBIN+x*vsize+y)) = (U_JYUSHIN1[bst]); // (*(IIRIN+x*vsize+y)) = (int)(REDUCE_R[*(PALETGAZOU+x*vsize+y)]); // (*(IIGIN+x*vsize+y)) = (int)(REDUCE_G[*(PALETGAZOU+x*vsize+y)]); // (*(IIBIN+x*vsize+y)) = (int)(REDUCE_B[*(PALETGAZOU+x*vsize+y)]); } if(dither == 0 || dither == 1){ for(j=0;jedge = 6;cnt->et = 20;cnt->bai = 1.0;cnt->kmon = 1;cnt->edon=2;cnt->r=4.0;cnt->g=4.0;cnt->b=3.0; cnt->cs=3;cnt->gamma=1.1;cnt->rgamma=1.1;cnt->bgamma=1.1;cnt->ygamma=1.1;cnt->omh=4;cnt->hasyori=0.0; cnt->dither=0;cnt->per=0.75;cnt->pw=2.0;cnt->pw2=1.0;cnt->bun=1;cnt->lpfon=0;cnt->t=5.0;cnt->a=0.001; cnt->lpfk = 0.8; if(argc < 2){; print_help(cnt); exit(0); } /*******************************************/ /* */ /* MAIN KANSUU NO HIKISUU NO SYORI */ /* */ /*******************************************/ option_set(argc, argv, cnt); strcpy(inputfile,cnt->InputFileName); strcpy(outputfile,cnt->OutputFileName); /*******************************************/ /* */ /* BITMAP FILE OPEN */ /* */ /*******************************************/ if((fpr = fopen(inputfile,"rb"))==NULL){ exit(0); } fseek(fpr,18,SEEK_SET); fread(&hsize,sizeof(int),1,fpr);//hsize syutoku fread(&vsize,sizeof(int),1,fpr);//vsize syutoku fseek(fpr,2,SEEK_SET); fread(&filesizebyte,sizeof(int),1,fpr); /*******************************************/ /* */ /* PICTURE GET */ /* */ /*******************************************/ vin = (unsigned char *)malloc(sizeof(unsigned char)*(filesizebyte-54)); B = (unsigned char *)malloc(sizeof(unsigned char)*hsize*vsize); G = (unsigned char *)malloc(sizeof(unsigned char)*hsize*vsize); R = (unsigned char *)malloc(sizeof(unsigned char)*hsize*vsize); fseek(fpr,54,SEEK_SET); if(fread(vin,sizeof(unsigned char),filesizebyte - 54,fpr) != filesizebyte - 54){ fprintf(stderr,"InputFileSizeError!!!\n"); exit(0); } fclose(fpr); /*******************************************/ /* */ /* SET B,G,R ARRAYS WITH RGB PIXEL DATAS */ /* */ /*******************************************/ for(i=0,k=0;isizex, cnt->sizey, RIN, ROUT); // resize(hsize, vsize, cnt->sizex, cnt->sizey, GIN, GOUT); // resize(hsize, vsize, cnt->sizex, cnt->sizey, BIN, BOUT); /*cnt->edge = 3*/;/*cnt->et = 25;cnt->r = 3.0;cnt->g = 5.0;cnt->b = 1.0;*//*cnt->gamma = 1.0;*/ /*cnt->omh = 0;*/cnt->div = 1;//cnt->hasyori=20; MedianCut(hsize, vsize, RIN, GIN, BIN, PALETGAZOU,REDUCE_R,REDUCE_G,REDUCE_B,cnt->edge,cnt->et,cnt->edon,cnt->kmon,cnt->r,cnt->g,cnt->b,cnt->gamma,cnt->omh,cnt->hasyori,cnt->dither,cnt->cs,cnt->per,cnt->div,cnt->pw,cnt->pw2,cnt->t,cnt->a,cnt->rgamma,cnt->bgamma,cnt->ygamma,cnt->bun,cnt->lpfon,cnt->bai,cnt->lpfk);//ROUT, GOUT, BOUT); //debug start // for(;;); //debug end sprintf(cnt->OutputFileName,"%s.bmp",outputfile); fpw = fopen(cnt->OutputFileName,"wb"); //hsize = cnt->sizex; //vsize = cnt->sizey; /*******************************************/ /* */ /* BITMAP HEADER 54BYTES WRITE */ /* */ /*******************************************/ if((hsize%4) == 0){ filesize = 0x36 + 0x400 + hsize * vsize; } else { filesize = 0x36 + 0x400 + hsize * vsize + (4-hsize%4)*vsize; } temp = 0x42;//B fwrite(&temp,sizeof(unsigned char),1,fpw); temp = 0x4D;//M fwrite(&temp,sizeof(unsigned char),1,fpw); fwrite(&filesize,sizeof(int),1,fpw); filesize = 0; fwrite(&filesize,sizeof(int),1,fpw); // fwrite(&filesize,sizeof(int),1,fpw); filesize = 0x00000436; fwrite(&filesize,sizeof(int),1,fpw); filesize = 0x28; fwrite(&filesize,sizeof(int),1,fpw); fwrite(&hsize,sizeof(int),1,fpw); fwrite(&vsize,sizeof(int),1,fpw); filesize = 0x00080001; fwrite(&filesize,sizeof(int),1,fpw); filesize = 0x0; fwrite(&filesize,sizeof(int),1,fpw); if((hsize%4) == 0 ){ filesize = hsize*vsize; } else { filesize = hsize*vsize+(4-hsize%4)*vsize; } fwrite(&filesize,sizeof(int),1,fpw); filesize = 0x0; fwrite(&filesize,sizeof(int),1,fpw); fwrite(&filesize,sizeof(int),1,fpw); filesize = 0x100; fwrite(&filesize,sizeof(int),1,fpw); fwrite(&filesize,sizeof(int),1,fpw); temp = 0; for(i=0;i<256;i++){ fwrite(REDUCE_B+i,sizeof(unsigned char),1,fpw); fwrite(REDUCE_G+i,sizeof(unsigned char),1,fpw); fwrite(REDUCE_R+i,sizeof(unsigned char),1,fpw); fwrite(&temp,sizeof(unsigned char),1,fpw); } for(i=0;i