Image-Seek

 view release on metacpan or  search on metacpan

haar.cpp  view on Meta::CPAN

    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 )