きょうは、聖子JAZZ2年目のコンサートにオーチャードホールに行ってきました。
去年に引き続き今年もいけたのはよかったです。
さすが、聖子さん、バックミュージシャンもぴか一の腕前のかたばかりですばらしかったです。
聖子さんのボーカルはもちろん、ドラムと弦楽団とサックスとフルートとベースとピアノとハープとギターがすばらしかった。結局全部よかったのです。琴線にさわったのは、ドラムのタイトな音、皮にあたる瞬間しか
力が入ってないドラムです。リズム隊がしっかりしていると演奏が引き締まること限りなしです。
やっぱり、その道を究めた人の歌や演奏はいいですね。
うっとりと聞いたり、盛り上がる曲では盛り上がり、一緒に歌うとこでは歌う。
きょうは、松任谷由実さんもお客さんとしてきていました。
生ユーミンははじめてだったので、貴重な1日になりました。
聖子さんの衣装も、白、黒、ピンクとおしゃれでした。
きょうのステージはギリシャ調のシンプルな飾りつけで、バックミュージシャンを前面におしだしていました。
ジャズはよくわからないけど、いいものはいいという1日でした。
今年は、あやかさんとマッキーをみにいくことが決まっています。
大物ミュージシャンばかりなので楽しみです。
きゅん。
wrapsignってなんだろなと考えていたら、最大と最小を探していることから、誤差拡散するときの最大と最小をさがしてる感じである。最大と最小をとると誤差拡散がきれいになるからである。
だから、これは、誤差拡散なしでは関係ないような気がする。

エッジ検出に関しては、RGBそれぞれに対してたてとよこのエッジを検出して6枚のエッジ画像をつくり
たてとよこのベクトル和をRGBそれぞれで2乗和の平方根をとって、8で割って、255からひいたもの
エッジがつよいほど小さな値をとり、エッジが弱いほど大きな値をとる数値に変換
それが160より小さいときつまりエッジが95より大きい時、エッジの画素、95より小さいときエッジでない画像として、分類しているようだ。エッジの方向とRGBの方向と6次元空間の距離を求めている。
/*******************************************/
/* */
/* SET B,G,R ARRAYS WITH RGB PIXEL DATAS */
/* */
/*******************************************/

for(i=0,k=0;i<vsize;i++){
for(j=0;j<hsize;j++){
*(B+j*vsize+i) = *(vin+k);
k++;
*(G+j*vsize+i) = *(vin+k);
k++;
*(R+j*vsize+i) = *(vin+k);
k++;
}
if(((hsize*3)%4) == 1){
k=k+3;
}
if(((hsize*3)%4) == 2){
k=k+2;
}
if(((hsize*3)%4) == 3){
k=k+1;
}
if(((hsize*3)%4) == 0){// kokokara 3gyou nakutemoyoi
;
}
}
BIN = (unsigned char *)malloc(sizeof(unsigned char)*hsize*vsize);
GIN = (unsigned char *)malloc(sizeof(unsigned char)*hsize*vsize);
RIN = (unsigned char *)malloc(sizeof(unsigned char)*hsize*vsize);

/*******************************************/
/* */
/* RGB PIXEL SITAKARA HAIRETU KARA UEKARA */
/* */
/* HAIRETU NI NAOSU */
/* */
/*******************************************/

for(i=0;i<vsize;i++){
for(j=0;j<hsize;j++){
*(RIN+j*vsize+i) = *(R+j*vsize+vsize-1-i);
*(GIN+j*vsize+i) = *(G+j*vsize+vsize-1-i);
*(BIN+j*vsize+i) = *(B+j*vsize+vsize-1-i);
}
}
free(R);
free(G);
free(B);
PALETGAZOU = (unsigned char*)malloc(sizeof(unsigned char)*hsize*vsize);

