Image_t<double>* Transforms::hough2(const Image *image, double angleStep, double rhoStep) { // double angleStep = .5; // double rhoStep = 1.; // double imageDiag = image->getWidth() * sqrt(2.); double imageDiag = sqrt(image->getWidth()*image->getWidth() + image->getHeight()*image->getHeight()); Image_t<double>* resImg = new Image_t<double>(1. + imageDiag / rhoStep, 180. / angleStep + 0.5, image->getNbChannels(), 0.); for(unsigned int c = 0; c < image->getNbChannels(); ++c) { for(unsigned int j = 0; j < image->getHeight(); ++j) // on parcourt l'image { for(unsigned int i = 0; i < image->getWidth(); ++i) { if(image->getPixelAt(i, j, c) == 255) { for(double te=0; te < 180; te += angleStep) // on parcourt la matrice { const double coste = cos(te * pi / 180.); double sinte = sin(te * pi / 180.); // for(double ro = 0; ro < imageDiag; ro += rhoStep) // { // // on incrmente la matrice pour l'intervalle de ro correspondant au teta // if( (ro <= (i*coste+j*sinte) ) && ( (i*coste+j*sinte) < (ro+rhoStep) ) ) // { // resImg->pixelAt(ro / rhoStep, te / angleStep)++; // } // } const double rho = i * coste + j * sinte; // const double start = max(0., delta); // const double end = min(imageDiag, delta + rhoStep); // for(double ro = start; ro < end; ro += rhoStep) if(rho >= 0. && rho < imageDiag) { resImg->pixelAt(rho / rhoStep + 0.5, te / angleStep + 0.5, c)++; } } } } } } // //Exemple d'affichage de texte dans la fentre "texte" // char buffer[455]; // sprintf( buffer, "Lecture du rsultat :\nLigne du haut : angle=0\nLigne du bas : angle=+180\nColonne de gauche : distance=0\nColonne de droite : distance max (diagonale de l'image)\nPoint de rfrence pour les distances : coin en haut gauche\nDroite de rfrence pour les angles : axe VERTICAL\nAngles positifs dans le sens trigonomtrique indirect"); // oh->AddString( buffer ); return resImg; }
string Transforms::hough2_inverse(const Image_t<double> *image, Image** resImgptr, unsigned int size, unsigned int threshold) { Image_t<uint32_t>* resImg = new Image_t<uint32_t>(size, size, image->getNbChannels(), uint32_t(0)); // int param = 5000 + 20 * image->getWidth() * image->getHeight(); // char *buffer; // buffer=(char *)calloc(param,sizeof(char)); // char tampon[50]; // sprintf( buffer, "Valeur Max de la matrice d'entre=%d",(int)(max+0.1)); double angleStep = 180. / image->getHeight(); double imageDiag = resImg->getWidth() * sqrt(2.); double rhoStep = imageDiag / image->getWidth(); //Algorithme de traitement int cmpt = 0; for(unsigned int c = 0; c < image->getNbChannels(); ++c) { for(unsigned int j = 0; j < image->getHeight(); ++j) { for(unsigned int i = 0; i < image->getWidth(); ++i) { int n = image->getPixelAt(i, j, c); if(n >= threshold) { cmpt++; double angle = angleStep * j / 180. * pi; double rho = rhoStep * i; double sinte = sin(angle); double coste = cos(angle); // sprintf( tampon,"\nniveau=%d\tangle=%1.0f\tdistance=%1.0f",(int)(0.1+tab_image[i+nl*j]),angle/pi*180.,rho); // strcat( buffer, tampon); //Construction de la droite d'quation for(unsigned int jj = 0; jj < size; ++jj) { // int kk = rho * (cos(angle) + tan(angle) * sin(angle)) - tan(angle)*jj; int kk = (rho - sinte * jj) / coste; if( kk > 0 && kk < size) { resImg->pixelAt(kk, jj, c) += n; } } for(unsigned int ii = 0; ii < size; ++ii) { // int kk = ( rho * (cos(angle) + tan(angle) * sin(angle)) -ii ) / tan(angle); int kk = (rho - coste * ii) / sinte; if( kk>0 && kk < size) { resImg->pixelAt(ii, kk, c) += n; } } } } } } // sprintf( tampon,"\nNombre de droites traces=%d",cmpt); // strcat( buffer, tampon); std::cout << resImg->max() << std::endl; Image* resStdImg = new Image(resImg->getWidth(), resImg->getHeight(), resImg->getNbChannels()); Image_t<uint32_t>::iterator it = resImg->begin(); Image::iterator jt = resStdImg->begin(); double max = resImg->max(); while(it != resImg->end()) { *jt = *it * 256. / max + 0.5; ++it; ++jt; } *resImgptr = resStdImg; return ""; }