Пример #1
0
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;
}
Пример #2
0
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 "";
}