void marcaSegunSeamV(Imagen & LumMargenV, Imagen & BiR, Imagen & BiG, Imagen & BiB) { //Marcamos con valores fuera de rango el seam en la imagen LumMargenVEscogido find_v_seam(LumMargenV); unsigned int col; for(unsigned int row = 0; row < LumMargenV.fils(); row++) { col = 0; while(LumMargenV(row, col) < 10E20) //10E20: valor fuera de rango. { BiR(row, col) = 10E20; BiG(row, col) = 10E20; BiB(row, col) = 10E20; col++; if(col == LumMargenV.cols()) //Debugger { fprintf(stderr,"En ''marcaSegunSeamV()'' se pasa de largo!!!\n"); exit(1); } } } }
Imagen::Imagen(Imagen & im2) { dim[0]=im2.fils(); dim[1]=im2.cols(); int largo=dim[0]*dim[1]; datos=new double[largo]; for(int i=0; i< largo; i++) datos[i]=im2.datos[i]; }
// BACKTRACK void backtrackV(Imagen &cE, int i, unsigned int j, Imagen & E) { if (i > 0) { // Aj = incremento de j int Aj = minPosition(cE(i-1,j-1), cE(i-1,j), cE(i-1,j+1)); int f = i-1; int c = j + Aj; if(c == -1) c = 1; if((unsigned int)c == cE.cols()) c = cE.cols()-2; E(f, c) = 10E20; backtrackV(cE, f, c, E); } }
void Imagen::operator-=(Imagen & im2) { int fil2=im2.fils(); int col2=im2.cols(); if(dim[0]!=fil2 || dim[1]!=col2) { fprintf(stderr,"Diferentes dimensiones al restar imagenes \n"); return; } int largo=dim[0]*dim[1]; for(int i=0; i<largo; i++) datos[i]-=im2.datos[i]; return; }
void Imagen::operator*=(Imagen & im2) { int fil2=im2.fils(); int col2=im2.cols(); if(dim[0]!=fil2 || dim[1]!=col2) { fprintf(stderr,"Diferentes dimensiones al multiplicar imagenes \n"); return; } int largo=dim[0]*dim[1]; for(int i=0; i<largo; i++) this->datos[i] *= (&im2)->datos[i]; return; }
unsigned int smallestH(Imagen &cumulativeE){ int f = cumulativeE.fils() -1; // last row unsigned int h; double min = 10E8; // valor de inicio for (unsigned int j=0; j<cumulativeE.cols(); j++) { if (cumulativeE(f,j)<min) { h = j; min = cumulativeE(f,j); } } return h; }
// finds the horizontal coordinate of the pixel in the last row with minimum value unsigned int smallestV(Imagen &cumulativeE){ int c = cumulativeE.cols()-1; // last column unsigned int v; double min = 10E8; // valor de inicio for (unsigned int i=0; i<cumulativeE.fils(); i++) { if (cumulativeE(i,c)<min) { v = i; min = cumulativeE(i,c); } } return v; }
void Imagen::operator=(Imagen & im2) { // este operador no duplica la memoria // int fil2=im2.fils(); int col2=im2.cols(); if(dim[0]!=fil2 || dim[1]!=col2) { // fprintf(stderr,"Diferentes dimensiones al copiar imagenes \n"); dim[0]=fil2; dim[1]=col2; delete[] datos; datos=new double[fil2*col2]; } int largo=dim[0]*dim[1]; for(int i=0; i<largo; i++) datos[i]=im2.datos[i]; return; }
void Imagen::operator/=(Imagen & im2) { // si el divisor es 0, pone 0 en el cociente... int fil2=im2.fils(); int col2=im2.cols(); if(dim[0]!=fil2 || dim[1]!=col2) { fprintf(stderr,"Diferentes dimensiones al multiplicar imagenes \n"); return; } int largo=dim[0]*dim[1]; double div; for(int i=0; i<largo; i++) { div=im2.datos[i]; if(fabs(div)>1e-10) datos[i]/=div; else datos[i]=0.0; } return; }