Leptonica 1.54
Файл src/conncomp.c
#include <stdio.h>
#include <stdlib.h>
#include "allheaders.h"

Классы

struct  FillSeg

Макросы

#define DEBUG   0

Определения типов

typedef struct FillSeg FILLSEG

Функции

static void pushFillsegBB (L_STACK *lstack, l_int32 xleft, l_int32 xright, l_int32 y, l_int32 dy, l_int32 ymax, l_int32 *pminx, l_int32 *pmaxx, l_int32 *pminy, l_int32 *pmaxy)
static void pushFillseg (L_STACK *lstack, l_int32 xleft, l_int32 xright, l_int32 y, l_int32 dy, l_int32 ymax)
static void popFillseg (L_STACK *lstack, l_int32 *pxleft, l_int32 *pxright, l_int32 *py, l_int32 *pdy)
BOXApixConnComp (PIX *pixs, PIXA **ppixa, l_int32 connectivity)
BOXApixConnCompPixa (PIX *pixs, PIXA **ppixa, l_int32 connectivity)
BOXApixConnCompBB (PIX *pixs, l_int32 connectivity)
l_int32 pixCountConnComp (PIX *pixs, l_int32 connectivity, l_int32 *pcount)
l_int32 nextOnPixelInRaster (PIX *pixs, l_int32 xstart, l_int32 ystart, l_int32 *px, l_int32 *py)
l_int32 nextOnPixelInRasterLow (l_uint32 *data, l_int32 w, l_int32 h, l_int32 wpl, l_int32 xstart, l_int32 ystart, l_int32 *px, l_int32 *py)
BOXpixSeedfillBB (PIX *pixs, L_STACK *lstack, l_int32 x, l_int32 y, l_int32 connectivity)
BOXpixSeedfill4BB (PIX *pixs, L_STACK *lstack, l_int32 x, l_int32 y)
BOXpixSeedfill8BB (PIX *pixs, L_STACK *lstack, l_int32 x, l_int32 y)
l_int32 pixSeedfill (PIX *pixs, L_STACK *lstack, l_int32 x, l_int32 y, l_int32 connectivity)
l_int32 pixSeedfill4 (PIX *pixs, L_STACK *lstack, l_int32 x, l_int32 y)
l_int32 pixSeedfill8 (PIX *pixs, L_STACK *lstack, l_int32 x, l_int32 y)

Макросы

#define DEBUG   0

Типы

typedef struct FillSeg FILLSEG

Функции

l_int32 nextOnPixelInRaster ( PIX pixs,
l_int32  xstart,
l_int32  ystart,
l_int32 px,
l_int32 py 
)

nextOnPixelInRaster()

Input: pixs (1 bpp) xstart, ystart (starting point for search) &x, &y (<return> coord value of next ON pixel) Return: 1 if a pixel is found; 0 otherwise or on error

l_int32 nextOnPixelInRasterLow ( l_uint32 data,
l_int32  w,
l_int32  h,
l_int32  wpl,
l_int32  xstart,
l_int32  ystart,
l_int32 px,
l_int32 py 
)
BOXA* pixConnComp ( PIX pixs,
PIXA **  ppixa,
l_int32  connectivity 
)

pixConnComp()

Input: pixs (1 bpp) &pixa (<optional return>=""> pixa of each c.c.) connectivity (4 or 8) Return: boxa, or null on error

Notes: (1) This is the top-level call for getting bounding boxes or a pixa of the components, and it can be used instead of either pixConnCompBB() or pixConnCompPixa(), rsp.

BOXA* pixConnCompBB ( PIX pixs,
l_int32  connectivity 
)

pixConnCompBB()

Input: pixs (1 bpp) connectivity (4 or 8) Return: boxa, or null on error

Notes: (1) Finds bounding boxes of 4- or 8-connected components in a binary image. (2) This works on a copy of the input pix. The c.c. are located in raster order and erased one at a time. In the process, the b.b. is computed and saved.

BOXA* pixConnCompPixa ( PIX pixs,
PIXA **  ppixa,
l_int32  connectivity 
)

pixConnCompPixa()

Input: pixs (1 bpp) &pixa (<return> pixa of each c.c.) connectivity (4 or 8) Return: boxa, or null on error

Notes: (1) This finds bounding boxes of 4- or 8-connected components in a binary image, and saves images of each c.c in a pixa array. (2) It sets up 2 temporary pix, and for each c.c. that is located in raster order, it erases the c.c. from one pix, then uses the b.b. to extract the c.c. from the two pix using an XOR, and finally erases the c.c. from the second pix. (3) A clone of the returned boxa (where all boxes in the array are clones) is inserted into the pixa. (4) If the input is valid, this always returns a boxa and a pixa. If pixs is empty, the boxa and pixa will be empty.

l_int32 pixCountConnComp ( PIX pixs,
l_int32  connectivity,
l_int32 pcount 
)

pixCountConnComp()

