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 RotateImage(double alpha, Pt2di aSzOut, vector<Pt2dr> Pts , string aNameDir, string aNameIm) { cout<<"Rotating "<<aNameIm<<endl; string aNameOut=aNameDir + "Croped_images/" + aNameIm + ".tif"; //Reading the image and creating the objects to be manipulated Tiff_Im aTF= Tiff_Im::StdConvGen(aNameDir + aNameIm,1,false); Pt2di aSz = aTF.sz(); Pt2dr P1Cor=Rot2D(alpha, Pts[0], Pts[1]); //P1Cor.x=cos(alpha)*(Pts[0].x-Pts[1].x)+sin(alpha)*(Pts[0].y-Pts[1].y)+Pts[1].x; P1Cor.y=-sin(alpha)*(Pts[0].x-Pts[1].x)+cos(alpha)*(Pts[0].y-Pts[1].y)+Pts[1].y; Pt2dr P3Cor=Rot2D(alpha, Pts[2], Pts[1]); //P3Cor.x=cos(alpha)*(Pts[2].x-Pts[1].x)+sin(alpha)*(Pts[2].y-Pts[1].y)+Pts[1].x; P3Cor.y=-sin(alpha)*(Pts[2].x-Pts[1].x)+cos(alpha)*(Pts[2].y-Pts[1].y)+Pts[1].y; 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(aSzOut.x,aSzOut.y); Im2D_U_INT1 aImGOut(aSzOut.x,aSzOut.y); Im2D_U_INT1 aImBOut(aSzOut.x,aSzOut.y); ELISE_COPY ( aTF.all_pts(), aTF.in(), aImR.out()//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; Pt2di imageTopCorner, imageBottomCorner; imageTopCorner.x = (int)(P1Cor.x + 0.5) + (int)(max(abs(P1Cor.x - Pts[1].x), abs(P1Cor.x - P3Cor.x)) - aSzOut.x) / 2; imageTopCorner.y = (int)(P1Cor.y + 0.5) + (int)(max(abs(P3Cor.y - Pts[1].y), abs(P1Cor.y - P3Cor.y)) - aSzOut.y) / 2; imageBottomCorner.x = imageTopCorner.x + aSzOut.x; imageBottomCorner.y = imageTopCorner.y + aSzOut.y; for (int aY=imageTopCorner.y ; aY<imageBottomCorner.y ; aY++) { for (int aX=imageTopCorner.x ; aX<imageBottomCorner.x ; aX++) { ptOut.x=cos(-alpha)*(aX-Pts[1].x)+sin(-alpha)*(aY-Pts[1].y)+Pts[1].x; ptOut.y=-sin(-alpha)*(aX-Pts[1].x)+cos(-alpha)*(aY-Pts[1].y)+Pts[1].y; aDataROut[aY-imageTopCorner.y][aX-imageTopCorner.x] = Reechantillonnage::biline(aDataR, aSz.x, aSz.y, ptOut); aDataGOut[aY-imageTopCorner.y][aX-imageTopCorner.x] = Reechantillonnage::biline(aDataR, aSz.x, aSz.y, ptOut); aDataBOut[aY-imageTopCorner.y][aX-imageTopCorner.x] = Reechantillonnage::biline(aDataR, aSz.x, aSz.y, ptOut); } } Tiff_Im aTOut ( aNameOut.c_str(), aSzOut, GenIm::u_int1, Tiff_Im::No_Compr, Tiff_Im::RGB ); ELISE_COPY ( aTOut.all_pts(), Virgule(aImROut.in(),aImGOut.in(),aImBOut.in()), aTOut.out() ); #if (ELISE_unix || ELISE_Cygwin || ELISE_MacOs) string aCom="convert ephemeral:" + aNameDir + "Croped_images/" + aNameIm + ".tif " + aNameDir + "Croped_images/" + aNameIm; system_call(aCom.c_str()); #endif #if (ELISE_windows) string aCom=MMDir() + "binaire-aux/convert ephemeral:" + aNameDir + "Croped_images/" + aNameIm + ".tif " + aNameDir + "Croped_images/" + aNameIm; system_call(aCom.c_str()); #endif }
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 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() ); } }