Image-Seek
view release on metacpan or search on metacpan
d1[i]=(a[i]*0.299+b[i]*0.587+c[i]*0.114)/256.0;
d2[i]=(a[i]*0.596+b[i]*(-0.274)+c[i]*(-0.322))/256.0;
d3[i]=(a[i]*0.212+b[i]*(-0.523)+c[i]*0.311)/256.0;
}
// decompose rows
for (i=0;i<128;i++) {
h=128;
for (j=0;j<128;j++) {
d1[i*128+j] /= 11.314;
d2[i*128+j] /= 11.314;
d3[i*128+j] /= 11.314;
}
while(h>1) {
h/=2;
for (k=0;k<h;k++) {
Ab1[k]=(d1[i*128+2*k]+d1[i*128+2*k+1])/1.414;
Ab2[k]=(d2[i*128+2*k]+d2[i*128+2*k+1])/1.414;
Ab3[k]=(d3[i*128+2*k]+d3[i*128+2*k+1])/1.414;
Ab1[k+h]=(d1[i*128+2*k]-d1[i*128+2*k+1])/1.414;
Ab2[k+h]=(d2[i*128+2*k]-d2[i*128+2*k+1])/1.414;
Ab3[k+h]=(d3[i*128+2*k]-d3[i*128+2*k+1])/1.414;
}
memcpy(d1+i*128,Ab1,2*h*sizeof(double));
memcpy(d2+i*128,Ab2,2*h*sizeof(double));
memcpy(d3+i*128,Ab3,2*h*sizeof(double));
}
}
// decompose cols
for (i=0;i<128;i++) {
h=128;
for (j=0;j<128;j++) {
d1[j*128+i] /= 11.314;
d2[j*128+i] /= 11.314;
d3[j*128+i] /= 11.314;
}
while(h>1) {
h/=2;
for (k=0;k<h;k++) {
Ab1[k]=(d1[i+2*k*128]+d1[i+(2*k+1)*128])/1.414;
Ab2[k]=(d2[i+2*k*128]+d2[i+(2*k+1)*128])/1.414;
Ab3[k]=(d3[i+2*k*128]+d3[i+(2*k+1)*128])/1.414;
Ab1[k+h]=(d1[i+2*k*128]-d1[i+(2*k+1)*128])/1.414;
Ab2[k+h]=(d2[i+2*k*128]-d2[i+(2*k+1)*128])/1.414;
Ab3[k+h]=(d3[i+2*k*128]-d3[i+(2*k+1)*128])/1.414;
}
for (j=0;j<2*h;j++) {
d1[j*128+i]=Ab1[j];
d2[j*128+i]=Ab2[j];
d3[j*128+i]=Ab3[j];
}
}
}
memcpy(a,d1,16384*sizeof(double));
memcpy(b,d2,16384*sizeof(double));
memcpy(c,d3,16384*sizeof(double));
Safefree(d1);Safefree(d2);Safefree(d3);Safefree(Ab1);Safefree(Ab2);Safefree(Ab3);
}
int calcHaar(double* cdata1,double* cdata2,double* cdata3,int* sig1,int* sig2,int* sig3,double * avgl)
{
//TODO: Speed up..
int cnt,i;
valStruct vals[41];
double * cadata1=absarray(cdata1);
double * cadata2=absarray(cdata2);
double * cadata3=absarray(cdata3);
avgl[0]=cdata1[0];
avgl[1]=cdata2[0];
avgl[2]=cdata3[0];
// determines the 40th largest absolute value. For each color channel
valqueue vq;
cnt=0;
for (i=0;i<16384;i++) {
if (cnt==40) {
vals[40].d=cadata1[i];
vq.push(vals[40]);
vals[40]=vq.top();
vq.pop();
}
else {
vals[cnt].d=cadata1[i];
vq.push(vals[cnt]);
cnt++;
}
}
truncq(cadata1,cdata1,vq.top().d,sig1);
while(!vq.empty()) vq.pop();
cnt=0;
for (i=0;i<16384;i++) {
if (cnt==40) {
vals[40].d=cadata2[i];
vq.push(vals[40]);
vals[40]=vq.top();
vq.pop();
}
else {
vals[cnt].d=cadata2[i];
vq.push(vals[cnt]);
cnt++;
}
}
truncq(cadata2,cdata2,vq.top().d,sig2);
while(!vq.empty()) vq.pop();
cnt=0;
for (i=0;i<16384;i++) {
if (cnt==40) {
vals[40].d=cadata3[i];
vq.push(vals[40]);
vals[40]=vq.top();
vq.pop();
}
else {
vals[cnt].d=cadata3[i];
vq.push(vals[cnt]);
cnt++;
}
}
truncq(cadata3,cdata3,vq.top().d,sig3);
Safefree(cadata1);
Safefree(cadata2);
Safefree(cadata3);
return 1;
}
( run in 0.904 second using v1.01-cache-2.11-cpan-d06a3f9ecfd )