/*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->om);//ROUT, GOUT, BOUT);
sprintf(cnt->OutputFileName,"%s.bmp",outputfile);
fpw = fopen(cnt->OutputFileName,"wb");

/*******************************************/
/* */
/* 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<vsize;i++){
for(j=0;j<hsize;j++){
fwrite(PALETGAZOU+j*vsize+vsize-1-i,sizeof(unsigned char),1,fpw);
// fwrite(GOUT+j*vsize+vsize-1-i,sizeof(unsigned char),1,fpw);
// fwrite(ROUT+j*vsize+vsize-1-i,sizeof(unsigned char),1,fpw);
}
l=4-hsize%4;
if(l !=4 ){
for(k=0;k<l;k++){
fwrite(&temp,sizeof(unsigned char),1,fpw);
}
}
}
// free(ROUT);
// free(GOUT);
// free(BOUT);
free(PALETGAZOU);
fclose(fpw);

return 0;
}
for(i=0;i<hsize*vsize;i++){
*(IIRIN+i) = (*(RIN+i));
*(IIGIN+i) = (*(GIN+i));
*(IIBIN+i) = (*(BIN+i));
}
int mx;
if(dither == 0 || dither == 1){
mx = hsize+2;
} else if(dither == 2 || dither == 3){
mx = hsize + 4;
}
double *errorR;
double *errorG;
double *errorB;
if(dither == 0 || dither == 1){
errorR = (double*)malloc(sizeof(double)*mx*2);
errorG = (double*)malloc(sizeof(double)*mx*2);
errorB = (double*)malloc(sizeof(double)*mx*2);
} else if(dither == 2 || dither == 3){
errorR = (double*)malloc(sizeof(double)*mx*3);
errorG = (double*)malloc(sizeof(double)*mx*3);
errorB = (double*)malloc(sizeof(double)*mx*3);
}
double r=0.0;
double g=0.0;
double b=0.0;
double re=0.0;
double ge=0.0;
double be=0.0;
double ee=0.0;
double est=9999999999.9e33;
int bst=0;
int adr=0;
if(dither == 0 || dither == 1){
for(i=0;i<mx*2;i++){
*(errorR+i) = 0.0;
*(errorG+i) = 0.0;
*(errorB+i) = 0.0;
}
} else if(dither == 2 || dither == 3){
for(i=0;i<mx*3;i++){
*(errorR+i) = 0.0;
*(errorG+i) = 0.0;
*(errorB+i) = 0.0;
}
}
for(int y=0;y<vsize;y++){
for(int x=0;x<hsize;x++){
if(dither == 0 || dither == 1){
adr = x+1;
} else if(dither == 2 || dither == 3){
adr = x+2;
}
// r= (*(IIRIN+x*vsize+y))+((*(errorR+adr))/16);
// g= (*(IIGIN+x*vsize+y))+((*(errorG+adr))/16);
// b= (*(IIBIN+x*vsize+y))+((*(errorB+adr))/16);
if(dither == 0){
r= (double)(*(RIN+x*vsize+y))+((*(errorR+adr))/(16.0/(per+0.0000001))/*32.0*/);
g= (double)(*(GIN+x*vsize+y))+((*(errorG+adr))/(16.0/(per+0.0000001))/*32.0*/);
b= (double)(*(BIN+x*vsize+y))+((*(errorB+adr))/(16.0/(per+0.0000001))/*32.0*/);
} else if(dither == 1){
r= (double)(*(RIN+x*vsize+y))+((*(errorR+adr))/(4.0/(per+0.0000001)));
g= (double)(*(GIN+x*vsize+y))+((*(errorG+adr))/(4.0/(per+0.0000001)));
b= (double)(*(BIN+x*vsize+y))+((*(errorB+adr))/(4.0/(per+0.0000001)));
} else if(dither == 2){
r= (double)(*(RIN+x*vsize+y))+((*(errorR+adr))/(42.0/(per+0.0000001)));
g= (double)(*(GIN+x*vsize+y))+((*(errorG+adr))/(42.0/(per+0.0000001)));
b= (double)(*(BIN+x*vsize+y))+((*(errorB+adr))/(42.0/(per+0.0000001)));
} else if(dither == 3){
r= (double)(*(RIN+x*vsize+y))+((*(errorR+adr))/(48.0/(per+0.0000001)));
g= (double)(*(GIN+x*vsize+y))+((*(errorG+adr))/(48.0/(per+0.0000001)));
b= (double)(*(BIN+x*vsize+y))+((*(errorB+adr))/(48.0/(per+0.0000001)));
}
/* if(r > 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;i<256/*IROSUU*/;i++){
ee = (r-(double)(REDUCE_R[i]))*(r-(double)(REDUCE_R[i]))+(g-(double)(REDUCE_G[i]))*(g-(double)(REDUCE_G[i]))+(b-(double)(REDUCE_B[i]))*(b-(double)(REDUCE_B[i]));
if(est>ee){
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<mx;j++){
*(errorR+j) = *(errorR+j+mx);
*(errorG+j) = *(errorG+j+mx);
*(errorB+j) = *(errorB+j+mx);
*(errorR+j+mx) = 0.0;
*(errorG+j+mx) = 0.0;
*(errorB+j+mx) = 0.0;
}
} else if(dither == 2 || dither == 3){
for(j=0;j<mx;j++){
*(errorR+j) = *(errorR+j+mx);
*(errorG+j) = *(errorG+j+mx);
*(errorB+j) = *(errorB+j+mx);
*(errorR+j+mx) = *(errorR+j+2*mx);
*(errorG+j+mx) = *(errorG+j+2*mx);
*(errorB+j+mx) = *(errorB+j+2*mx);
*(errorR+j+2*mx) = 0.0;
*(errorG+j+2*mx) = 0.0;
*(errorB+j+2*mx) = 0.0;
}
}
}


