Tesseract
3.02
|
Go to the source code of this file.
Functions | |
void | dyn_prog (int n, int *x, int *y, int ymax, int *oldx, int *oldy, int oldn, float factor) |
void dyn_prog | ( | int | n, |
int * | x, | ||
int * | y, | ||
int | ymax, | ||
int * | oldx, | ||
int * | oldy, | ||
int | oldn, | ||
float | factor | ||
) |
Definition at line 50 of file imgscale.cpp.
{ int i, z, j, matchflag; int **ymin; float **F, fz; /* F[i][z] gives minimum over y <= z */ F = (float **) calloc (n, sizeof (float *)); ymin = (int **) calloc (n, sizeof (int *)); if ((F == NULL) || (ymin == NULL)) dyn_exit ("Error in calloc\n"); for (i = 0; i < n; i++) { F[i] = (float *) calloc (ymax - n + i + 1, sizeof (float)); ymin[i] = (int *) calloc (ymax - n + i + 1, sizeof (int)); if ((F[i] == NULL) || (ymin[i] == NULL)) dyn_exit ("Error in calloc\n"); } F[0][0] = f (x[0], 0); /* find nearest transition of same sign (white to black) */ j = 0; while ((j < oldn) && (oldx[j] < x[0])) j += 2; if (j >= oldn) j -= 2; else if ((j - 2 >= 0) && ((x[0] - oldx[j - 2]) < (oldx[j] - x[0]))) j -= 2; if (abs (oldx[j] - x[0]) < factor) { matchflag = 1; F[0][0] += g (oldy[j], 0, oldx[j], x[0]); } else matchflag = 0; ymin[0][0] = 0; for (z = 1; z < ymax - n + 1; z++) { fz = f (x[0], z); /* add penalty for deviating from previous row if necessary */ if (matchflag) fz += g (oldy[j], z, oldx[j], x[0]); if (fz < F[0][z - 1]) { F[0][z] = fz; ymin[0][z] = z; } else { F[0][z] = F[0][z - 1]; ymin[0][z] = ymin[0][z - 1]; } } for (i = 1; i < n; i++) { F[i][i] = f (x[i], i) + F[i - 1][i - 1]; /* add penalty for deviating from previous row if necessary */ if (j > 0) j--; else j++; while ((j < oldn) && (oldx[j] < x[i])) j += 2; if (j >= oldn) j -= 2; else if ((j - 2 >= 0) && ((x[i] - oldx[j - 2]) < (oldx[j] - x[i]))) j -= 2; if (abs (oldx[j] - x[i]) < factor) { matchflag = 1; F[i][i] += g (oldy[j], i, oldx[j], x[i]); } else matchflag = 0; ymin[i][i] = i; for (z = i + 1; z < ymax - n + i + 1; z++) { fz = f (x[i], z) + F[i - 1][z - 1]; /* add penalty for deviating from previous row if necessary */ if (matchflag) fz += g (oldy[j], z, oldx[j], x[i]); if (fz < F[i][z - 1]) { F[i][z] = fz; ymin[i][z] = z; } else { F[i][z] = F[i][z - 1]; ymin[i][z] = ymin[i][z - 1]; } } } y[n - 1] = ymin[n - 1][ymax - 1]; for (i = n - 2; i >= 0; i--) y[i] = ymin[i][y[i + 1] - 1]; for (i = 0; i < n; i++) { free (F[i]); free (ymin[i]); } free(F); free(ymin); return; }