Beispiel #1
0
void Vignette_correct(string aDir, GrpVodka aGrpVodka,string aDirOut, string InCal){

    //Bulding the output file system
    ELISE_fp::MkDirRec(aDir + aDirOut);

    //Reading vignette files
        char foc[5],dia[4];
        sprintf(foc, "%04d", int(10*aGrpVodka.foc));
        sprintf(dia, "%03d", int(10*aGrpVodka.diaph));
        string aNameVignette="Foc" + (string)foc + "Diaph" + (string)dia + "-FlatField.tif";
        //string aNameVignette = "Foc"+ ToString(round_ni(aGrpVodka.foc)) + "Diaph" + ToString(round_ni(10*aGrpVodka.diaph)) + "-FlatField.tif";
        Tiff_Im aTFV= Tiff_Im::StdConvGen(aDir + InCal + aNameVignette,1,false);
        Pt2di aSz = aTFV.sz();

        Im2D_REAL4  aVignette(aSz.x,aSz.y);

        ELISE_COPY
        (
           aTFV.all_pts(),
           aTFV.in(),
           aVignette.out()
        );

        REAL4 ** aDataVignette = aVignette.data();

    //Correcting images
    int nbIm=aGrpVodka.size();

#ifdef USE_OPEN_MP
    #pragma omp parallel for
#endif
    for(int i=0;i<nbIm;i++)
    {
        string aNameIm=aGrpVodka.aListIm[i];
        cout<<"Correcting "<<aNameIm<<endl;
        string aNameOut=aDir + aDirOut + aNameIm +"_vodka.tif";

        //Reading the image and creating the objects to be manipulated
        Tiff_Im aTF= Tiff_Im::StdConvGen(aDir + aNameIm,3,false);
        Pt2di aSz = aTF.sz();

        Im2D_U_INT1  aImR(aSz.x,aSz.y);
        Im2D_U_INT1  aImG(aSz.x,aSz.y);
        Im2D_U_INT1  aImB(aSz.x,aSz.y);

        ELISE_COPY
        (
           aTF.all_pts(),
           aTF.in(),
           Virgule(aImR.out(),aImG.out(),aImB.out())
        );

        U_INT1 ** aDataR = aImR.data();
        U_INT1 ** aDataG = aImG.data();
        U_INT1 ** aDataB = aImB.data();

        for (int aY=0 ; aY<aSz.y  ; aY++)
            {
                for (int aX=0 ; aX<aSz.x  ; aX++)
                {
                    double aCor=aDataVignette[aY][aX];
                    double R = aDataR[aY][aX] * aCor;
                    double G = aDataG[aY][aX] * aCor;
                    double B = aDataB[aY][aX] * aCor;
                    if(R>255){aDataR[aY][aX]=255;}else if(aCor<1){continue;}else{aDataR[aY][aX]=R;}
                    if(G>255){aDataG[aY][aX]=255;}else if(aCor<1){continue;}else{aDataG[aY][aX]=G;}
                    if(B>255){aDataB[aY][aX]=255;}else if(aCor<1){continue;}else{aDataB[aY][aX]=B;}
                }
        }

         Tiff_Im  aTOut
            (
                aNameOut.c_str(),
                aSz,
                GenIm::u_int1,
                Tiff_Im::No_Compr,
                Tiff_Im::RGB
            );


         ELISE_COPY
             (
                 aTOut.all_pts(),
                 Virgule(aImR.in(),aImG.in(),aImB.in()),
                 aTOut.out()
             );


    }


}
void Drunk(string aFullPattern,string aOri,string DirOut, bool Talk)
{
    string aPattern,aNameDir;
    SplitDirAndFile(aNameDir,aPattern,aFullPattern);

    //Reading input files
    list<string> ListIm=RegexListFileMatch(aNameDir,aPattern,1,false);
    int nbIm=ListIm.size();
    if (Talk){cout<<"Images to process: "<<nbIm<<endl;}

    //Paralelizing (an instance of Drunk is called for each image)
    string cmdDRUNK;
    list<string> ListDrunk;
    if(nbIm!=1)
    {
        for(int i=1;i<=nbIm;i++)
        {
            string aFullName=ListIm.front();
            ListIm.pop_front();
            cmdDRUNK=MMDir() + "bin/Drunk " + aNameDir + aFullName + " " + aOri + " Out=" + DirOut + " Talk=0";
            ListDrunk.push_back(cmdDRUNK);
        }
        cEl_GPAO::DoComInParal(ListDrunk,aNameDir + "MkDrunk");

        //Calling the banner at the end
        if (Talk){Drunk_Banniere();}
    }else{

    //Bulding the output file system
    ELISE_fp::MkDirRec(aNameDir + DirOut);

    //Processing the image
    string aNameIm=ListIm.front();
    string aNameOut=aNameDir + DirOut + aNameIm + ".tif";

    //Loading the camera
    string aNameCam="Ori-"+aOri+"/Orientation-"+aNameIm+".xml";
    cInterfChantierNameManipulateur * anICNM = cInterfChantierNameManipulateur::BasicAlloc(aNameDir);
    CamStenope * aCam = CamOrientGenFromFile(aNameCam,anICNM);

    //Reading the image and creating the objects to be manipulated
    Tiff_Im aTF= Tiff_Im::StdConvGen(aNameDir + aNameIm,3,false);

    Pt2di aSz = aTF.sz();

    Im2D_U_INT1  aImR(aSz.x,aSz.y);
    Im2D_U_INT1  aImG(aSz.x,aSz.y);
    Im2D_U_INT1  aImB(aSz.x,aSz.y);
    Im2D_U_INT1  aImROut(aSz.x,aSz.y);
    Im2D_U_INT1  aImGOut(aSz.x,aSz.y);
    Im2D_U_INT1  aImBOut(aSz.x,aSz.y);

    ELISE_COPY
    (
       aTF.all_pts(),
       aTF.in(),
       Virgule(aImR.out(),aImG.out(),aImB.out())
    );

    U_INT1 ** aDataR = aImR.data();
    U_INT1 ** aDataG = aImG.data();
    U_INT1 ** aDataB = aImB.data();
    U_INT1 ** aDataROut = aImROut.data();
    U_INT1 ** aDataGOut = aImGOut.data();
    U_INT1 ** aDataBOut = aImBOut.data();

    //Parcours des points de l'image de sortie et remplissage des valeurs
    Pt2dr ptOut;
    for (int aY=0 ; aY<aSz.y  ; aY++)
    {
        for (int aX=0 ; aX<aSz.x  ; aX++)
        {
            ptOut=aCam->DistDirecte(Pt2dr(aX,aY));

            aDataROut[aY][aX] = Reechantillonnage::biline(aDataR, aSz.x, aSz.y, ptOut);
            aDataGOut[aY][aX] = Reechantillonnage::biline(aDataG, aSz.x, aSz.y, ptOut);
            aDataBOut[aY][aX] = Reechantillonnage::biline(aDataB, aSz.x, aSz.y, ptOut);

        }
    }

    Tiff_Im  aTOut
             (
                  aNameOut.c_str(),
                  aSz,
                  GenIm::u_int1,
                  Tiff_Im::No_Compr,
                  Tiff_Im::RGB
             );


     ELISE_COPY
     (
         aTOut.all_pts(),
         Virgule(aImROut.in(),aImGOut.in(),aImBOut.in()),
         aTOut.out()
     );
    }
}
void Egal_field_correct_ite(string aDir,std::vector<std::string> * aSetIm, cl_MatPtsHom aMatPtsHomol , string aDirOut, string InVig, int ResolModel, int nbIm, int nbIte, double aThresh)
{
//truc à iterer--------------------------------------------------------------------------------------------------------------------------------------
for(int iter=0;iter<nbIte;iter++){
    cout<<"Pass "<<iter+1<<" out of "<< nbIte<<endl;

    //Filtering the tie points
    aMatPtsHomol = TiePtsFilter(aMatPtsHomol, aThresh);

//Correcting the tie points

//#pragma omp parallel for

    for(int numImage1=0;numImage1<nbIm;numImage1++)
    {
        vector<int> cpt(nbIm,0);
        cout<<"Computing factors for Im "<<numImage1<<endl;

        //For each tie point point, compute correction value (distance-ponderated mean value of all the tie points)
        for(int k = 0; k<int(aMatPtsHomol.aMat[numImage1].size()) ; k++){//go through each tie point
            double aCorR=0.0,aCorG=0.0,aCorB=0.0;
            double aSumDist=0;
            Pt2dr aPt(aMatPtsHomol.aMat[numImage1].Pts[k].x/ResolModel,aMatPtsHomol.aMat[numImage1].Pts[k].x/ResolModel);
            for(int numPt = 0; numPt<int(aMatPtsHomol.aMat[numImage1].size()) ; numPt++){//go through each tie point
                Pt2dr aPtIn(aMatPtsHomol.aMat[numImage1].Pts[numPt].x/ResolModel,aMatPtsHomol.aMat[numImage1].Pts[numPt].y/ResolModel);
                double aDist=euclid(aPtIn, aPt);
                if(aDist<1){aDist=1;}
                aSumDist=aSumDist+1/(aDist);
                aCorR = aCorR + aMatPtsHomol.aMat[numImage1].kR[numPt]/(aDist);
                aCorG = aCorG + aMatPtsHomol.aMat[numImage1].kG[numPt]/(aDist);
                aCorB = aCorB + aMatPtsHomol.aMat[numImage1].kB[numPt]/(aDist);
            }
            //Normalize
            aCorR = aCorR/aSumDist;
            aCorG = aCorG/aSumDist;
            aCorB = aCorB/aSumDist;

            //correcting Tie points color with computed surface
            //int numImage2=aMatPtsHomol.aMat[numImage1].OtherIm[k];
            //int pos=cpt[numImage2];cpt[numImage2]++;
            //if(aMatPtsHomol.aMat[numImage1][numImage2].R1[pos]*aCorR>255)
            //{
            //	aCorR=255/aMatPtsHomol.aMat[numImage1][numImage2].R1[pos];
            //}
            //if(aMatPtsHomol.aMat[numImage1][numImage2].G1[pos]*aCorB>255)
            //{
            //	aCorG=255/aMatPtsHomol.aMat[numImage1][numImage2].G1[pos];
            //}
            //if(aMatPtsHomol.aMat[numImage1][numImage2].B1[pos]*aCorG>255)
            //{
            //	aCorB=255/aMatPtsHomol.aMat[numImage1][numImage2].B1[pos];
            //}
            aMatPtsHomol.aMat[numImage1].kR[k]=aCorR;
            aMatPtsHomol.aMat[numImage1].kG[k]=aCorG;
            aMatPtsHomol.aMat[numImage1].kB[k]=aCorB;
            }
        //cout<<cpt<<endl;

    }
}

//Filtering the tie points
aMatPtsHomol = TiePtsFilter(aMatPtsHomol, aThresh);

cout<<"Factors were computed"<<endl;
//end truc à iterer--------------------------------------------------------------------------------------------------------------------------------------



//Applying the correction to the images
    //Bulding the output file system
    ELISE_fp::MkDirRec(aDir + aDirOut);
    //Reading input files
    string suffix="";if(InVig!=""){suffix="_Vodka.tif";}


#ifdef USE_OPEN_MP
#pragma omp parallel for
#endif
    for(int i=0;i<nbIm;i++)
    {
        string aNameIm=InVig + (*aSetIm)[i] + suffix;//if vignette is used, change the name of input file to read
        cout<<"Correcting "<<aNameIm<<" (with "<<aMatPtsHomol.aMat[i].size()<<" data points)"<<endl;
        string aNameOut=aDir + aDirOut + (*aSetIm)[i] +"_egal.tif";

        Pt2di aSzMod=aMatPtsHomol.aMat[i].SZ;//Size of the correction surface, taken from the size of the scaled image
        //cout<<"aSzMod"<<aSzMod<<endl;
        Im2D_REAL4  aImCorR(aSzMod.x,aSzMod.y,0.0);
        Im2D_REAL4  aImCorG(aSzMod.x,aSzMod.y,0.0);
        Im2D_REAL4  aImCorB(aSzMod.x,aSzMod.y,0.0);
        REAL4 ** aCorR = aImCorR.data();
        REAL4 ** aCorG = aImCorG.data();
        REAL4 ** aCorB = aImCorB.data();
        //cout<<vectPtsRadioTie[i].size()<<endl;
        //For each point of the surface, compute correction value (distance-ponderated mean value of all the tie points)
        long start=time(NULL);
        for (int aY=0 ; aY<aSzMod.y  ; aY++)
            {
                for (int aX=0 ; aX<aSzMod.x  ; aX++)
                {
                    float aCorPtR=0,aCorPtG=0,aCorPtB=0;
                    double aSumDist=0;
                    Pt2dr aPt(aX,aY);
                    for(int j = 0; j<int(aMatPtsHomol.aMat[i].size()) ; j++){//go through each tie point
                        Pt2dr aPtIn(aMatPtsHomol.aMat[i].Pts[j].x/ResolModel,aMatPtsHomol.aMat[i].Pts[j].y/ResolModel);
                        double aDist=euclid(aPtIn, aPt);
                        if(aDist<1){aDist=1;}
                        aSumDist=aSumDist+1/(aDist);
                        aCorPtR = aCorPtR + aMatPtsHomol.aMat[i].kR[j]/(aDist);
                        aCorPtG = aCorPtG + aMatPtsHomol.aMat[i].kG[j]/(aDist);
                        aCorPtB = aCorPtB + aMatPtsHomol.aMat[i].kB[j]/(aDist);
                    }
                    //Normalize
                    aCorR[aY][aX] = aCorPtR/aSumDist;
                    aCorG[aY][aX] = aCorPtG/aSumDist;
                    aCorB[aY][aX] = aCorPtB/aSumDist;
                }
            }

        long end = time(NULL);
        cout<<"Correction field computed in "<<end-start<<" sec, applying..."<<endl;

        //Reading the image and creating the objects to be manipulated
        Tiff_Im aTF= Tiff_Im::StdConvGen(aDir + aNameIm,3,false);
        Pt2di aSz = aTF.sz();

        Im2D_U_INT1  aImR(aSz.x,aSz.y);
        Im2D_U_INT1  aImG(aSz.x,aSz.y);
        Im2D_U_INT1  aImB(aSz.x,aSz.y);

        ELISE_COPY
        (
           aTF.all_pts(),
           aTF.in(),
           Virgule(aImR.out(),aImG.out(),aImB.out())
        );

        U_INT1 ** aDataR = aImR.data();
        U_INT1 ** aDataG = aImG.data();
        U_INT1 ** aDataB = aImB.data();

        for (int aY=0 ; aY<aSz.y  ; aY++)
            {
                for (int aX=0 ; aX<aSz.x  ; aX++)
                {
                    Pt2dr aPt(double(aX/ResolModel),double(aY/ResolModel));
                    //To be able to correct the edges
                        if(aPt.x>aSzMod.x-2){aPt.x=aSzMod.x-2;}
                        if(aPt.y>aSzMod.y-2){aPt.y=aSzMod.y-2;}
                    //Bilinear interpolation from the scaled surface to the full scale image
                    double R = aDataR[aY][aX]*Reechantillonnage::biline(aCorR, aSzMod.x, aSzMod.y, aPt);
                    double G = aDataG[aY][aX]*Reechantillonnage::biline(aCorG, aSzMod.x, aSzMod.y, aPt);
                    double B = aDataB[aY][aX]*Reechantillonnage::biline(aCorB, aSzMod.x, aSzMod.y, aPt);
                    //Overrun management:
                    if(R>255){aDataR[aY][aX]=255;}else if(R<0){aDataR[aY][aX]=0;}else{aDataR[aY][aX]=R;}
                    if(G>255){aDataG[aY][aX]=255;}else if(G<0){aDataG[aY][aX]=0;}else{aDataG[aY][aX]=G;}
                    if(B>255){aDataB[aY][aX]=255;}else if(B<0){aDataB[aY][aX]=0;}else{aDataB[aY][aX]=B;}
                }
        }


        //Writing ouput image
         Tiff_Im  aTOut
            (
                aNameOut.c_str(),
                aSz,
                GenIm::u_int1,
                Tiff_Im::No_Compr,
                Tiff_Im::RGB
            );


         ELISE_COPY
             (
                 aTOut.all_pts(),
                 Virgule(aImR.in(),aImG.in(),aImB.in()),
                 aTOut.out()
             );

    }
}