cTmpReechEpip::cTmpReechEpip ( bool aConsChan, const std::string & aNameOri, Box2dr aBoxImIn, ElDistortion22_Gen * anEpi, Box2dr aBox, double aStep, const std::string & aNameOut, const std::string & aPostMasq, int aNumKer , bool Debug ) : mBoxImIn(aBoxImIn), mEpi (anEpi), mStep (aStep), mP0 (aBox._p0), mSzEpi (aBox.sz()), mSzRed (round_up (aBox.sz() / aStep) + Pt2di(1,1)), mRedIMasq (mSzRed.x,mSzRed.y,0), mRedTMasq (mRedIMasq), mRedImX (mSzRed.x,mSzRed.y), mRedTImX (mRedImX), mRedImY (mSzRed.x,mSzRed.y), mRedTImY (mRedImY) { cInterpolateurIm2D<REAL4> * aPtrSCI = 0; if (aNumKer==0) { aPtrSCI = new cInterpolBilineaire<REAL4>; } else { cKernelInterpol1D * aKer = 0; if (aNumKer==1) aKer = new cCubicInterpKernel(-0.5); else aKer = new cSinCardApodInterpol1D(cSinCardApodInterpol1D::eTukeyApod,aNumKer,aNumKer/2,1e-4,false); aPtrSCI = new cTabIM2D_FromIm2D<REAL4> (aKer,1000,false); // cTabIM2D_FromIm2D<REAL4> aSSCI (&aKer,1000,false); } cInterpolateurIm2D<REAL4> & aSCI = *aPtrSCI; Pt2di aPInd; for (aPInd.x=0 ; aPInd.x<mSzRed.x ; aPInd.x++) { for (aPInd.y=0 ; aPInd.y<mSzRed.y ; aPInd.y++) { bool Ok= false; Pt2dr aPEpi = ToFullEpiCoord(aPInd); Pt2dr aPIm = anEpi->Inverse(aPEpi); if ((aPIm.x>mBoxImIn._p0.x) && (aPIm.y>mBoxImIn._p0.y) && (aPIm.x<mBoxImIn._p1.x) && (aPIm.y<mBoxImIn._p1.y)) { Pt2dr aPEpi2 = anEpi->Direct(aPIm); if (euclid(aPEpi-aPEpi2) < 1e-2) { Ok= true; mRedTMasq.oset(aPInd,Ok); } } mRedTImX.oset(aPInd,aPIm.x); mRedTImY.oset(aPInd,aPIm.y); } } ELISE_COPY(mRedIMasq.all_pts(),dilat_d8(mRedIMasq.in(0),4),mRedIMasq.out()); Tiff_Im aTifOri = Tiff_Im::StdConvGen(aNameOri.c_str(),aConsChan ? -1 :1 ,true); Tiff_Im aTifEpi = Debug ? Tiff_Im(aNameOut.c_str()) : Tiff_Im ( aNameOut.c_str(), mSzEpi, aTifOri.type_el(), Tiff_Im::No_Compr, aTifOri.phot_interp() ) ; Tiff_Im aTifMasq = aTifEpi; bool ExportMasq = (aPostMasq!="NONE"); // std::cout << "POSTMAS " << aPostMasq << "\n"; if (ExportMasq) { std::string aNameMasq = StdPrefix(aNameOut)+ aPostMasq +".tif"; aTifMasq = Debug ? Tiff_Im(aNameMasq.c_str()) : Tiff_Im ( aNameMasq.c_str(), mSzEpi, GenIm::bits1_msbf, Tiff_Im::No_Compr, Tiff_Im::BlackIsZero ) ; } int aNbBloc=2000; int aBrd = aNumKer+10; Pt2di aSzBrd(aBrd,aBrd); int aX00 = 0; int aY00 = 0; for (int aX0=aX00 ; aX0<mSzEpi.x ; aX0+=aNbBloc) { int aX1 = ElMin(aX0+aNbBloc,mSzEpi.x); for (int aY0=aY00 ; aY0<mSzEpi.y ; aY0+=aNbBloc) { // std::cout << "X0Y0 " << aX0 << " " << aY0 << "\n"; int aY1 = ElMin(aY0+aNbBloc,mSzEpi.y); Pt2di aP0Epi(aX0,aY0); Pt2di aSzBloc(aX1-aX0,aY1-aY0); TIm2D<REAL4,REAL8> aTImX(aSzBloc); TIm2D<REAL4,REAL8> aTImY(aSzBloc); TIm2DBits<1> aTImMasq(aSzBloc,0); Pt2dr aInfIm(1e20,1e20); Pt2dr aSupIm(-1e20,-1e20); bool NonVide= false; for (int anX =aX0 ; anX<aX1 ; anX++) { for (int anY =aY0 ; anY<aY1 ; anY++) { Pt2dr aIndEpi (anX/mStep , anY/mStep); Pt2di aPIndLoc (anX-aX0,anY-aY0); if (mRedTMasq.get(round_down(aIndEpi))) { double aXIm = mRedTImX.getr(aIndEpi,-1,true); double aYIm = mRedTImY.getr(aIndEpi,-1,true); if ((aXIm>0) && (aYIm>0)) { // aTImMasq.oset(aPIndLoc,1); aTImX.oset(aPIndLoc,aXIm); aTImY.oset(aPIndLoc,aYIm); aInfIm = Inf(aInfIm,Pt2dr(aXIm,aYIm)); aSupIm = Sup(aSupIm,Pt2dr(aXIm,aYIm)); NonVide= true; } } } } Pt2di aP0BoxIm = Sup(Pt2di(0,0),Pt2di(round_down(aInfIm) - aSzBrd)); Pt2di aP1BoxIm = Inf(aTifOri.sz(),Pt2di(round_down(aSupIm) + aSzBrd)); Pt2di aSzIm = aP1BoxIm - aP0BoxIm; NonVide = NonVide && (aSzIm.x>0) && (aSzIm.y>0); if (NonVide) { // std::vector<Im2D_REAL4> aVIm; std::vector<Im2D_REAL4> aVIm= aTifOri.VecOfImFloat(aSzIm); ELISE_COPY ( rectangle(Pt2di(0,0),aSzIm), trans(aTifOri.in(),aP0BoxIm), StdOut(aVIm) ); std::vector<Im2D_REAL4> aVImEpi = aTifEpi.VecOfImFloat(aSzBloc); ELISE_ASSERT(aVImEpi.size()==aVIm.size(),"Incohe in nb chan, cTmpReechEpip::cTmpReechEpip"); for (int aKIm=0 ; aKIm <int(aVImEpi.size()) ; aKIm++) { TIm2D<REAL4,REAL8> aImEpi(aVImEpi[aKIm]); REAL4 ** aDataOri = aVIm[aKIm].data(); for (int anX =0 ; anX<aSzBloc.x ; anX++) { for (int anY =0 ; anY<aSzBloc.y ; anY++) { Pt2di aIndEpi(anX,anY); aImEpi.oset(aIndEpi,0); Pt2di anIndEpiGlob = aIndEpi + aP0Epi; Pt2dr aIndEpiRed (anIndEpiGlob.x/mStep , anIndEpiGlob.y/mStep); if (mRedTMasq.get(round_down(aIndEpiRed),0)) { double aXIm = mRedTImX.getr(aIndEpiRed,-1,true); double aYIm = mRedTImY.getr(aIndEpiRed,-1,true); Pt2dr aPImLoc = Pt2dr(aXIm,aYIm) - Pt2dr(aP0BoxIm); double aV= 128; if ((aPImLoc.x>aNumKer+2) && (aPImLoc.y>aNumKer+2) && (aPImLoc.x<aSzIm.x-aNumKer-3) && (aPImLoc.y<aSzIm.y-aNumKer-3)) { aTImMasq.oset(aIndEpi,1); aV = aSCI.GetVal(aDataOri,aPImLoc); // aV= 255; } aImEpi.oset(aIndEpi,aV); } } } } ELISE_COPY ( rectangle(aP0Epi,aP0Epi+aSzBloc), Tronque(aTifEpi.type_el(),trans(StdInput(aVImEpi),-aP0Epi)), aTifEpi.out() ); } if (ExportMasq) { ELISE_COPY ( rectangle(aP0Epi,aP0Epi+aSzBloc), trans(aTImMasq._the_im.in(0),-aP0Epi), aTifMasq.out() ); } // std::cout << "ReechDONE " << aX0 << " "<< aY0 << "\n"; } } }
int ConvertIm_main(int argc,char ** argv) { MMD_InitArgcArgv(argc,argv); Tiff_Im::SetDefTileFile(1000000); std::string aNameIn ; INT aReducX=0; INT aReducY=0; INT aReducXY=0; INT aVisu=0; GenIm::type_el aTypeOut ; std::string aNameTypeOut =""; Tiff_Im::PH_INTER_TYPE aPhInterpOut ; std::string aNamePITOut =""; std::string PITOut[] = {"RGB","BW"}; std::list<std::string> lOut(PITOut, PITOut + sizeof(PITOut) / sizeof(std::string) ); std::string aNameOut; std::string anExt; Pt2di aP0(0,0); Pt2di aSzOut ; Pt2di aSzTF(-1,-1); REAL aDyn=1.0; Pt2di aSzTileInterne(-1,-1); int aKCh = -1; std::vector<int> aVPermut; int aNoTile = 0; std::string aF2 =""; ElInitArgMain ( argc,argv, LArgMain() << EAMC(aNameIn, "Image", eSAM_IsExistFile), LArgMain() << EAM(aNameOut,"Out",true) << EAM(anExt,"Ext",true) << EAM(aSzOut,"SzOut",true, "Size out", eSAM_NoInit) << EAM(aP0,"P0",true) << EAM(aNameTypeOut,"Type",true, "TypeMNT", eSAM_None, ListOfVal(GenIm::bits1_msbf, "")) << EAM(aNamePITOut,"Col",true, "Col", eSAM_None,lOut) << EAM(aReducXY,"ReducXY",true) << EAM(aReducX,"ReducX",true) << EAM(aReducY,"ReducY",true) << EAM(aVisu,"Visu",true) << EAM(aSzTF,"SzTifTile",true) << EAM(aSzTileInterne,"SzTileInterne",true) << EAM(aDyn,"Dyn",true) << EAM(aKCh,"KCh",true) << EAM(aNoTile,"NoTile",true) << EAM(aVPermut,"Permut",true, "Permut", eSAM_NoInit) << EAM(aF2,"F2",true) ); if (!MMVisualMode) { // Tiff_Im aTifIn = Tiff_Im::BasicConvStd(aNameIn); Tiff_Im aTifIn = Tiff_Im::UnivConvStd(aNameIn); INT aNbChIn = aTifIn.nb_chan(); if (! EAMIsInit(&aTypeOut)) aTypeOut =aTifIn.type_el(); if (! EAMIsInit(&aPhInterpOut)) aPhInterpOut = aTifIn.phot_interp(); if (! EAMIsInit(&aSzOut)) aSzOut = aTifIn.sz(); if (aReducXY) { aReducX = 1; aReducY = 1; } if (aNameOut=="") { if (anExt=="") { if (aReducX && aReducY) anExt = "_RXY"; else if (aReducX) anExt = "_RX"; else if (aReducY) anExt = "_RY"; else anExt= "_Out"; } if (IsPostfixed(aNameIn)) aNameOut = StdPrefix(aNameIn) + anExt +"." + StdPostfix(aNameIn); else aNameOut = aNameIn + anExt + "tif"; } Pt2di aCoefReduc(aReducX != 0 ? 2 : 1, aReducY != 0 ? 2 : 1); aSzOut = aSzOut.dcbyc(aCoefReduc); if (aNameTypeOut != "") aTypeOut = type_im(aNameTypeOut); if (aKCh != -1) aNamePITOut="BW"; if ( aVPermut.size() !=0) { if ( aVPermut.size() ==1) aPhInterpOut = Tiff_Im::BlackIsZero; else if ( aVPermut.size() ==3) aPhInterpOut = Tiff_Im::RGB; else { ELISE_ASSERT(aNamePITOut=="","Nb Canaux incoherents"); } } else { if (aNamePITOut=="RGB") aPhInterpOut = Tiff_Im::RGB; else if (aNamePITOut=="BW") aPhInterpOut = Tiff_Im::BlackIsZero; else { ELISE_ASSERT(aNamePITOut=="","Mode Couleur Inconnu"); } } Tiff_Im::COMPR_TYPE aComprOut = Tiff_Im::No_Compr; L_Arg_Opt_Tiff aLArg = Tiff_Im::Empty_ARG; if (! aNoTile) { if (aSzTileInterne != Pt2di(-1,-1)) aLArg = aLArg + Arg_Tiff(Tiff_Im::ATiles(aSzTileInterne)); if (aSzTF != Pt2di(-1,-1)) aLArg = aLArg + Arg_Tiff(Tiff_Im::AFileTiling(aSzTF)); } else { aLArg = aLArg + Arg_Tiff(Tiff_Im::ANoStrip()); aLArg = aLArg + Arg_Tiff(Tiff_Im::AFileTiling(Pt2di(-1,-1))); } Tiff_Im aTifOut ( aNameOut.c_str(), aSzOut, aTypeOut, aComprOut, aPhInterpOut, aLArg ); INT aNbChOut = aTifOut.nb_chan(); Pt2di aSzROut = aSzOut; Output anOut = aTifOut.out(); Fonc_Num aFin = aTifIn.in_proj(); if (aF2!="") { Tiff_Im aT2 = Tiff_Im::BasicConvStd(DirOfFile(aNameIn)+aF2); aFin = Virgule(aFin,aT2.in(0)); } if (aVPermut.size() != 0) aFin = aFin.permut(aVPermut); if (type_im_integral( aTypeOut)) { } else { aFin = Rconv(aFin); } aFin = reduc_binaire_gen(aFin, aReducX != 0, aReducY != 0, 16, true, 0); anOut = Filtre_Out_RedBin_Gen(anOut, aReducX != 0, aReducY != 0); aSzROut = aSzOut.mcbyc(aCoefReduc); aFin = trans(aFin,aP0); if (aKCh!=-1) aFin = aFin.kth_proj(aKCh); else { if ((aNbChOut==1) && (aNbChIn==3)) aFin = (aFin.v0() + aFin.v1() + aFin.v2()) / 3.0; if ((aNbChOut==3) && (aNbChIn==1)) aFin = Virgule(aFin,aFin,aFin); } if (aVisu) anOut = anOut | Video_Win::WiewAv(aSzROut); if (aDyn != 1.0) aFin = aFin * aDyn; if (type_im_integral(aTypeOut) && (aTypeOut!=GenIm::int4)) { int aVMin,aVMax; min_max_type_num(aTypeOut,aVMin,aVMax); aFin = Max(aVMin,Min(aVMax-1,aFin)); } ELISE_COPY(rectangle(Pt2di(0,0),aSzROut),aFin,anOut); return EXIT_SUCCESS; } else return EXIT_SUCCESS; }