// *(PALETGAZOU+i)
// IIRINに画像データがはいっている

for(i=0;i<hsize*vsize;i++){
for(j=0;j<256/*IROSUU*/;j++){
if( ((*(IIRIN+i)) == (REDUCE_R[j])) &&
((*(IIGIN+i)) == (REDUCE_G[j])) &&
((*(IIBIN+i)) == (REDUCE_B[j])) ){
*(PALETGAZOU+i) = j;
}
}
}
}//edon if end

}
int main(int argc,char *argv[])
{
if(argc < 2){;
print_help();
exit(0);
}
/*******************************************/
/* */
/* MAIN KANSUU NO HIKISUU NO SYORI */
/* */
/*******************************************/
CNTL *cnt;
char inputfile[255],outputfile[255];
FILE *fpr;
int i,j,k,l,m,n,o,p;
int hsize,vsize,filesizebyte;
unsigned char *GIN;
unsigned char *RIN;
// unsigned char *BOUT;
// unsigned char *GOUT;
// unsigned char *ROUT;
unsigned char *PALETGAZOU;
unsigned char REDUCE_R[256];
unsigned char REDUCE_G[256];
unsigned char REDUCE_B[256];
int filesize;
unsigned char temp;
FILE *fpw;

cnt = (CNTL *)malloc(sizeof(CNTL)*sizeof(unsigned char));unsigned char *BIN;
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 */
/* */
/*******************************************/
unsigned char *vin,*B,*G,*R;
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);
// for(i=0;i<hsize*vsize;i++){
// printf("BUF[%d] = %x\n",i,BUF[i]);
// }
// BUF[0] = 1;//1;
// BUF[1] = 2;//1;
// BUF[2] = 2;//2;
// BUF[3] = 3;//3;
// BUF[4] = 3;//3;
// BUF[5] = 4;//3;
// BUF[6] = 4;//4;

// hsize = 1; vsize=7;
int cnt,IROSUU,c,d,ctc,colorcount;
int *HISTCNT,*HISTIRO;
// int OMOMI = 8;
HISTCNT = (int*)malloc(sizeof(int)*hsize*vsize);
HISTIRO = (int*)malloc(sizeof(int)*hsize*vsize);
// c = picbuf[0] & 0xffffff;
c = BUF[0];
d = index3[0];
ctc = 1;
colorcount = 0;
// int kkkk = 0;

