void RGBtoYUV(int IROSUU,int *HISTIRO,double *Y,double *U,double *V)
{
int i;
unsigned char R,G,B;
double YIN,UIN,VIN;
for(i=0;i<IROSUU;i++){
B = HISTIRO[i] & 0xff;
G = (HISTIRO[i] >> 8) & 0xff;
R = (HISTIRO[i] >> 16) & 0xff;
if((double)R/255.0 >= 0.117647058823529411764705882352941){
YIN = 255.0*pow((double)R/255.0,3.0/2.2);
} else {
YIN = 255.0*pow((double)R/255.0,1.0/2.2)*0.1429136476;
}
if((double)G/255.0 >= 0.117647058823529411764705882352941){
UIN = 255.0*pow((double)G/255.0,3.0/2.2);
} else {
UIN = 255.0*pow((double)G/255.0,1.0/2.2)*0.1429136476;
}
if((double)B/255.0 >= 0.117647058823529411764705882352941){
VIN = 255.0*pow((double)B/255.0,3.0/2.2);
} else {
VIN = 255.0*pow((double)B/255.0,1.0/2.2)*0.1429136476;
}
// YIN=(double)YIN*16384.0;UIN=UIN*16384.0;VIN=VIN*16384.0;
*(Y+i) = 0.2989*YIN+0.5866*UIN+0.1145*VIN;
*(U+i) = -0.1350*YIN-0.2650*UIN+0.40000*VIN;
*(V+i) = 0.4000*YIN-0.3346*UIN-0.0653*VIN;
UIN=U[i]*0.941996495+V[i]*0.13632709;
VIN=U[i]*0.118202579+V[i]*1.201426141;
U[i]=UIN;
V[i]=VIN;
}
}
int ohtsu(double *Y,double *U,double *V,int *HISTCNT, int st, int n)
{
int idx;
struct GCSd
{
double X, Y, Z;
};
struct STC
{
GCSd total;
double count;
GCSd sqr;
};
STC L,R;
int i,mk=0;
double mn=99.0e64;//double.MaxValue,m;
GCSd a,b,d,e;
double x,y,z,c;
double xc,yc,zc;
double mc,m;
L.count=0;
L.total.X=0;
L.sqr.X=0;
L.total.Y=0;
L.sqr.Y=0;
L.total.Z=0;
L.sqr.Z=0;
R.count=0;
R.total.X=0;
R.sqr.X=0;
R.total.Y=0;
R.sqr.Y=0;
R.total.Z=0;
R.sqr.Z=0;
idx = st;
for (i=0;i<n;i++) {
x = Y[idx];//ix[idx].gcs.X;
y = U[idx];//ix[idx].gcs.Y;
z = V[idx];//ix[idx].gcs.Z;
c = HISTCNT[idx];//ix[idx].cnt;
xc=x*c;
yc=y*c;
zc=z*c;
R.count+=c;
R.total.X+=xc;
R.total.Y+=yc;
R.total.Z+=zc;
R.sqr.X+=xc*x;
R.sqr.Y+=yc*y;
R.sqr.Z+=zc*z;
idx++;
}
a.X=R.total.X/R.count;
a.Y=R.total.Y/R.count;
a.Z=R.total.Z/R.count;
// Console.WriteLine("R.sqrpre {0} {1} {2} ", a.X * a.X * R.count, 2.0 * a.X * R.total.X, R.sqr.X);
R.sqr.X+=(double)a.X*a.X*R.count - 2.0*a.X*R.total.X;
R.sqr.Y+=(double)a.Y*a.Y*R.count - 2.0*a.Y*R.total.Y;
R.sqr.Z+=(double)a.Z*a.Z*R.count - 2.0*a.Z*R.total.Z;
// Console.WriteLine("R.sqraft {0} {1} {2} ", a.X * a.X * R.count, 2.0 * a.X * R.total.X, R.sqr.X);
idx = st;
for (i=1;i<n;i++) {
x = Y[idx];//ix[idx].gcs.X;
y = U[idx];//ix[idx].gcs.Y;
z = V[idx];//ix[idx].gcs.Z;
c = HISTCNT[idx];//ix[idx].cnt;
// x=ix[idx].gcs.X;
// y=ix[idx].gcs.Y;
// z=ix[idx].gcs.Z;
// c=ix[idx].cnt;
xc=x*c;
yc=y*c;
zc=z*c;
//mc=Math.Max(L.count,1.0);
if(L.count < 1.0){
mc = 1.0;
} else {
mc = L.count;
}
a.X=L.total.X/mc;
a.Y=L.total.Y/mc;
a.Z=L.total.Z/mc;
//mc = Math.Max(L.count + c, 1.0);
if((L.count + c) < 1.0){
mc = 1.0;
} else {
mc = L.count + c;
}
d.X=(b.X=((e.X=(L.total.X+xc))/mc))-a.X;
d.Y=(b.Y=((e.Y=(L.total.Y+yc))/mc))-a.Y;
d.Z=(b.Z=((e.Z=(L.total.Z+zc))/mc))-a.Z;
L.sqr.X+=d.X*d.X*L.count;
L.sqr.Y+=d.Y*d.Y*L.count;
L.sqr.Z+=d.Z*d.Z*L.count;
L.total.X=e.X;
L.total.Y=e.Y;
L.total.Z=e.Z;
L.count=mc;
// L.sqr.X+=dsqr(x-b.X)*c;
// L.sqr.Y+=dsqr(y-b.Y)*c;
// L.sqr.Z+=dsqr(z-b.Z)*c;
L.sqr.X+=(x-b.X)*(x-b.X)*c;
L.sqr.Y+=(y-b.Y)*(y-b.Y)*c;
L.sqr.Z+=(z-b.Z)*(z-b.Z)*c;
//mc = Math.Max(R.count, 1.0);
if(R.count < 1.0){
mc = 1.0;
} else {
mc = R.count;
}
a.X=R.total.X/mc;
a.Y=R.total.Y/mc;
a.Z=R.total.Z/mc;
//mc = Math.Max(R.count - c, 1.0);
if((R.count - c) < 1.0){
mc = 1.0;
} else {
mc = R.count - c;
}
d.X=(b.X=((e.X=(R.total.X-x*c))/mc))-a.X;
d.Y=(b.Y=((e.Y=(R.total.Y-y*c))/mc))-a.Y;
d.Z=(b.Z=((e.Z=(R.total.Z-z*c))/mc))-a.Z;
R.sqr.X+=d.X*d.X*R.count;
R.sqr.Y+=d.Y*d.Y*R.count;
R.sqr.Z+=d.Z*d.Z*R.count;
R.total.X=e.X;
R.total.Y=e.Y;
R.total.Z=e.Z;
R.count=mc;
// R.sqr.X-=dsqr(x-b.X)*c;
// R.sqr.Y-=dsqr(y-b.Y)*c;
// R.sqr.Z-=dsqr(z-b.Z)*c;
R.sqr.X-=(x-b.X)*(x-b.X)*c;
R.sqr.Y-=(y-b.Y)*(y-b.Y)*c;
R.sqr.Z-=(z-b.Z)*(z-b.Z)*c;
m=(L.sqr.X+L.sqr.Y+L.sqr.Z)+(R.sqr.X+R.sqr.Y+R.sqr.Z);
if (mn>m) {
mn = m;
mk = i;
}
idx++;
}
return mk+st;
}
double bunsanculc(int start,int cnt,double *Y,double *U,double *V,int *HISTCNT)
{
double AVEY,AVEU,AVEV,BUNSAN;
int i,TOTAL;
TOTAL = 0;
AVEY = 0.0;
AVEU = 0.0;
AVEV = 0.0;
BUNSAN = 0.0;
for(i=start;i<(start+cnt);i++){
TOTAL += HISTCNT[i];
AVEY += Y[i]*HISTCNT[i];
AVEU += U[i]*HISTCNT[i];
AVEV += V[i]*HISTCNT[i];
}
AVEY /= TOTAL;
AVEU /= TOTAL;
AVEV /= TOTAL;
for(i=start;i<(start+cnt);i++){
BUNSAN += ((Y[i]-AVEY)*(Y[i]-AVEY)+(U[i]-AVEU)*(U[i]-AVEU)+(V[i]-AVEV)*(V[i]-AVEV))*HISTCNT[i];
}
return BUNSAN;
}
void YUVtoRGB(double Y_JYUSHIN,double U_JYUSHIN,double V_JYUSHIN,unsigned char *FREDUCE_R,unsigned char *FREDUCE_G,unsigned char *FREDUCE_B)
{
double KARIY,KARIU,KARIV;
KARIU = U_JYUSHIN*1.076908585-V_JYUSHIN*0.122197951;
KARIV = -U_JYUSHIN*0.105951892+V_JYUSHIN*0.844366606;
U_JYUSHIN = KARIU;
V_JYUSHIN = KARIV;
// *FREDUCE_R = (unsigned char)(Y_JYUSHIN+1.4018452447105*V_JYUSHIN+0.5);
// *FREDUCE_G = (unsigned char)(Y_JYUSHIN-0.34511790321824*U_JYUSHIN-0.71429038997809*V_JYUSHIN+0.5);
// *FREDUCE_B = (unsigned char)(Y_JYUSHIN+1.7710177314704*U_JYUSHIN+0.5);
KARIY = Y_JYUSHIN*0.9998247134019967-0.000044452970991771824*U_JYUSHIN+1.7528659800326482*V_JYUSHIN;
// KARIY /= 16384.0;
if(KARIY/255.0 >=0.0540269630587776405948631399435028){
KARIY = pow(KARIY/255.0,2.2/3.0)*255.0;
}else{
KARIY = 255.0/0.1429136476*pow(KARIY/255.0,2.2);
}
*FREDUCE_R = (unsigned char)(KARIY+0.5);
KARIU = Y_JYUSHIN*1.0000893144198046-0.4320813565838843*U_JYUSHIN-0.89314419804726*V_JYUSHIN;
// KARIU /= 16384.0;
if(KARIU/255.0 >=0.0540269630587776405948631399435028){
KARIU = pow(KARIU/255.0,2.2/3.0)*255.0;
}else{
KARIU = 255.0/0.1429136476*pow(KARIU/255.0,2.2);
}
*FREDUCE_G = (unsigned char)(KARIU+0.5);
KARIV = Y_JYUSHIN*1.0000000115762946+2.213731098385467*U_JYUSHIN-0.00011576294529099052*V_JYUSHIN;
// KARIV /= 16384.0;
if(KARIV/255.0 >=0.0540269630587776405948631399435028){
KARIV = pow(KARIV/255.0,2.2/3.0)*255.0;
}else{
KARIV = 255.0/0.1429136476*pow(KARIV/255.0,2.2);
}
*FREDUCE_B = (unsigned char)(KARIV+0.5);
}
void MedianCut (int hsize, int vsize, unsigned char *RIN, unsigned char *GIN, unsigned char *BIN, unsigned char *PALETGAZOU,unsigned char REDUCE_R[256],unsigned char REDUCE_G[256],unsigned char REDUCE_B[256],int vvv,int et,int edon,int kmon,double rmult,double gmult,double bmult,double gamma,int omh,int hasyori,int dither,int cs,double per,int div,double pw,double pw2,double IRO_THIETA,double aaaa,double rgamma,double bgamma,double ygamma,double OMOMI)
{
int i,j,k,l,m,n,o,p,*BUF;
double *R,*G,*B,*YIN,*UIN,*VIN;
R=(double*)malloc(sizeof(double)*hsize*vsize);
G=(double*)malloc(sizeof(double)*hsize*vsize);
B=(double*)malloc(sizeof(double)*hsize*vsize);
YIN=(double*)malloc(sizeof(double)*hsize*vsize);
UIN=(double*)malloc(sizeof(double)*hsize*vsize);
VIN=(double*)malloc(sizeof(double)*hsize*vsize);
BUF=(int*)malloc(sizeof(int)*hsize*vsize);
for(i=0;i<hsize*vsize;i++){
R[i] = (double)RIN[i];
G[i] = (double)GIN[i];
B[i] = (double)BIN[i];
}
// for(i=0;i<hsize*vsize;i++){
// Y[i] = 0.29891*R[i]+0.58661*G[i]+0.11448*B[i];
// U[i] = -0.16874*R[i]-0.33126*G[i]+0.50000*B[i]+128.0;
// V[i] = 0.50000*R[i]-0.41869*G[i]-0.08131*B[i]+128.0;
//*(YIN+i) = (0.29891*(float)(*(RrIN+i))+0.58661*(float)(*(GgIN+i))+0.11448*(float)(*(BbIN+i)) /*+ 0.5*/);
//*(UIN+i) = ((-0.16874*(float)(*(RrIN+i))-0.33126*(float)(*(GgIN+i))+0.50000*(float)(*(BbIN+i))) + 128.0);
//*(VIN+i) = (0.50000*(float)(*(RrIN+i))-0.41869*(float)(*(GgIN+i))-0.08131*(float)(*(BbIN+i)) + 128.0);
// }
for(i=0;i<hsize*vsize;i++){
BUF[i] = 0;
}
for(i=0;i<hsize*vsize;i++){
BUF[i] = (((((BUF[i] ^ RIN[i]) << 8) ^ GIN[i]) << 8) ^ BIN[i]);
// printf("R[%d]=%x,G[%d]=%x,B[%d]=%x,BUF[%d]=%x\n",i,RIN[i],i,GIN[i],i,BIN[i],i,BUF[i]);
}
int *index3;
index3 = (int*)malloc(sizeof(int)*hsize*vsize);
int *HHEDGER;
int *HHEDGEG;
int *HHEDGEB;
int *VVEDGER;
int *VVEDGEG;
int *VVEDGEB;
HHEDGER = (int *)malloc(sizeof(int)*hsize*vsize);
HHEDGEG = (int *)malloc(sizeof(int)*hsize*vsize);
HHEDGEB = (int *)malloc(sizeof(int)*hsize*vsize);
VVEDGER = (int *)malloc(sizeof(int)*hsize*vsize);
VVEDGEG = (int *)malloc(sizeof(int)*hsize*vsize);
VVEDGEB = (int *)malloc(sizeof(int)*hsize*vsize);
//double EDGERASMAX;
for(i=0;i<hsize*vsize;i++){
HHEDGER[i] = 0;
HHEDGEG[i] = 0;
HHEDGEB[i] = 0;
VVEDGER[i] = 0;
VVEDGEG[i] = 0;
VVEDGEB[i] = 0;
}
int SOBEL[9] ={ -1,-2,-1,
0,0,0,
1,2,1};
int SOBEL2[9] ={ -1,0,1,
-2,0,2,
-1,0,1};
//if(vvv == 3 || vvv == 4){
for(i=0;i<vsize;i++){//suityoku
for(j=0;j<hsize;j++){//suihei
for(k=0;k<3;k++){//suityoku
for(l=0;l<3;l++){//suihei
m=i+k-1;//-1~1suiityoku
n=j+l-1;//-1~1suihei
if(n<0){n=-n;}
if(n>(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]);
}
}
}
//}
}
double ett = et;
for(i=0,k=0;i<vsize;i++){
for(j=0;j<hsize;j++){
//printf("%f\n",sqrt((float)HHEDGER[j*vsize+i]*(float)HHEDGER[j*vsize+i] + (float)VVEDGER[j*vsize+i] * (float)VVEDGER[j*vsize+i]));
//printf("%f\n",sqrt((float)HHEDGEG[j*vsize+i]*(float)HHEDGEG[j*vsize+i] + (float)VVEDGEG[j*vsize+i] * (float)VVEDGEG[j*vsize+i]));
//printf("%f\n",sqrt((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]) >= ett*4.0) ||
(sqrt((float)HHEDGEG[j*vsize+i]*(float)HHEDGEG[j*vsize+i] + (float)VVEDGEG[j*vsize+i] * (float)VVEDGEG[j*vsize+i]) >= ett*4.0) ||
(sqrt((float)HHEDGEB[j*vsize+i]*(float)HHEDGEB[j*vsize+i] + (float)VVEDGEB[j*vsize+i] * (float)VVEDGEB[j*vsize+i]) >= ett*4.0)
){
*(index3+j*vsize+i)=-1;
k++;
} else {
*(index3+j*vsize+i)=1;
}
}
}
printf("sougasosuu =%d,edge suu = %d\n",hsize*vsize,k);
QSort(BUF,index3,0,hsize*vsize-1);
{
int i;
unsigned char R,G,B;
double YIN,UIN,VIN;
for(i=0;i<IROSUU;i++){
B = HISTIRO[i] & 0xff;
G = (HISTIRO[i] >> 8) & 0xff;
R = (HISTIRO[i] >> 16) & 0xff;
if((double)R/255.0 >= 0.117647058823529411764705882352941){
YIN = 255.0*pow((double)R/255.0,3.0/2.2);
} else {
YIN = 255.0*pow((double)R/255.0,1.0/2.2)*0.1429136476;
}
if((double)G/255.0 >= 0.117647058823529411764705882352941){
UIN = 255.0*pow((double)G/255.0,3.0/2.2);
} else {
UIN = 255.0*pow((double)G/255.0,1.0/2.2)*0.1429136476;
}
if((double)B/255.0 >= 0.117647058823529411764705882352941){
VIN = 255.0*pow((double)B/255.0,3.0/2.2);
} else {
VIN = 255.0*pow((double)B/255.0,1.0/2.2)*0.1429136476;
}
// YIN=(double)YIN*16384.0;UIN=UIN*16384.0;VIN=VIN*16384.0;
*(Y+i) = 0.2989*YIN+0.5866*UIN+0.1145*VIN;
*(U+i) = -0.1350*YIN-0.2650*UIN+0.40000*VIN;
*(V+i) = 0.4000*YIN-0.3346*UIN-0.0653*VIN;
UIN=U[i]*0.941996495+V[i]*0.13632709;
VIN=U[i]*0.118202579+V[i]*1.201426141;
U[i]=UIN;
V[i]=VIN;
}
}
int ohtsu(double *Y,double *U,double *V,int *HISTCNT, int st, int n)
{
int idx;
struct GCSd
{
double X, Y, Z;
};
struct STC
{
GCSd total;
double count;
GCSd sqr;
};
STC L,R;
int i,mk=0;
double mn=99.0e64;//double.MaxValue,m;
GCSd a,b,d,e;
double x,y,z,c;
double xc,yc,zc;
double mc,m;
L.count=0;
L.total.X=0;
L.sqr.X=0;
L.total.Y=0;
L.sqr.Y=0;
L.total.Z=0;
L.sqr.Z=0;
R.count=0;
R.total.X=0;
R.sqr.X=0;
R.total.Y=0;
R.sqr.Y=0;
R.total.Z=0;
R.sqr.Z=0;
idx = st;
for (i=0;i<n;i++) {
x = Y[idx];//ix[idx].gcs.X;
y = U[idx];//ix[idx].gcs.Y;
z = V[idx];//ix[idx].gcs.Z;
c = HISTCNT[idx];//ix[idx].cnt;
xc=x*c;
yc=y*c;
zc=z*c;
R.count+=c;
R.total.X+=xc;
R.total.Y+=yc;
R.total.Z+=zc;
R.sqr.X+=xc*x;
R.sqr.Y+=yc*y;
R.sqr.Z+=zc*z;
idx++;
}
a.X=R.total.X/R.count;
a.Y=R.total.Y/R.count;
a.Z=R.total.Z/R.count;
// Console.WriteLine("R.sqrpre {0} {1} {2} ", a.X * a.X * R.count, 2.0 * a.X * R.total.X, R.sqr.X);
R.sqr.X+=(double)a.X*a.X*R.count - 2.0*a.X*R.total.X;
R.sqr.Y+=(double)a.Y*a.Y*R.count - 2.0*a.Y*R.total.Y;
R.sqr.Z+=(double)a.Z*a.Z*R.count - 2.0*a.Z*R.total.Z;
// Console.WriteLine("R.sqraft {0} {1} {2} ", a.X * a.X * R.count, 2.0 * a.X * R.total.X, R.sqr.X);
idx = st;
for (i=1;i<n;i++) {
x = Y[idx];//ix[idx].gcs.X;
y = U[idx];//ix[idx].gcs.Y;
z = V[idx];//ix[idx].gcs.Z;
c = HISTCNT[idx];//ix[idx].cnt;
// x=ix[idx].gcs.X;
// y=ix[idx].gcs.Y;
// z=ix[idx].gcs.Z;
// c=ix[idx].cnt;
xc=x*c;
yc=y*c;
zc=z*c;
//mc=Math.Max(L.count,1.0);
if(L.count < 1.0){
mc = 1.0;
} else {
mc = L.count;
}
a.X=L.total.X/mc;
a.Y=L.total.Y/mc;
a.Z=L.total.Z/mc;
//mc = Math.Max(L.count + c, 1.0);
if((L.count + c) < 1.0){
mc = 1.0;
} else {
mc = L.count + c;
}
d.X=(b.X=((e.X=(L.total.X+xc))/mc))-a.X;
d.Y=(b.Y=((e.Y=(L.total.Y+yc))/mc))-a.Y;
d.Z=(b.Z=((e.Z=(L.total.Z+zc))/mc))-a.Z;
L.sqr.X+=d.X*d.X*L.count;
L.sqr.Y+=d.Y*d.Y*L.count;
L.sqr.Z+=d.Z*d.Z*L.count;
L.total.X=e.X;
L.total.Y=e.Y;
L.total.Z=e.Z;
L.count=mc;
// L.sqr.X+=dsqr(x-b.X)*c;
// L.sqr.Y+=dsqr(y-b.Y)*c;
// L.sqr.Z+=dsqr(z-b.Z)*c;
L.sqr.X+=(x-b.X)*(x-b.X)*c;
L.sqr.Y+=(y-b.Y)*(y-b.Y)*c;
L.sqr.Z+=(z-b.Z)*(z-b.Z)*c;
//mc = Math.Max(R.count, 1.0);
if(R.count < 1.0){
mc = 1.0;
} else {
mc = R.count;
}
a.X=R.total.X/mc;
a.Y=R.total.Y/mc;
a.Z=R.total.Z/mc;
//mc = Math.Max(R.count - c, 1.0);
if((R.count - c) < 1.0){
mc = 1.0;
} else {
mc = R.count - c;
}
d.X=(b.X=((e.X=(R.total.X-x*c))/mc))-a.X;
d.Y=(b.Y=((e.Y=(R.total.Y-y*c))/mc))-a.Y;
d.Z=(b.Z=((e.Z=(R.total.Z-z*c))/mc))-a.Z;
R.sqr.X+=d.X*d.X*R.count;
R.sqr.Y+=d.Y*d.Y*R.count;
R.sqr.Z+=d.Z*d.Z*R.count;
R.total.X=e.X;
R.total.Y=e.Y;
R.total.Z=e.Z;
R.count=mc;
// R.sqr.X-=dsqr(x-b.X)*c;
// R.sqr.Y-=dsqr(y-b.Y)*c;
// R.sqr.Z-=dsqr(z-b.Z)*c;
R.sqr.X-=(x-b.X)*(x-b.X)*c;
R.sqr.Y-=(y-b.Y)*(y-b.Y)*c;
R.sqr.Z-=(z-b.Z)*(z-b.Z)*c;
m=(L.sqr.X+L.sqr.Y+L.sqr.Z)+(R.sqr.X+R.sqr.Y+R.sqr.Z);
if (mn>m) {
mn = m;
mk = i;
}
idx++;
}
return mk+st;
}
double bunsanculc(int start,int cnt,double *Y,double *U,double *V,int *HISTCNT)
{
double AVEY,AVEU,AVEV,BUNSAN;
int i,TOTAL;
TOTAL = 0;
AVEY = 0.0;
AVEU = 0.0;
AVEV = 0.0;
BUNSAN = 0.0;
for(i=start;i<(start+cnt);i++){
TOTAL += HISTCNT[i];
AVEY += Y[i]*HISTCNT[i];
AVEU += U[i]*HISTCNT[i];
AVEV += V[i]*HISTCNT[i];
}
AVEY /= TOTAL;
AVEU /= TOTAL;
AVEV /= TOTAL;
for(i=start;i<(start+cnt);i++){
BUNSAN += ((Y[i]-AVEY)*(Y[i]-AVEY)+(U[i]-AVEU)*(U[i]-AVEU)+(V[i]-AVEV)*(V[i]-AVEV))*HISTCNT[i];
}
return BUNSAN;
}
void YUVtoRGB(double Y_JYUSHIN,double U_JYUSHIN,double V_JYUSHIN,unsigned char *FREDUCE_R,unsigned char *FREDUCE_G,unsigned char *FREDUCE_B)
{
double KARIY,KARIU,KARIV;
KARIU = U_JYUSHIN*1.076908585-V_JYUSHIN*0.122197951;
KARIV = -U_JYUSHIN*0.105951892+V_JYUSHIN*0.844366606;
U_JYUSHIN = KARIU;
V_JYUSHIN = KARIV;
// *FREDUCE_R = (unsigned char)(Y_JYUSHIN+1.4018452447105*V_JYUSHIN+0.5);
// *FREDUCE_G = (unsigned char)(Y_JYUSHIN-0.34511790321824*U_JYUSHIN-0.71429038997809*V_JYUSHIN+0.5);
// *FREDUCE_B = (unsigned char)(Y_JYUSHIN+1.7710177314704*U_JYUSHIN+0.5);
KARIY = Y_JYUSHIN*0.9998247134019967-0.000044452970991771824*U_JYUSHIN+1.7528659800326482*V_JYUSHIN;
// KARIY /= 16384.0;
if(KARIY/255.0 >=0.0540269630587776405948631399435028){
KARIY = pow(KARIY/255.0,2.2/3.0)*255.0;
}else{
KARIY = 255.0/0.1429136476*pow(KARIY/255.0,2.2);
}
*FREDUCE_R = (unsigned char)(KARIY+0.5);
KARIU = Y_JYUSHIN*1.0000893144198046-0.4320813565838843*U_JYUSHIN-0.89314419804726*V_JYUSHIN;
// KARIU /= 16384.0;
if(KARIU/255.0 >=0.0540269630587776405948631399435028){
KARIU = pow(KARIU/255.0,2.2/3.0)*255.0;
}else{
KARIU = 255.0/0.1429136476*pow(KARIU/255.0,2.2);
}
*FREDUCE_G = (unsigned char)(KARIU+0.5);
KARIV = Y_JYUSHIN*1.0000000115762946+2.213731098385467*U_JYUSHIN-0.00011576294529099052*V_JYUSHIN;
// KARIV /= 16384.0;
if(KARIV/255.0 >=0.0540269630587776405948631399435028){
KARIV = pow(KARIV/255.0,2.2/3.0)*255.0;
}else{
KARIV = 255.0/0.1429136476*pow(KARIV/255.0,2.2);
}
*FREDUCE_B = (unsigned char)(KARIV+0.5);
}
void MedianCut (int hsize, int vsize, unsigned char *RIN, unsigned char *GIN, unsigned char *BIN, unsigned char *PALETGAZOU,unsigned char REDUCE_R[256],unsigned char REDUCE_G[256],unsigned char REDUCE_B[256],int vvv,int et,int edon,int kmon,double rmult,double gmult,double bmult,double gamma,int omh,int hasyori,int dither,int cs,double per,int div,double pw,double pw2,double IRO_THIETA,double aaaa,double rgamma,double bgamma,double ygamma,double OMOMI)
{
int i,j,k,l,m,n,o,p,*BUF;
double *R,*G,*B,*YIN,*UIN,*VIN;
R=(double*)malloc(sizeof(double)*hsize*vsize);
G=(double*)malloc(sizeof(double)*hsize*vsize);
B=(double*)malloc(sizeof(double)*hsize*vsize);
YIN=(double*)malloc(sizeof(double)*hsize*vsize);
UIN=(double*)malloc(sizeof(double)*hsize*vsize);
VIN=(double*)malloc(sizeof(double)*hsize*vsize);
BUF=(int*)malloc(sizeof(int)*hsize*vsize);
for(i=0;i<hsize*vsize;i++){
R[i] = (double)RIN[i];
G[i] = (double)GIN[i];
B[i] = (double)BIN[i];
}
// for(i=0;i<hsize*vsize;i++){
// Y[i] = 0.29891*R[i]+0.58661*G[i]+0.11448*B[i];
// U[i] = -0.16874*R[i]-0.33126*G[i]+0.50000*B[i]+128.0;
// V[i] = 0.50000*R[i]-0.41869*G[i]-0.08131*B[i]+128.0;
//*(YIN+i) = (0.29891*(float)(*(RrIN+i))+0.58661*(float)(*(GgIN+i))+0.11448*(float)(*(BbIN+i)) /*+ 0.5*/);
//*(UIN+i) = ((-0.16874*(float)(*(RrIN+i))-0.33126*(float)(*(GgIN+i))+0.50000*(float)(*(BbIN+i))) + 128.0);
//*(VIN+i) = (0.50000*(float)(*(RrIN+i))-0.41869*(float)(*(GgIN+i))-0.08131*(float)(*(BbIN+i)) + 128.0);
// }
for(i=0;i<hsize*vsize;i++){
BUF[i] = 0;
}
for(i=0;i<hsize*vsize;i++){
BUF[i] = (((((BUF[i] ^ RIN[i]) << 8) ^ GIN[i]) << 8) ^ BIN[i]);
// printf("R[%d]=%x,G[%d]=%x,B[%d]=%x,BUF[%d]=%x\n",i,RIN[i],i,GIN[i],i,BIN[i],i,BUF[i]);
}
int *index3;
index3 = (int*)malloc(sizeof(int)*hsize*vsize);
int *HHEDGER;
int *HHEDGEG;
int *HHEDGEB;
int *VVEDGER;
int *VVEDGEG;
int *VVEDGEB;
HHEDGER = (int *)malloc(sizeof(int)*hsize*vsize);
HHEDGEG = (int *)malloc(sizeof(int)*hsize*vsize);
HHEDGEB = (int *)malloc(sizeof(int)*hsize*vsize);
VVEDGER = (int *)malloc(sizeof(int)*hsize*vsize);
VVEDGEG = (int *)malloc(sizeof(int)*hsize*vsize);
VVEDGEB = (int *)malloc(sizeof(int)*hsize*vsize);
//double EDGERASMAX;
for(i=0;i<hsize*vsize;i++){
HHEDGER[i] = 0;
HHEDGEG[i] = 0;
HHEDGEB[i] = 0;
VVEDGER[i] = 0;
VVEDGEG[i] = 0;
VVEDGEB[i] = 0;
}
int SOBEL[9] ={ -1,-2,-1,
0,0,0,
1,2,1};
int SOBEL2[9] ={ -1,0,1,
-2,0,2,
-1,0,1};
//if(vvv == 3 || vvv == 4){
for(i=0;i<vsize;i++){//suityoku
for(j=0;j<hsize;j++){//suihei
for(k=0;k<3;k++){//suityoku
for(l=0;l<3;l++){//suihei
m=i+k-1;//-1~1suiityoku
n=j+l-1;//-1~1suihei
if(n<0){n=-n;}
if(n>(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]);
}
}
}
//}
}
double ett = et;
for(i=0,k=0;i<vsize;i++){
for(j=0;j<hsize;j++){
//printf("%f\n",sqrt((float)HHEDGER[j*vsize+i]*(float)HHEDGER[j*vsize+i] + (float)VVEDGER[j*vsize+i] * (float)VVEDGER[j*vsize+i]));
//printf("%f\n",sqrt((float)HHEDGEG[j*vsize+i]*(float)HHEDGEG[j*vsize+i] + (float)VVEDGEG[j*vsize+i] * (float)VVEDGEG[j*vsize+i]));
//printf("%f\n",sqrt((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]) >= ett*4.0) ||
(sqrt((float)HHEDGEG[j*vsize+i]*(float)HHEDGEG[j*vsize+i] + (float)VVEDGEG[j*vsize+i] * (float)VVEDGEG[j*vsize+i]) >= ett*4.0) ||
(sqrt((float)HHEDGEB[j*vsize+i]*(float)HHEDGEB[j*vsize+i] + (float)VVEDGEB[j*vsize+i] * (float)VVEDGEB[j*vsize+i]) >= ett*4.0)
){
*(index3+j*vsize+i)=-1;
k++;
} else {
*(index3+j*vsize+i)=1;
}
}
}
printf("sougasosuu =%d,edge suu = %d\n",hsize*vsize,k);
QSort(BUF,index3,0,hsize*vsize-1);