diff options
Diffstat (limited to 'leptonica/src/dewarp.h')
-rw-r--r-- | leptonica/src/dewarp.h | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/leptonica/src/dewarp.h b/leptonica/src/dewarp.h new file mode 100644 index 00000000..37bfb632 --- /dev/null +++ b/leptonica/src/dewarp.h @@ -0,0 +1,191 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +#ifndef LEPTONICA_DEWARP_H +#define LEPTONICA_DEWARP_H + +/*! + * \file dewarp.h + * + * <pre> + * Data structure to hold arrays and results for generating + * horizontal and vertical disparity arrays based on textlines. + * Each disparity array is two-dimensional. The vertical disparity + * array gives a vertical displacement, relative to the lowest point + * in the textlines. The horizontal disparty array gives a horizontal + * displacement, relative to the minimum values (for even pages) + * or maximum values (for odd pages) of the left and right ends of + * full textlines. Horizontal alignment always involves translations + * away from the book gutter. + * + * We have intentionally separated the process of building models + * from the rendering process that uses the models. For any page, + * the building operation either creates an actual model (that is, + * a model with at least the vertical disparity being computed, and + * for which the 'success' flag is set) or fails to create a model. + * However, at rendering time, a page can have one of two different + * types of models. + * (1) A valid model is an actual model that meets the rendering + * constraints, which are limits on model curvature parameters. + * See dewarpaTestForValidModel() for details. + * Valid models are identified by dewarpaInsertRefModels(), + * which sets the 'vvalid' and 'hvalid' fields. Only valid + * models are used for rendering. + * (2) A reference model is used by a page that doesn't have + * a valid model, but has a nearby valid model of the same + * parity (even/odd page) that it can use. The range in pages + * to search for a valid model is given by the 'maxdist' field. + * + * At the rendering stage, vertical and horizontal disparities are + * treated differently. It is somewhat more robust to generate + * vertical disparity models (VDM) than horizontal disparity + * models (HDM). A valid VDM is required for any correction to + * be made; if a valid VDM is not available, just use the input + * image. Otherwise, assuming it is available, the use of the + * HDM is controlled by two fields: 'useboth' and 'check_columns'. + * (a) With useboth == 0, we use only the VDM. + * (b) With useboth == 1, we require using the VDM and, if a valid + * horizontal disparity model (HDM) is available, we also use it. + * (c) With check_columns == 1, check for multiple columns and if + * true, only use the VDM, even if a valid HDM is available. + * Note that 'check_columns' takes precedence over 'useboth' + * when there is more than 1 column of text. By default, + * check_columns == 0. + * + * The 'maxdist' parameter is input when the dewarpa is created. + * The other rendering parameters have default values given in dewarp1.c. + * All parameters used by rendering can be set (or reset) using accessors. + * + * After dewarping, use of the VDM will cause all points on each + * altered curve to have a y-value equal to the minimum. Use of + * the HDA will cause the left and right edges of the textlines + * to be vertically aligned if they had been typeset flush-left + * and flush-right, respectively. + * + * The sampled disparity arrays are expanded to full resolution, + * using linear interpolation, and this is further expanded + * by slope continuation to the right and below if the image + * is larger than the full resolution disparity arrays. Then + * the disparity correction can be applied to the input image. + * If the input pix are 2x reduced, the expansion from sampled + * to full res uses the product of (sampling) * (redfactor). + * + * The most accurate results are produced at full resolution, and + * this is generally recommended. + * </pre> + */ + + /*! Dewarp version for serialization + * <pre> + * Note on versioning of the serialization of this data structure: + * The dewarping utility and the stored data can be expected to change. + * In most situations, the serialized version is ephemeral -- it is + * not needed after being used. No functions will be provided to + * convert between different versions. + * </pre> + */ +#define DEWARP_VERSION_NUMBER 4 + +/*! Data structure to hold a number of Dewarp */ +struct L_Dewarpa +{ + l_int32 nalloc; /*!< size of dewarp ptr array */ + l_int32 maxpage; /*!< maximum page number in array */ + struct L_Dewarp **dewarp; /*!< array of ptrs to page dewarp */ + struct L_Dewarp **dewarpcache; /*!< array of ptrs to cached dewarps */ + struct Numa *namodels; /*!< list of page numbers for pages */ + /*!< with page models */ + struct Numa *napages; /*!< list of page numbers with either */ + /*!< page models or ref page models */ + l_int32 redfactor; /*!< reduction factor of input: 1 or 2 */ + l_int32 sampling; /*!< disparity arrays sampling factor */ + l_int32 minlines; /*!< min number of long lines required */ + l_int32 maxdist; /*!< max distance for getting ref page */ + l_int32 max_linecurv; /*!< maximum abs line curvature, */ + /*!< in micro-units */ + l_int32 min_diff_linecurv; /*!< minimum abs diff line */ + /*!< curvature in micro-units */ + l_int32 max_diff_linecurv; /*!< maximum abs diff line */ + /*!< curvature in micro-units */ + l_int32 max_edgeslope; /*!< maximum abs left or right edge */ + /*!< slope, in milli-units */ + l_int32 max_edgecurv; /*!< maximum abs left or right edge */ + /*!< curvature, in micro-units */ + l_int32 max_diff_edgecurv; /*!< maximum abs diff left-right */ + /*!< edge curvature, in micro-units */ + l_int32 useboth; /*!< use both disparity arrays if */ + /*!< available; only vertical otherwise */ + l_int32 check_columns; /*!< if there are multiple columns, */ + /*!< only use the vertical disparity */ + /*!< array */ + l_int32 modelsready; /*!< invalid models have been removed */ + /*!< and refs built against valid set */ +}; +typedef struct L_Dewarpa L_DEWARPA; + + +/*! Data structure for a single dewarp */ +struct L_Dewarp +{ + struct L_Dewarpa *dewa; /*!< ptr to parent (not owned) */ + struct Pix *pixs; /*!< source pix, 1 bpp */ + struct FPix *sampvdispar; /*!< sampled vert disparity array */ + struct FPix *samphdispar; /*!< sampled horiz disparity array */ + struct FPix *sampydispar; /*!< sampled slope h-disparity array */ + struct FPix *fullvdispar; /*!< full vert disparity array */ + struct FPix *fullhdispar; /*!< full horiz disparity array */ + struct FPix *fullydispar; /*!< full slope h-disparity array */ + struct Numa *namidys; /*!< sorted y val of midpoint each line */ + struct Numa *nacurves; /*!< sorted curvature of each line */ + l_int32 w; /*!< width of source image */ + l_int32 h; /*!< height of source image */ + l_int32 pageno; /*!< page number; important for reuse */ + l_int32 sampling; /*!< sampling factor of disparity arrays */ + l_int32 redfactor; /*!< reduction factor of pixs: 1 or 2 */ + l_int32 minlines; /*!< min number of long lines required */ + l_int32 nlines; /*!< number of long lines found */ + l_int32 mincurv; /*!< min line curvature in micro-units */ + l_int32 maxcurv; /*!< max line curvature in micro-units */ + l_int32 leftslope; /*!< left edge slope in milli-units */ + l_int32 rightslope; /*!< right edge slope in milli-units */ + l_int32 leftcurv; /*!< left edge curvature in micro-units */ + l_int32 rightcurv; /*!< right edge curvature in micro-units*/ + l_int32 nx; /*!< number of sampling pts in x-dir */ + l_int32 ny; /*!< number of sampling pts in y-dir */ + l_int32 hasref; /*!< 0 if normal; 1 if has a refpage */ + l_int32 refpage; /*!< page with disparity model to use */ + l_int32 vsuccess; /*!< sets to 1 if vert disparity builds */ + l_int32 hsuccess; /*!< sets to 1 if horiz disparity builds */ + l_int32 ysuccess; /*!< sets to 1 if slope disparity builds */ + l_int32 vvalid; /*!< sets to 1 if valid vert disparity */ + l_int32 hvalid; /*!< sets to 1 if valid horiz disparity */ + l_int32 skip_horiz; /*!< if 1, skip horiz disparity */ + /*!< correction */ + l_int32 debug; /*!< set to 1 if debug output requested */ +}; +typedef struct L_Dewarp L_DEWARP; + +#endif /* LEPTONICA_DEWARP_H */ |