for (i = 1; i < hsize*vsize; i++)
{
// if (c != (k = picbuf[i]))
if((1 == index3[i]) || (c != BUF[i]) )
{
HISTCNT[colorcount] = ctc;
HISTIRO[colorcount] = c;
colorcount++;
// k = picbuf[i];
// c = k & 0xffffff;
c = BUF[i];
d = index3[i];
ctc = 0;
}
// if ((k & 0x1000000) > 0) ct += 8; else ct += 1;
if(index3[i] == 1) ctc += 8; else ctc +=1;
// if ((k & 0x1000000) > 0) kkkk++;
}
// if (c != 0x40000000)
// {
HISTCNT[colorcount] = ctc;
HISTIRO[colorcount] = c;
colorcount++;
// }
IROSUU = colorcount;

RGBtoYUV(IROSUU,HISTIRO,YIN,UIN,VIN);
// for(i=0;i<IROSUU;i++){
// printf("HISTCNT=%d\n",HISTCNT[i]);
// }
// for(i=0;i<IROSUU;i++){
// printf("Y[%d]=%f,U[%d]=%f,V[%d]=%f\n",i,Y[i],i,U[i],i,V[i]);
// }
// while(1);

// for(i=0;i<hsize*vsize;i++){
// if(i >= hsize*vsize-50 ){
// printf("BUF[%d]=%x\n",i,BUF[i]);
// }
// }
// for(i=0;i<hsize*vsize;i++){
// if(i >= 18900 && i <= 18965){
// printf("IRO[%d]=%x,CNT[%d]=%d\n",i,HISTIRO[i],i,HISTCNT[i]);
// }
// }
// printf("IROSUU=%d\n",IROSUU);
// while(1);

// for(i=0;i<256/*hsize*vsize*/;i++){
// RIN[i+j*256+k*256*256] = (unsigned char)(Y[i+j*256+k*256*256]+1.4018452447105*(V[i+j*256+k*256*256]-128.0)+0.5);
// GIN[i+j*256+k*256*256] = (unsigned char)(Y[i+j*256+k*256*256]-0.34511790321824*(U[i+j*256+k*256*256]-128.0)-0.71429038997809*(V[i+j*256+k*256*256]-128.0)+0.5);
// BIN[i+j*256+k*256*256] = (unsigned char)(Y[i+j*256+k*256*256]+1.7710177314704*(U[i+j*256+k*256*256]-128.0)+0.5);
// }
double U_R,U_G,U_B;
double **A , **A1, **A2, **X1, **X2, eps;
int i1, i2, ind, ct;
double TMP_RR;
double TMP_GG;
double TMP_BB;
double TMP_RG;
double TMP_RB;
double TMP_GB;

// for(p=0;p<256-1;p++){
U_R=0.0;
U_G=0.0;
U_B=0.0;
for(i=0;i<IROSUU;i++){
U_R += YIN[i]*HISTCNT[i];
U_G += UIN[i]*HISTCNT[i];
U_B += VIN[i]*HISTCNT[i];
}
int TOTAL;
TOTAL = 0;
for(i=0;i<IROSUU;i++){
TOTAL += HISTCNT[i];
}