Input: pixs (1 bpp) connectivity (4 or 8) &count (<return> Return: 0 if OK, 1 on error

Notes: (1) This is the top-level call for getting the number of 4- or 8-connected components in a 1 bpp image. (2) It works on a copy of the input pix. The c.c. are located in raster order and erased one at a time.

l_int32 pixSeedfill ( PIX pixs,
L_STACK lstack,
l_int32  x,
l_int32  y,
l_int32  connectivity 
)

pixSeedfill()

Input: pixs (1 bpp) lstack (for holding fillsegs) x,y (location of seed pixel) connectivity (4 or 8) Return: 0 if OK, 1 on error

Notes: (1) This removes the component from pixs with a fg pixel at (x,y). (2) See pixSeedfill4() and pixSeedfill8() for details.

l_int32 pixSeedfill4 ( PIX pixs,
L_STACK lstack,
l_int32  x,
l_int32  y 
)

pixSeedfill4()

Input: pixs (1 bpp) lstack (for holding fillsegs) x,y (location of seed pixel) Return: 0 if OK, 1 on error

Notes: (1) This is Paul Heckbert's stack-based 4-cc seedfill algorithm. (2) This operates on the input 1 bpp pix to remove the fg seed pixel, at (x,y), and all pixels that are 4-connected to it. The seed pixel at (x,y) must initially be ON. (3) Reference: see pixSeedFill4BB()

BOX* pixSeedfill4BB ( PIX pixs,
L_STACK lstack,
l_int32  x,
l_int32  y 
)

pixSeedfill4BB()

Input: pixs (1 bpp) lstack (for holding fillsegs) x,y (location of seed pixel) Return: box or null on error.

Notes: (1) This is Paul Heckbert's stack-based 4-cc seedfill algorithm. (2) This operates on the input 1 bpp pix to remove the fg seed pixel, at (x,y), and all pixels that are 4-connected to it. The seed pixel at (x,y) must initially be ON. (3) Returns the bounding box of the erased 4-cc component. (4) Reference: see Paul Heckbert's stack-based seed fill algorithm in "Graphic Gems", ed. Andrew Glassner, Academic Press, 1990. The algorithm description is given on pp. 275-277; working C code is on pp. 721-722.) The code here follows Heckbert's exactly, except we use function calls instead of macros for pushing data on and popping data off the stack. This makes sense to do because Heckbert's fixed-size stack with macros is dangerous: images exist that will overrun the stack and crash. The stack utility here grows dynamically as needed, and the fillseg structures that are not in use are stored in another stack for reuse. It should be noted that the overhead in the function calls (vs. macros) is negligible.

l_int32 pixSeedfill8 ( PIX pixs,
L_STACK lstack,
l_int32  x,
l_int32  y 
)

pixSeedfill8()

Input: pixs (1 bpp) lstack (for holding fillsegs) x,y (location of seed pixel) Return: 0 if OK, 1 on error

Notes: (1) This is Paul Heckbert's stack-based 8-cc seedfill algorithm. (2) This operates on the input 1 bpp pix to remove the fg seed pixel, at (x,y), and all pixels that are 8-connected to it. The seed pixel at (x,y) must initially be ON. (3) Reference: see pixSeedFill8BB()

BOX* pixSeedfill8BB ( PIX pixs,
L_STACK lstack,
l_int32  x,
l_int32  y 
)

pixSeedfill8BB()

Input: pixs (1 bpp) lstack (for holding fillsegs) x,y (location of seed pixel) Return: box or null on error.

Notes: (1) This is Paul Heckbert's stack-based 8-cc seedfill algorithm. (2) This operates on the input 1 bpp pix to remove the fg seed pixel, at (x,y), and all pixels that are 8-connected to it. The seed pixel at (x,y) must initially be ON. (3) Returns the bounding box of the erased 8-cc component. (4) Reference: see Paul Heckbert's stack-based seed fill algorithm in "Graphic Gems", ed. Andrew Glassner, Academic Press, 1990. The algorithm description is given on pp. 275-277; working C code is on pp. 721-722.) The code here follows Heckbert's closely, except the leak checks are changed for 8 connectivity. See comments on pixSeedfill4BB() for more details.

BOX* pixSeedfillBB ( PIX pixs,
L_STACK lstack,
l_int32  x,
l_int32  y,
l_int32  connectivity 
)

pixSeedfillBB()

Input: pixs (1 bpp) lstack (for holding fillsegs) x,y (location of seed pixel) connectivity (4 or 8) Return: box or null on error

Notes: (1) This is the high-level interface to Paul Heckbert's stack-based seedfill algorithm.

static void popFillseg ( L_STACK lstack,
l_int32 pxleft,
l_int32 pxright,
l_int32 py,
l_int32 pdy 
) [static]

popFillseg()

Input: lstack &xleft (<return>) &xright (<return>) &y (<return>) &dy (<return>) Return: void

Notes: (1) This removes a line segment from the stack, and returns its size. (2) The surplussed fillseg is placed on the auxiliary stack for future use.

static void pushFillseg ( L_STACK lstack,
l_int32  xleft,
l_int32  xright,
l_int32  y,
l_int32  dy,
l_int32  ymax 
) [static]

pushFillseg()

Input: lstack xleft, xright y dy ymax Return: void

Notes: (1) This adds a line segment to the stack. (2) The auxiliary stack is used as a storage area to recycle fillsegs that are no longer in use. We only calloc new fillsegs if the auxiliary stack is empty.

static void pushFillsegBB ( L_STACK lstack,
l_int32  xleft,
l_int32  xright,
l_int32  y,
l_int32  dy,
l_int32  ymax,
l_int32 pminx,
l_int32 pmaxx,
l_int32 pminy,
l_int32 pmaxy 
) [static]

pushFillsegBB()

Input: lstack xleft, xright y dy ymax, &minx (<return>) &maxx (<return>) &miny (<return>) &maxy (<return>) Return: void

Notes: (1) This adds a line segment to the stack, and returns its size. (2) The auxiliary stack is used as a storage area to recycle fillsegs that are no longer in use. We only calloc new fillsegs if the auxiliary stack is empty.