コード例 #1
0
string hadamard_haar_88( const Image *im, Image_t<double> **resImg, Image **invImg, double *rmat, GrayscaleImage_t<bool> *selection ) {
    if(!( im != NULL && resImg != NULL && invImg != NULL )) {
        char buffer[255];
        sprintf( buffer, "Error in Transforms::hadamard_haar_88:\nim = %p, result = %p, result_inverse = %p", im, resImg, invImg );
        throw buffer;
    }
    // Returns result as the resulting image
    // Returns result_inverse as the inverse of the resulting image
    int idt = 8;
    double res[8];
    string returnval;

/*----------------------------------------------------------------------
*
*     OUVERTURE ET LECTURE DU FICHIER IMAGE ORIGINE
*     ALLOCATION MEMOIRE POUR LES TABLEAUX IMAGES
*
*----------------------------------------------------------------------*/
    Image_t<double>* tmpImg = Converter<Image_t<double> >::convert(*im);

/*---------------------------------------------------------------------
*
*     CALCUL DES COEFFICIENTS DE LA MATRICE DE TRANSFORMATION
*
*---------------------------------------------------------------------*/

    char buffer[100];
    returnval = "\n\nmatrice de transformation utilisee : \n";

    for(int i=0 ; i<idt ; i++)
    {
        for(int j=0 ; j<idt ; j++)
        {
            sprintf( buffer,"%5.2f  ",rmat[i * idt + j]);
            returnval = returnval + buffer;
        }
        returnval = returnval + "\n";
    }

/*----------------------------------------------------------------------
*
*     TRANSFORMATION
*
*----------------------------------------------------------------------*/

    for(unsigned int c = 0; c < tmpImg->getNbChannels(); ++c) {
      for(unsigned int i=0 ; i < tmpImg->getWidth() ; i += idt) {
          for(unsigned int j=0 ; j < tmpImg->getHeight() ; j += idt) {

              double res[8];
              for(int k = 0 ; k < idt ; ++k) res[k] = 0.;


              for(int k = 0; k < idt; ++k) {

                  for(int l = 0; l < idt; ++l) {
                      for(int m=0 ; m<idt ; m++) {
                          res[l] += rmat[l * idt + m] * tmpImg->getPixelAt(i+k, j+m, c);
                      }
                  }

                  for(int l=0 ; l<idt ; l++) {
                      tmpImg->setPixelAt(i+k, j+l, c, res[l]);
                      res[l] = 0.;
                  }
              }

              for(int k = 0; k < idt; ++k) {

                  for(int l=0 ; l<idt ; l++) {
                      for(int m=0 ; m<idt ; m++) {
                          res[l] += rmat[l * idt + m] * tmpImg->getPixelAt(i+m, j+k, c);
                      }
                  }

                  for(int l=0 ; l<idt ; l++) {
                      tmpImg->setPixelAt(i+l, j+k, c, +res[l]);
                      res[l] = 0.;
                  }
              }
          }
      }
    }

/*----------------------------------------------------------------------
*
*     CODAGE
*
*----------------------------------------------------------------------*/

  if(selection != NULL) {
    for(unsigned int c = 0; c < tmpImg->getNbChannels(); ++c) {
      for(unsigned int j = 0; j < tmpImg->getHeight(); ++j) {
          for(unsigned int i = 0; i < tmpImg->getWidth(); ++i) {
              if(!selection->getPixelAt(i % 8, j % 8)) {
                  tmpImg->setPixelAt(i, j, c, 0.);
              }
          }
      }
    }
  }

/*----------------------------------------------------------------------
*
*     STOCKAGE DE L'IMAGE TRANSFORMEE DANS UN FICHIER
*
*----------------------------------------------------------------------*/
  *resImg = new Image_t<double>(*tmpImg);

/*----------------------------------------------------------------------
*
*     TRANSFORMATION INVERSE
*
*----------------------------------------------------------------------*/

for(unsigned int c = 0; c < tmpImg->getNbChannels(); ++c) {
  for(unsigned int i=0 ; i< tmpImg->getHeight() ; i+=idt) {
     for(unsigned int j=0 ; j<tmpImg->getWidth(); j+=idt)
     {
        for(int k=0 ; k<idt ; k++)
          res[k] = 0.;

        for(int k=0 ; k<idt ; k++)
        {
          for(int l=0 ; l<idt ; l++)
             for(int m=0 ; m<idt ; m++)
                res[l] += rmat[m * idt + l] * tmpImg->getPixelAt(i+m, j+k, c);

          for(int l=0 ; l<idt ; l++)
          {
             tmpImg->setPixelAt(i+l, j+k, c, res[l]);
             res[l] = 0.;
          }
        }

        for(int k=0 ; k<idt ; k++)
        {
          for(int l=0 ; l<idt ; l++)
             for(int m=0 ; m<idt ; m++)
                res[l] += rmat[m * idt + l] * tmpImg->getPixelAt(i+k, j+m, c);

          for(int l=0 ; l<idt ; l++)
          {
             tmpImg->setPixelAt(i+k, j+l, c, res[l]);
             res[l] = 0.;
          }
        }
     }
  }
}

/*----------------------------------------------------------------------
*
*     STOCKAGE DE L'IMAGE RESULTAT DANS UN FICHIER
*
*----------------------------------------------------------------------*/
//  Image *tabout = new Image(im->getWidth(), im->getHeight(), tmpImg->getNbChannels());
//  for(unsigned int i=0 ; i<tmpImg->getHeight() ; i++)
//     for(unsigned int j=0 ; j<tmpImg->getWidth() ; j++)
//     {
//        double ftemp = tmpImg->getPixelAt(j, i);
//        if(ftemp < 0)
//          ftemp = 0;
//        if(ftemp > 255)
//          ftemp = 255;
//        tabout->setPixel( j, i, (uint8_t)(ftemp + 0.5) );
//     }

//     *invImg = new Image(tmpImg->getWidth(), tmpImg->getHeight(), tmpImg->getNbChannels());
//    for(unsigned int c = 0; c < tmpImg->getNbChannels(); ++c) {
//        for(unsigned int j = 0; j < tmpImg->getHeight(); ++j) {
//            for(unsigned int i = 0; i < tmpImg->getWidth(); ++i) {
//                double value = tmpImg->getPixelAt(i, j, c);
//                (*invImg)->setPixelAt(i, j, c, value + 0.5);
//            }
//        }
//    }
     *invImg = Converter<Image>::convertAndRound(*tmpImg);


//    delete tabin;
    return returnval;
}
コード例 #2
0
Image_t<double>* Transforms::hough(const GrayscaleImage *image ) {
//    int height = image->getHeight();
//    int width = image->getWidth();
//    const uint8_t* tabim = image->begin();
//    double* itab = new double[ image->size() ];
//    for(unsigned int i = 0; i < image->size(); ++i) itab[i] = 0;
    double diag = sqrt(image->getWidth()*image->getWidth() + image->getHeight()*image->getHeight());
    Image_t<double>* resImg = new Image_t<double>(diag+0.5, 180, 1, 0.);

    for(unsigned int j = 0; j < image->getHeight(); j++) {
        for(unsigned int i = 0; i < image->getWidth(); i++) {

            if(image->getPixelAt(i, j) == 255) {

                int j1 = j;

                for(unsigned int i1 = i+1; i1 < image->getWidth(); i1++) {
                    if(image->getPixelAt(i1, j1) == 255) {
                        const double x0 = i;
                        const double y0 = j;
                        const double x1 = i1;
                        const double y1 = j1;
                        const double l0 = sqrt((double)((y0-y1)*(y0-y1) + (x0-x1)*(x0-x1)));
                        const double l1 = fabs((double)(x0*y1 - x1*y0));
                        const double x2 = l1/l0;
                        double y2;
                        const int i2 = x2 + 0.5;
                        int j2;
//                        if(x1-x0 != 0) {
//                            y2 = atan((y1-y0)/(x1-x0));
//                            j2 = 125 + (int)(y2*124./pid2 + 0.5);
                            y2 = (x1 != x0) ? atan((y1-y0) / (x1-x0)) : y1 > y0 ? pid2 : -pid2;
                            j2 = (y2 / pi) * 180. + 90. + 0.5;
//                            j2 = (x1 != x0) ? 125.5 + atan((y1-y0)/(x1-x0))*124./pid2 : 250;
//                        }
//                        else {
//                            j2 = 250;
//                        }

//                        itab[j2*width+i2]++;
                        resImg->setPixelAt(i2, j2, resImg->getPixelAt(i2, j2) + 1.);
                    }
                }

                for(unsigned int j1 = j+1; j1 < image->getHeight(); j1++) {
                    for(unsigned int i1 = 0; i1 < image->getWidth(); i1++) {
                        if(image->getPixelAt(i1, j1) == 255) {
                            const double x0 = i;
                            const double y0 = j;
                            const double x1 = i1;
                            const double y1 = j1;
                            const double l0 = sqrt((double)((y0-y1)*(y0-y1) + (x0-x1)*(x0-x1)));
                            const double l1 = fabs((double)(x0*y1 - x1*y0));
                            const double x2 = l1/l0;
                            double y2;
                            const int i2 = x2 + 0.5;
                            int j2;
//                            if(x1-x0 != 0) {
//                                y2 = atan((double)(y1-y0)/(x1-x0));
//                                j2 = 125 + (int)(y2*124./pid2 + 0.5);
//                            }
//                            else {
//                                j2 = 250;
//                            }
                            y2 = x1 != x0 ? atan((y1-y0) / (x1-x0)) : y1 > y0 ? pid2 : -pid2;
//                            j2 = (y2 / pi + 0.5) * image->getHeight() + 0.5;
//                            j2 = (y2 * 2. + pi)*100.  + 0.5;
                            j2 = (y2 / pi) * 180. + 90. + 0.5;
//                            j2 = (x1 != x0) ? 125.5 + atan((y1-y0)/(x1-x0))*124./pid2 : 250;

//                            itab[j2*width+i2]++;
                            resImg->setPixelAt(i2, j2, resImg->getPixelAt(i2, j2) + 1.);
                        }
                    }
                }
            }
        }
    }
//    Image_t<double> *returnval = new Image_t<double>(width, height, 1, itab);
//    delete itab;
//    return returnval;
    return resImg;

}