U_R /= (double)(TOTAL);
U_G /= (double)(TOTAL);
U_B /= (double)(TOTAL);
printf("TOTAL=%d %f %f %f\n",TOTAL,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;
TMP_GG=0.0;
TMP_BB=0.0;
TMP_RG=0.0;
TMP_RB=0.0;
TMP_GB=0.0;
for(i=0;i<IROSUU;i++){
TMP_RR += (YIN[i]-U_R)*(YIN[i]-U_R)*HISTCNT[i];
TMP_GG += (UIN[i]-U_G)*(UIN[i]-U_G)*HISTCNT[i];
TMP_BB += (VIN[i]-U_B)*(VIN[i]-U_B)*HISTCNT[i];
TMP_RG += (YIN[i]-U_R)*(UIN[i]-U_G)*HISTCNT[i];
TMP_RB += (YIN[i]-U_R)*(VIN[i]-U_B)*HISTCNT[i];
TMP_GB += (UIN[i]-U_G)*(VIN[i]-U_B)*HISTCNT[i];
}
TMP_RR /= (double)(TOTAL);
TMP_GG /= (double)(TOTAL);
TMP_BB /= (double)(TOTAL);
TMP_RG /= (double)(TOTAL);
TMP_RB /= (double)(TOTAL);
TMP_GB /= (double)(TOTAL);
A[0][0]= TMP_RR;
A[0][1]= TMP_RG;
A[1][0]= TMP_RG;
A[1][1]= TMP_GG;
A[2][2]= TMP_BB;
A[0][2]= TMP_RB;
A[2][0]= TMP_RB;
A[1][2]= TMP_GB;
A[2][1]= TMP_GB;
printf("%f %f %f %f %f %f\n",TMP_RR,TMP_GG,TMP_BB,TMP_RG,TMP_GB,TMP_RB);
ind=Jacobi(3, ct, eps, A, A1, A2, X1, X2);

if(ind > 0){
fprintf(stderr,"Jacobi syuusoku simasen!!\n");
exit(0);
}
// }
double IGENMAX;
int YY;
IGENMAX = -999999999999999999.9e64;
for(i=0;i<3;i++){
if(A1[i][i] > IGENMAX ){
IGENMAX = A1[i][i];
YY = i;
}
}
//debug start
fprintf(stderr,"YY=%d\n",YY);
fprintf(stderr,"IGENVEC=%f %f %f\n",X1[0][YY],X1[1][YY],X1[2][YY]);
double *FLAG;
FLAG = (double*)malloc(sizeof(double)*IROSUU);
for(i=0;i<IROSUU;i++){
FLAG[i] = X1[0][YY] * YIN[i] + X1[1][YY] * UIN[i] + X1[2][YY] * VIN[i];
}
QSortd(FLAG,YIN,UIN,VIN,HISTCNT,0,IROSUU-1);
int bun;
bun = ohtsu(YIN,UIN,VIN,HISTCNT,0,IROSUU);
ryou[0].i=0;ryou[1].i=1;
ryou[0].start=0;ryou[1].start=bun;
ryou[0].cnt=bun;ryou[1].cnt=IROSUU-bun;
double bc,bunsanmax;
int rs;
p=2;
while(p <= 255){
bunsanmax=-1.0e64;
for(i=0;i<p;i++){
bc=bunsanculc(ryou[i].start,ryou[i].cnt,YIN,UIN,VIN,HISTCNT);
if(bunsanmax < bc){
bunsanmax = bc;
rs = i;
}
}
//rs bunsan ga itiban ookii ryou[rs]
// printf("ryouikibangou=%d\n",rs);






U_R=0.0;
U_G=0.0;
U_B=0.0;
for(i=ryou[rs].start;i<ryou[rs].start+ryou[rs].cnt;i++){
U_R += YIN[i]*HISTCNT[i];
U_G += UIN[i]*HISTCNT[i];
U_B += VIN[i]*HISTCNT[i];
}
//int TOTAL;
TOTAL = 0;
for(i=ryou[rs].start;i<ryou[rs].start+ryou[rs].cnt;i++){
TOTAL += HISTCNT[i];
}

U_R /= (double)(TOTAL);
U_G /= (double)(TOTAL);
U_B /= (double)(TOTAL);
printf("TOTAL=%d %f %f %f\n",TOTAL,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;
TMP_GG=0.0;
TMP_BB=0.0;
TMP_RG=0.0;
TMP_RB=0.0;
TMP_GB=0.0;
for(i=ryou[rs].start;i<ryou[rs].start+ryou[rs].cnt;i++){
TMP_RR += (YIN[i]-U_R)*(YIN[i]-U_R)*HISTCNT[i];
TMP_GG += (UIN[i]-U_G)*(UIN[i]-U_G)*HISTCNT[i];
TMP_BB += (VIN[i]-U_B)*(VIN[i]-U_B)*HISTCNT[i];
TMP_RG += (YIN[i]-U_R)*(UIN[i]-U_G)*HISTCNT[i];
TMP_RB += (YIN[i]-U_R)*(VIN[i]-U_B)*HISTCNT[i];
TMP_GB += (UIN[i]-U_G)*(VIN[i]-U_B)*HISTCNT[i];
}
TMP_RR /= (double)(TOTAL);
TMP_GG /= (double)(TOTAL);
TMP_BB /= (double)(TOTAL);
TMP_RG /= (double)(TOTAL);
TMP_RB /= (double)(TOTAL);
TMP_GB /= (double)(TOTAL);
A[0][0]= TMP_RR;
A[0][1]= TMP_RG;
A[1][0]= TMP_RG;
A[1][1]= TMP_GG;
A[2][2]= TMP_BB;
A[0][2]= TMP_RB;
A[2][0]= TMP_RB;
A[1][2]= TMP_GB;
A[2][1]= TMP_GB;
printf("%f %f %f %f %f %f\n",TMP_RR,TMP_GG,TMP_BB,TMP_RG,TMP_GB,TMP_RB);
ind=Jacobi(3, ct, eps, A, A1, A2, X1, X2);

if(ind > 0){
fprintf(stderr,"Jacobi syuusoku simasen!!\n");
exit(0);
}
// }
// double IGENMAX;
// int YY;
IGENMAX = -999999999999999999.9e64;
for(i=0;i<3;i++){
if(A1[i][i] > IGENMAX ){
IGENMAX = A1[i][i];
YY = i;
}
}
//debug start
fprintf(stderr,"YY=%d\n",YY);
fprintf(stderr,"IGENVEC=%f %f %f\n",X1[0][YY],X1[1][YY],X1[2][YY]);


for(i=ryou[rs].start;i<ryou[rs].start+ryou[rs].cnt;i++){
FLAG[i] = X1[0][YY] * YIN[i] + X1[1][YY] * UIN[i] + X1[2][YY] * VIN[i];
}
QSortd(FLAG,YIN,UIN,VIN,HISTCNT,ryou[rs].start,ryou[rs].start+ryou[rs].cnt-1);
// int bun;
bun = ohtsu(YIN,UIN,VIN,HISTCNT,ryou[rs].start,ryou[rs].cnt);
// ryou[rs].start
ryou[p].cnt= ryou[rs].cnt-(bun-ryou[rs].start);
ryou[rs].cnt = bun-ryou[rs].start;
// ryou[rs].i
ryou[p].start= bun;
ryou[p].i=p;







// while(1);
p++;
}
int TOTAL3;
TOTAL3 = 0;
for(i=0;i<256;i++){
printf("i=%d,cnt=%d\n",ryou[i].i,ryou[i].cnt);
TOTAL3 +=ryou[i].cnt;
}
printf("IROSUU=%d\n",TOTAL3);
printf("IROSUU=%d\n",IROSUU);
double AVEY3,AVEU3,AVEV3;
for(i=0;i<256;i++){
TOTAL3=0;
for(j=ryou[i].start;j<ryou[i].start+ryou[i].cnt;j++){
TOTAL3 += HISTCNT[j];
AVEY3 += YIN[j] * HISTCNT[j];
AVEU3 += UIN[j] * HISTCNT[j];
AVEV3 += VIN[j] * HISTCNT[j];

}
AVEY3 /= TOTAL3;
AVEU3 /= TOTAL3;
AVEV3 /= TOTAL3;
YUVtoRGB(AVEY3,AVEU3,AVEV3,REDUCE_R+i,REDUCE_G+i,REDUCE_B+i);
}
//int bst = 0;
//double est;
// double ee;
// for(j=0;j<hsize*vsize;j++){
// est = 999999.9e33;
// for(i=0;i<256;i++){
// ee = ((double)RIN[j]-(double)(REDUCE_R[i]))*((double)RIN[j]-(double)(REDUCE_R[i]))+((double)GIN[j]-(double)(REDUCE_G[i]))*((double)GIN[j]-(double)(REDUCE_G[i]))+((double)BIN[j]-(double)(REDUCE_B[i]))*((double)BIN[j]-(double)(REDUCE_B[i]));
// if(est>ee){
// bst = i;
// est = ee;
// }
// }
// PALETGAZOU[j] = bst;
// }
if(1/*edon == 1*/){
unsigned char *IIRIN;
unsigned char *IIGIN;
unsigned char *IIBIN;
IIRIN =(unsigned char *)malloc(sizeof(unsigned char)*hsize*vsize);
IIGIN =(unsigned char *)malloc(sizeof(unsigned char)*hsize*vsize);
IIBIN =(unsigned char *)malloc(sizeof(unsigned char)*hsize*vsize);