本文整理汇总了C++中pixCopy函数的典型用法代码示例。如果您正苦于以下问题:C++ pixCopy函数的具体用法?C++ pixCopy怎么用?C++ pixCopy使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了pixCopy函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: pixTranslate
/*!
* pixTranslate()
*
* Input: pixd (<optional> destination: this can be null,
* equal to pixs, or different from pixs)
* pixs
* hshift (horizontal shift; hshift > 0 is to right)
* vshift (vertical shift; vshift > 0 is down)
* incolor (L_BRING_IN_WHITE, L_BRING_IN_BLACK)
* Return: pixd, or null on error.
*
* Notes:
* (1) The general pattern is:
* pixd = pixTranslate(pixd, pixs, ...);
* For clarity, when you know the case, use one of these:
* pixd = pixTranslate(NULL, pixs, ...); // new
* pixTranslate(pixs, pixs, ...); // in-place
* pixTranslate(pixd, pixs, ...); // to existing pixd
* (2) If an existing pixd is not the same size as pixs, the
* image data will be reallocated.
*/
PIX *
pixTranslate(PIX *pixd,
PIX *pixs,
l_int32 hshift,
l_int32 vshift,
l_int32 incolor)
{
PROCNAME("pixTranslate");
if (!pixs)
return (PIX *)ERROR_PTR("pixs not defined", procName, NULL);
/* Prepare pixd for in-place operation */
if ((pixd = pixCopy(pixd, pixs)) == NULL)
return (PIX *)ERROR_PTR("pixd not made", procName, NULL);
pixRasteropIP(pixd, hshift, vshift, incolor);
return pixd;
}
开发者ID:xmarston,项目名称:BillRecognizer,代码行数:40,代码来源:rop.c
示例2: pixRotateOrth
/*!
* pixRotateOrth()
*
* Input: pixs (all depths)
* quads (0-3; number of 90 degree cw rotations)
* Return: pixd, or null on error
*/
PIX *
pixRotateOrth(PIX *pixs,
l_int32 quads)
{
PROCNAME("pixRotateOrth");
if (!pixs)
return (PIX *)ERROR_PTR("pixs not defined", procName, NULL);
if (quads < 0 || quads > 4)
return (PIX *)ERROR_PTR("quads not in {0,1,2,3,4}", procName, NULL);
if (quads == 0 || quads == 4)
return pixCopy(NULL, pixs);
else if (quads == 1)
return pixRotate90(pixs, 1);
else if (quads == 2)
return pixRotate180(NULL, pixs);
else /* quads == 3 */
return pixRotate90(pixs, -1);
}
开发者ID:0359xiaodong,项目名称:tess-two,代码行数:27,代码来源:rotateorth.c
示例3: main
main(int argc,
char **argv)
{
l_int32 i, j;
PIX *pixs, *pixt, *pixd;
L_REGPARAMS *rp;
if (regTestSetup(argc, argv, &rp))
return 1;
pixs = pixRead("test8.jpg");
pixt = pixCopy(NULL, pixs);
/* Copy, in-place and one COLUMN at a time, from the right
side to the left side. */
for (j = 0; j < 200; j++)
pixRasterop(pixs, 20 + j, 20, 1, 250, PIX_SRC, pixs, 250 + j, 20);
pixDisplayWithTitle(pixs, 50, 50, "in-place copy", rp->display);
/* Copy, in-place and one ROW at a time, from the right
side to the left side. */
for (i = 0; i < 250; i++)
pixRasterop(pixt, 20, 20 + i, 200, 1, PIX_SRC, pixt, 250, 20 + i);
/* Test */
regTestComparePix(rp, pixs, pixt); /* 0 */
pixDestroy(&pixs);
pixDestroy(&pixt);
/* Show the mirrored border, which uses the general
pixRasterop() on an image in-place. */
pixs = pixRead("test8.jpg");
pixt = pixRemoveBorder(pixs, 40);
pixd = pixAddMirroredBorder(pixt, 40, 40, 40, 40);
regTestWritePixAndCheck(rp, pixd, IFF_PNG); /* 1 */
pixDisplayWithTitle(pixd, 650, 50, "mirrored border", rp->display);
pixDestroy(&pixs);
pixDestroy(&pixt);
pixDestroy(&pixd);
return regTestCleanup(rp);
}
开发者ID:0xkasun,项目名称:Dummy_Tes,代码行数:41,代码来源:rasteropip_reg.c
示例4: CopyPtras
static void
CopyPtras(L_PTRA *papixs,
L_PTRA *paboxs,
L_PTRA **ppapixd,
L_PTRA **ppaboxd)
{
l_int32 i, imax;
BOX *box;
PIX *pix;
ptraGetMaxIndex(papixs, &imax);
*ppapixd = ptraCreate(imax + 1);
*ppaboxd = ptraCreate(imax + 1);
for (i = 0; i <= imax; i++) {
pix = pixCopy(NULL, (PIX *)ptraGetPtrToItem(papixs, i));
box = boxCopy((BOX *)ptraGetPtrToItem(paboxs, i));
ptraAdd(*ppapixd, pix);
ptraAdd(*ppaboxd, box);
}
return;
}
开发者ID:xmarston,项目名称:BillRecognizer,代码行数:21,代码来源:ptra1_reg.c
示例5: pixSetStrokeWidth
/*!
* \brief pixSetStrokeWidth()
*
* \param[in] pixs 1 bpp pix
* \param[in] width set stroke width to this value, in [1 ... 100].
* \param[in] thinfirst 1 to thin all pix to a skeleton first; 0 to skip
* \param[in] connectivity 4 or 8, to be used if %thinfirst == 1
* \return pixd with stroke width set to %width, or NULL on error
*
* <pre>
* Notes:
* (1) See notes in pixaSetStrokeWidth().
* (2) A white border of sufficient width to avoid boundary
* artifacts in the thickening step is added before thinning.
* (3) %connectivity == 8 usually gives a slightly smoother result.
* </pre>
*/
PIX *
pixSetStrokeWidth(PIX *pixs,
l_int32 width,
l_int32 thinfirst,
l_int32 connectivity)
{
char buf[16];
l_int32 border;
PIX *pix1, *pix2, *pixd;
PROCNAME("pixSetStrokeWidth");
if (!pixs || (pixGetDepth(pixs) != 1))
return (PIX *)ERROR_PTR("pixs undefined or not 1 bpp", procName, NULL);
if (width < 1 || width > 100)
return (PIX *)ERROR_PTR("width not in [1 ... 100]", procName, NULL);
if (connectivity != 4 && connectivity != 8)
return (PIX *)ERROR_PTR("connectivity not 4 or 8", procName, NULL);
if (!thinfirst && width == 1) /* nothing to do */
return pixCopy(NULL, pixs);
/* Add a white border */
border = width / 2;
pix1 = pixAddBorder(pixs, border, 0);
/* Thin to a skeleton */
if (thinfirst)
pix2 = pixThinConnected(pix1, L_THIN_FG, connectivity, 0);
else
pix2 = pixClone(pix1);
pixDestroy(&pix1);
/* Dilate */
snprintf(buf, sizeof(buf), "D%d.%d", width, width);
pixd = pixMorphSequence(pix2, buf, 0);
pixCopyText(pixd, pixs);
pixDestroy(&pix2);
return pixd;
}
开发者ID:creatale,项目名称:node-dv,代码行数:57,代码来源:strokes.c
示例6: pixThresholdToValue
/*!
* pixThresholdToValue()
*
* Input: pixd (<optional>; if not null, must be equal to pixs)
* pixs (8, 16, 32 bpp)
* threshval
* setval
* Return: pixd always
*
* Notes:
* - operation can be in-place (pixs == pixd) or to a new pixd
* - if setval > threshval, sets pixels with a value >= threshval to setval
* - if setval < threshval, sets pixels with a value <= threshval to setval
* - if setval == threshval, no-op
*/
PIX *
pixThresholdToValue(PIX *pixd,
PIX *pixs,
l_int32 threshval,
l_int32 setval)
{
l_int32 w, h, d, wpld;
l_uint32 *datad;
PROCNAME("pixThresholdToValue");
if (!pixs)
return (PIX *)ERROR_PTR("pixs not defined", procName, pixd);
d = pixGetDepth(pixs);
if (d != 8 && d != 16 && d != 32)
return (PIX *)ERROR_PTR("pixs not 8, 16 or 32 bpp", procName, pixd);
if (pixd && (pixs != pixd))
return (PIX *)ERROR_PTR("pixd exists and is not pixs", procName, pixd);
if (threshval < 0 || setval < 0)
return (PIX *)ERROR_PTR("threshval & setval not < 0", procName, pixd);
if (d == 8 && setval > 255)
return (PIX *)ERROR_PTR("setval > 255 for 8 bpp", procName, pixd);
if (d == 16 && setval > 0xffff)
return (PIX *)ERROR_PTR("setval > 0xffff for 16 bpp", procName, pixd);
if (!pixd)
pixd = pixCopy(NULL, pixs);
if (setval == threshval) {
L_WARNING("setval == threshval; no operation", procName);
return pixd;
}
datad = pixGetData(pixd);
pixGetDimensions(pixd, &w, &h, NULL);
wpld = pixGetWpl(pixd);
thresholdToValueLow(datad, w, h, d, wpld, threshval, setval);
return pixd;
}
开发者ID:ansgri,项目名称:rsdt-students,代码行数:54,代码来源:pixarith.c
示例7: pixDilateGray3
/*!
* pixDilateGray3()
*
* Input: pixs (8 bpp, not cmapped)
* hsize (1 or 3)
* vsize (1 or 3)
* Return: pixd, or null on error
*
* Notes:
* (1) Special case for 1x3, 3x1 or 3x3 brick sel (all hits)
* (2) If hsize = vsize = 1, just returns a copy.
*/
PIX *
pixDilateGray3(PIX *pixs,
l_int32 hsize,
l_int32 vsize)
{
PIX *pixt, *pixb, *pixbd, *pixd;
PROCNAME("pixDilateGray3");
if (!pixs)
return (PIX *)ERROR_PTR("pixs not defined", procName, NULL);
if (pixGetDepth(pixs) != 8)
return (PIX *)ERROR_PTR("pixs not 8 bpp", procName, NULL);
if (pixGetColormap(pixs))
return (PIX *)ERROR_PTR("pix has colormap", procName, NULL);
if ((hsize != 1 && hsize != 3) ||
(vsize != 1 && vsize != 3))
return (PIX *)ERROR_PTR("invalid size: must be 1 or 3", procName, NULL);
if (hsize == 1 && vsize == 1)
return pixCopy(NULL, pixs);
pixb = pixAddBorderGeneral(pixs, 4, 8, 2, 8, 0);
if (vsize == 1)
pixbd = pixDilateGray3h(pixb);
else if (hsize == 1)
pixbd = pixDilateGray3v(pixb);
else { /* vize == hsize == 3 */
pixt = pixDilateGray3h(pixb);
pixbd = pixDilateGray3v(pixt);
pixDestroy(&pixt);
}
pixd = pixRemoveBorderGeneral(pixbd, 4, 8, 2, 8);
pixDestroy(&pixb);
pixDestroy(&pixbd);
return pixd;
}
开发者ID:ansgri,项目名称:rsdt-students,代码行数:51,代码来源:graymorph.c
示例8: pixRankFilterRGB
/*!
* pixRankFilterRGB()
*
* Input: pixs (32 bpp)
* wf, hf (width and height of filter; each is >= 1)
* rank (in [0.0 ... 1.0])
* Return: pixd (of rank values), or null on error
*
* Notes:
* (1) This defines, for each pixel in pixs, a neighborhood of
* pixels given by a rectangle "centered" on the pixel.
* This set of wf*hf pixels has a distribution of values.
* For each component, if the values are sorted in increasing
* order, we choose the component such that rank*(wf*hf-1)
* pixels have a lower or equal value and
* (1-rank)*(wf*hf-1) pixels have an equal or greater value.
* (2) Apply gray rank filtering to each component independently.
* (3) See notes in pixRankFilterGray() for further details.
*/
PIX *
pixRankFilterRGB(PIX *pixs,
l_int32 wf,
l_int32 hf,
l_float32 rank)
{
PIX *pixr, *pixg, *pixb, *pixrf, *pixgf, *pixbf, *pixd;
PROCNAME("pixRankFilterRGB");
if (!pixs)
return (PIX *)ERROR_PTR("pixs not defined", procName, NULL);
if (pixGetDepth(pixs) != 32)
return (PIX *)ERROR_PTR("pixs not 32 bpp", procName, NULL);
if (wf < 1 || hf < 1)
return (PIX *)ERROR_PTR("wf < 1 || hf < 1", procName, NULL);
if (rank < 0.0 || rank > 1.0)
return (PIX *)ERROR_PTR("rank must be in [0.0, 1.0]", procName, NULL);
if (wf == 1 && hf == 1) /* no-op */
return pixCopy(NULL, pixs);
pixr = pixGetRGBComponent(pixs, COLOR_RED);
pixg = pixGetRGBComponent(pixs, COLOR_GREEN);
pixb = pixGetRGBComponent(pixs, COLOR_BLUE);
pixrf = pixRankFilterGray(pixr, wf, hf, rank);
pixgf = pixRankFilterGray(pixg, wf, hf, rank);
pixbf = pixRankFilterGray(pixb, wf, hf, rank);
pixd = pixCreateRGBImage(pixrf, pixgf, pixbf);
pixDestroy(&pixr);
pixDestroy(&pixg);
pixDestroy(&pixb);
pixDestroy(&pixrf);
pixDestroy(&pixgf);
pixDestroy(&pixbf);
return pixd;
}
开发者ID:xmarston,项目名称:BillRecognizer,代码行数:57,代码来源:rank.c
示例9: pixRotate180
/*!
* pixRotate180()
*
* Input: pixd (<optional>; can be null, equal to pixs,
* or different from pixs)
* pixs (all depths)
* Return: pixd, or null on error
*
* Notes:
* (1) This does a 180 rotation of the image about the center,
* which is equivalent to a left-right flip about a vertical
* line through the image center, followed by a top-bottom
* flip about a horizontal line through the image center.
* (2) There are 3 cases for input:
* (a) pixd == null (creates a new pixd)
* (b) pixd == pixs (in-place operation)
* (c) pixd != pixs (existing pixd)
* (3) For clarity, use these three patterns, respectively:
* (a) pixd = pixRotate180(NULL, pixs);
* (b) pixRotate180(pixs, pixs);
* (c) pixRotate180(pixd, pixs);
*/
PIX *
pixRotate180(PIX *pixd,
PIX *pixs)
{
l_int32 d;
PROCNAME("pixRotate180");
if (!pixs)
return (PIX *)ERROR_PTR("pixs not defined", procName, NULL);
d = pixGetDepth(pixs);
if (d != 1 && d != 2 && d != 4 && d != 8 && d != 16 && d != 32)
return (PIX *)ERROR_PTR("pixs not in {1,2,4,8,16,32} bpp",
procName, NULL);
/* Prepare pixd for in-place operation */
if ((pixd = pixCopy(pixd, pixs)) == NULL)
return (PIX *)ERROR_PTR("pixd not made", procName, NULL);
pixFlipLR(pixd, pixd);
pixFlipTB(pixd, pixd);
return pixd;
}
开发者ID:0359xiaodong,项目名称:tess-two,代码行数:45,代码来源:rotateorth.c
示例10: PrepareDistortedPix
// Creates and returns a Pix distorted by various means according to the bool
// flags. If boxes is not nullptr, the boxes are resized/positioned according to
// any spatial distortion and also by the integer reduction factor box_scale
// so they will match what the network will output.
// Returns nullptr on error. The returned Pix must be pixDestroyed.
Pix* PrepareDistortedPix(const Pix* pix, bool perspective, bool invert,
bool white_noise, bool smooth_noise, bool blur,
int box_reduction, TRand* randomizer,
GenericVector<TBOX>* boxes) {
Pix* distorted = pixCopy(nullptr, const_cast<Pix*>(pix));
// Things to do to synthetic training data.
if (invert && randomizer->SignedRand(1.0) < 0)
pixInvert(distorted, distorted);
if ((white_noise || smooth_noise) && randomizer->SignedRand(1.0) > 0.0) {
// TODO(rays) Cook noise in a more thread-safe manner than rand().
// Attempt to make the sequences reproducible.
srand(randomizer->IntRand());
Pix* pixn = pixAddGaussianNoise(distorted, 8.0);
pixDestroy(&distorted);
if (smooth_noise) {
distorted = pixBlockconv(pixn, 1, 1);
pixDestroy(&pixn);
} else {
distorted = pixn;
}
}
if (blur && randomizer->SignedRand(1.0) > 0.0) {
Pix* blurred = pixBlockconv(distorted, 1, 1);
pixDestroy(&distorted);
distorted = blurred;
}
if (perspective)
GeneratePerspectiveDistortion(0, 0, randomizer, &distorted, boxes);
if (boxes != nullptr) {
for (int b = 0; b < boxes->size(); ++b) {
(*boxes)[b].scale(1.0f / box_reduction);
if ((*boxes)[b].width() <= 0)
(*boxes)[b].set_right((*boxes)[b].left() + 1);
}
}
return distorted;
}
开发者ID:dipthomas,项目名称:tesseract,代码行数:42,代码来源:degradeimage.cpp
示例11: main
main(int argc,
char **argv)
{
l_int32 error;
l_uint32 *data;
PIX *pix1, *pix2, *pix3, *pix1c, *pix2c, *pix1t, *pix2t, *pixd;
PIXA *pixa;
static char mainName[] = "pixmem_reg";
error = 0;
pixa = pixaCreate(0);
/* Copy with internal resizing: onto a cmapped image */
pix1 = pixRead("weasel4.16c.png");
pix2 = pixRead("feyn-fract.tif");
pix3 = pixRead("lucasta.150.jpg");
fprintf(stderr, "before copy 2 --> 3\n");
pixCopy(pix3, pix2);
Compare(pix2, pix3, &error);
pixSaveTiled(pix3, pixa, 4, 1, 30, 32);
fprintf(stderr, "before copy 3 --> 1\n");
pixCopy(pix1, pix3);
Compare(pix2, pix1, &error);
pixSaveTiled(pix1, pixa, 4, 0, 30, 32);
pixDestroy(&pix1);
pixDestroy(&pix2);
pixDestroy(&pix3);
/* Copy with internal resizing: from a cmapped image */
pix1 = pixRead("weasel4.16c.png");
pix2 = pixRead("feyn-fract.tif");
pix3 = pixRead("lucasta.150.jpg");
fprintf(stderr, "before copy 1 --> 2\n");
pixCopy(pix2, pix1);
Compare(pix2, pix1, &error);
pixSaveTiled(pix2, pixa, 1, 1, 30, 32);
fprintf(stderr, "before copy 2 --> 3\n");
pixCopy(pix3, pix2);
Compare(pix3, pix2, &error);
pixSaveTiled(pix3, pixa, 1, 0, 30, 32);
pixDestroy(&pix1);
pixDestroy(&pix2);
pixDestroy(&pix3);
/* Transfer of data pixs --> pixd, when pixs is not cloned.
* pixs is destroyed. */
pix1 = pixRead("weasel4.16c.png");
pix2 = pixRead("feyn-fract.tif");
pix3 = pixRead("lucasta.150.jpg");
pix1c = pixCopy(NULL, pix1);
fprintf(stderr, "before transfer 1 --> 2\n");
pixTransferAllData(pix2, &pix1, 0, 0);
Compare(pix2, pix1c, &error);
pixSaveTiled(pix2, pixa, 1, 1, 30, 32);
fprintf(stderr, "before transfer 2 --> 3\n");
pixTransferAllData(pix3, &pix2, 0, 0);
Compare(pix3, pix1c, &error);
pixSaveTiled(pix3, pixa, 1, 0, 30, 32);
pixDestroy(&pix1c);
pixDestroy(&pix3);
/* Another transfer of data pixs --> pixd, when pixs is not cloned.
* pixs is destroyed. */
pix1 = pixRead("weasel4.16c.png");
pix2 = pixRead("feyn-fract.tif");
pix3 = pixRead("lucasta.150.jpg");
pix1c = pixCopy(NULL, pix1);
pix2c = pixCopy(NULL, pix2);
fprintf(stderr, "before copy transfer 1 --> 2\n");
pixTransferAllData(pix2, &pix1c, 0, 0);
Compare(pix2, pix1, &error);
pixSaveTiled(pix2, pixa, 1, 0, 30, 32);
fprintf(stderr, "before copy transfer 2 --> 3\n");
pixTransferAllData(pix3, &pix2, 0, 0);
Compare(pix3, pix1, &error);
pixSaveTiled(pix3, pixa, 1, 0, 30, 32);
pixDestroy(&pix1);
pixDestroy(&pix2c);
pixDestroy(&pix3);
/* Transfer of data pixs --> pixd, when pixs is cloned.
* pixs has its refcount reduced by 1. */
pix1 = pixRead("weasel4.16c.png");
pix2 = pixRead("feyn-fract.tif");
pix3 = pixRead("lucasta.150.jpg");
pix1c = pixClone(pix1);
pix2c = pixClone(pix2);
fprintf(stderr, "before clone transfer 1 --> 2\n");
pixTransferAllData(pix2, &pix1c, 0, 0);
Compare(pix2, pix1, &error);
pixSaveTiled(pix2, pixa, 1, 0, 30, 32);
fprintf(stderr, "before clone transfer 2 --> 3\n");
pixTransferAllData(pix3, &pix2c, 0, 0);
Compare(pix3, pix1, &error);
pixSaveTiled(pix3, pixa, 1, 0, 30, 32);
pixDestroy(&pix1);
pixDestroy(&pix2);
pixDestroy(&pix3);
/* Extraction of data when pixs is not cloned, putting
//.........这里部分代码省略.........
开发者ID:0359xiaodong,项目名称:tess-two,代码行数:101,代码来源:pixmem_reg.c
示例12: main
//.........这里部分代码省略.........
}
/* Get the bounding boxes of the regions to be colored */
boxa = pixConnCompBB(pix10, 8);
/* Get a color to paint that is representative of the
* actual highlight color in the image. Scale each
* color component up from the average by an amount necessary
* to saturate the red. Then divide the green and
* blue components by 2.0. */
pixGetAverageMaskedRGB(pixs, pix7, 0, 0, 1, L_MEAN_ABSVAL,
&rval, &gval, &bval);
fract = 255.0 / rval;
irval = lept_roundftoi(fract * rval);
igval = lept_roundftoi(fract * gval / 2.0);
ibval = lept_roundftoi(fract * bval / 2.0);
fprintf(stderr, "(r,g,b) = (%d,%d,%d)\n", irval, igval, ibval);
/* Color the quantized gray version in the selected regions */
pix11 = pixColorGrayRegions(pix3, boxa, L_PAINT_DARK, 220, irval,
igval, ibval);
pixaAddPix(pixa, pix11, L_CLONE);
regTestWritePixAndCheck(rp, pix11, IFF_PNG); /* 9 */
pixDisplayWithTitle(pix11, 800, 600, "Final colored result", rp->display);
pixaAddPix(pixa, pixs, L_CLONE);
/* Test colorization on gray and cmapped gray */
pix12 = pixColorGrayRegions(pix2, boxa, L_PAINT_DARK, 220, 0, 255, 0);
pixaAddPix(pixa, pix12, L_CLONE);
regTestWritePixAndCheck(rp, pix12, IFF_PNG); /* 10 */
pixDisplayWithTitle(pix12, 900, 600, "Colorizing boxa gray", rp->display);
box = boxCreate(200, 200, 250, 350);
pix13 = pixCopy(NULL, pix2);
pixColorGray(pix13, box, L_PAINT_DARK, 220, 0, 0, 255);
pixaAddPix(pixa, pix13, L_CLONE);
regTestWritePixAndCheck(rp, pix13, IFF_PNG); /* 11 */
pixDisplayWithTitle(pix13, 1000, 600, "Colorizing box gray", rp->display);
pix14 = pixThresholdTo4bpp(pix2, 6, 1);
pix15 = pixColorGrayRegions(pix14, boxa, L_PAINT_DARK, 220, 0, 0, 255);
pixaAddPix(pixa, pix15, L_CLONE);
regTestWritePixAndCheck(rp, pix15, IFF_PNG); /* 12 */
pixDisplayWithTitle(pix15, 1100, 600, "Colorizing boxa cmap", rp->display);
pixColorGrayCmap(pix14, box, L_PAINT_DARK, 0, 255, 255);
pixaAddPix(pixa, pix14, L_CLONE);
regTestWritePixAndCheck(rp, pix14, IFF_PNG); /* 13 */
pixDisplayWithTitle(pix14, 1200, 600, "Colorizing box cmap", rp->display);
boxDestroy(&box);
/* Generate a pdf of the intermediate results */
lept_mkdir("lept");
L_INFO("Writing to /tmp/lept/colorize.pdf\n", rp->testname);
pixaConvertToPdf(pixa, 90, 1.0, 0, 0, "Colorizing highlighted text",
"/tmp/lept/colorize.pdf");
pixaDestroy(&pixa);
fpixDestroy(&fpix);
boxDestroy(&box);
boxaDestroy(&boxa);
pixDestroy(&pixs);
pixDestroy(&pix1);
pixDestroy(&pix2);
pixDestroy(&pix3);
开发者ID:vkbrad,项目名称:AndroidOCR,代码行数:67,代码来源:colorize_reg.c
示例13: pixGrayMorphSequence
//.........这里部分代码省略.........
/* fprintf(stderr, "op = %s; w = %d, h = %d\n", op, w, h); */
break;
case 't':
case 'T':
if (op[1] != 'w' && op[1] != 'W' &&
op[1] != 'b' && op[1] != 'B') {
fprintf(stderr,
"*** op = %s; arg %c must be 'w' or 'b'\n", op, op[1]);
valid = FALSE;
break;
}
sscanf(&op[2], "%d.%d", &w, &h);
if (w < 1 || (w & 1) == 0 || h < 1 || (h & 1) == 0 ) {
fprintf(stderr,
"*** op: %s; w = %d, h = %d; must both be odd\n",
op, w, h);
valid = FALSE;
break;
}
/* fprintf(stderr, "op = %s", op); */
break;
default:
fprintf(stderr, "*** nonexistent op = %s\n", op);
valid = FALSE;
}
FREE(op);
}
if (!valid) {
sarrayDestroy(&sa);
return (PIX *)ERROR_PTR("sequence invalid", procName, NULL);
}
/* Parse and operate */
pixt1 = pixCopy(NULL, pixs);
pixt2 = NULL;
x = 0;
for (i = 0; i < nops; i++) {
rawop = sarrayGetString(sa, i, 0);
op = stringRemoveChars(rawop, " \n\t");
switch (op[0])
{
case 'd':
case 'D':
sscanf(&op[1], "%d.%d", &w, &h);
pixt2 = pixDilateGray(pixt1, w, h);
pixDestroy(&pixt1);
pixt1 = pixClone(pixt2);
pixDestroy(&pixt2);
if (dispsep > 0) {
pixDisplay(pixt1, x, dispy);
x += dispsep;
}
break;
case 'e':
case 'E':
sscanf(&op[1], "%d.%d", &w, &h);
pixt2 = pixErodeGray(pixt1, w, h);
pixDestroy(&pixt1);
pixt1 = pixClone(pixt2);
pixDestroy(&pixt2);
if (dispsep > 0) {
pixDisplay(pixt1, x, dispy);
x += dispsep;
}
break;
case 'o':
开发者ID:ONLYOFFICE,项目名称:core,代码行数:67,代码来源:morphseq.cpp
示例14: main
int main(int argc,
char **argv)
{
char *filein, *fileout;
l_int32 i, w, h, liney, linex, same;
l_float32 angle, deg2rad;
PIX *pixt1, *pixt2, *pixs, *pixd;
static char mainName[] = "sheartest";
if (argc != 4)
return ERROR_INT(" Syntax: sheartest filein angle fileout",
mainName, 1);
/* Compare in-place H shear with H shear to a new pix */
pixt1 = pixRead("marge.jpg");
pixGetDimensions(pixt1, &w, &h, NULL);
pixt2 = pixHShear(NULL, pixt1, (l_int32)(0.3 * h), 0.17, L_BRING_IN_WHITE);
pixHShearIP(pixt1, (l_int32)(0.3 * h), 0.17, L_BRING_IN_WHITE);
pixEqual(pixt1, pixt2, &same);
if (same)
fprintf(stderr, "Correct for H shear\n");
else
fprintf(stderr, "Error for H shear\n");
pixDestroy(&pixt1);
pixDestroy(&pixt2);
/* Compare in-place V shear with V shear to a new pix */
pixt1 = pixRead("marge.jpg");
pixGetDimensions(pixt1, &w, &h, NULL);
pixt2 = pixVShear(NULL, pixt1, (l_int32)(0.3 * w), 0.17, L_BRING_IN_WHITE);
pixVShearIP(pixt1, (l_int32)(0.3 * w), 0.17, L_BRING_IN_WHITE);
pixEqual(pixt1, pixt2, &same);
if (same)
fprintf(stderr, "Correct for V shear\n");
else
fprintf(stderr, "Error for V shear\n");
pixDestroy(&pixt1);
pixDestroy(&pixt2);
filein = argv[1];
angle = atof(argv[2]);
fileout = argv[3];
deg2rad = 3.1415926535 / 180.;
if ((pixs = pixRead(filein)) == NULL)
return ERROR_INT("pix not made", mainName, 1);
pixGetDimensions(pixs, &w, &h, NULL);
#if 0
/* Select an operation from this list ...
* ------------------------------------------
pixd = pixHShear(NULL, pixs, liney, deg2rad * angle, L_BRING_IN_WHITE);
pixd = pixVShear(NULL, pixs, linex, deg2rad * angle, L_BRING_IN_WHITE);
pixd = pixHShearCorner(NULL, pixs, deg2rad * angle, L_BRING_IN_WHITE);
pixd = pixVShearCorner(NULL, pixs, deg2rad * angle, L_BRING_IN_WHITE);
pixd = pixHShearCenter(NULL, pixs, deg2rad * angle, L_BRING_IN_WHITE);
pixd = pixVShearCenter(NULL, pixs, deg2rad * angle, L_BRING_IN_WHITE);
pixHShearIP(pixs, liney, deg2rad * angle, L_BRING_IN_WHITE); pixd = pixs;
pixVShearIP(pixs, linex, deg2rad * angle, L_BRING_IN_WHITE); pixd = pixs;
pixRasteropHip(pixs, 0, h/3, -50, L_BRING_IN_WHITE); pixd = pixs;
pixRasteropVip(pixs, 0, w/3, -50, L_BRING_IN_WHITE); pixd = pixs;
* ------------------------------------------
* ... and use it in the following: */
pixd = pixHShear(NULL, pixs, liney, deg2rad * angle, L_BRING_IN_WHITE);
pixWrite(fileout, pixd, IFF_PNG);
pixDisplay(pixd, 50, 50);
pixDestroy(&pixd);
#endif
#if 0
/* Do a horizontal shear about a line */
for (i = 0; i < NTIMES; i++) {
liney = i * h / (NTIMES - 1);
if (liney >= h)
liney = h - 1;
pixd = pixHShear(NULL, pixs, liney, deg2rad * angle, L_BRING_IN_WHITE);
pixDisplay(pixd, 50 + 10 * i, 50 + 10 * i);
pixDestroy(&pixd);
}
#endif
#if 0
/* Do a vertical shear about a line */
for (i = 0; i < NTIMES; i++) {
linex = i * w / (NTIMES - 1);
if (linex >= w)
linex = w - 1;
pixd = pixVShear(NULL, pixs, linex, deg2rad * angle, L_BRING_IN_WHITE);
pixDisplay(pixd, 50 + 10 * i, 50 + 10 * i);
pixDestroy(&pixd);
}
#endif
#if 0
/* Do a horizontal in-place shear about a line */
pixSetPadBits(pixs, 0);
for (i = 0; i < NTIMES; i++) {
pixd = pixCopy(NULL, pixs);
liney = i * h / (NTIMES - 1);
//.........这里部分代码省略.........
开发者ID:0ximDigital,项目名称:appsScanner,代码行数:101,代码来源:sheartest.c
示例15: pixThinGeneral
/*!
* pixThinGeneral()
*
* Input: pixs (1 bpp)
* type (L_THIN_FG, L_THIN_BG)
* sela (of Sels for parallel composite HMTs)
* maxiters (max number of iters allowed; use 0 to iterate
* until completion)
* Return: pixd, or null on error
*
* Notes:
* (1) See notes in pixThin(). That function chooses among
* the best of the Sels for thinning.
* (2) This is a general function that takes a Sela of HMTs
* that are used in parallel for thinning from each
* of four directions. One iteration consists of four
* such parallel thins.
*/
PIX *
pixThinGeneral(PIX *pixs,
l_int32 type,
SELA *sela,
l_int32 maxiters)
{
l_int32 i, j, r, nsels, same;
PIXA *pixahmt;
PIX **pixhmt; /* array owned by pixahmt; do not destroy! */
PIX *pixd, *pixt;
SEL *sel, *selr;
PROCNAME("pixThinGeneral");
if (!pixs)
return (PIX *)ERROR_PTR("pixs not defined", procName, NULL);
if (pixGetDepth(pixs) != 1)
return (PIX *)ERROR_PTR("pixs not 1 bpp", procName, NULL);
if (type != L_THIN_FG && type != L_THIN_BG)
return (PIX *)ERROR_PTR("invalid fg/bg type", procName, NULL);
if (!sela)
return (PIX *)ERROR_PTR("sela not defined", procName, NULL);
if (maxiters == 0) maxiters = 10000;
/* Set up array of temp pix to hold hmts */
nsels = selaGetCount(sela);
pixahmt = pixaCreate(nsels);
for (i = 0; i < nsels; i++) {
pixt = pixCreateTemplate(pixs);
pixaAddPix(pixahmt, pixt, L_INSERT);
}
pixhmt = pixaGetPixArray(pixahmt);
if (!pixhmt)
return (PIX *)ERROR_PTR("pixhmt array not made", procName, NULL);
#if DEBUG_SELS
pixt = selaDisplayInPix(sela, 35, 3, 15, 4);
pixDisplayWithTitle(pixt, 100, 100, "allsels", 1);
pixDestroy(&pixt);
#endif /* DEBUG_SELS */
/* Set up initial image for fg thinning */
if (type == L_THIN_FG)
pixd = pixCopy(NULL, pixs);
else /* bg thinning */
pixd = pixInvert(NULL, pixs);
/* Thin the fg, with up to maxiters iterations */
for (i = 0; i < maxiters; i++) {
pixt = pixCopy(NULL, pixd); /* test for completion */
for (r = 0; r < 4; r++) { /* over 90 degree rotations of Sels */
for (j = 0; j < nsels; j++) { /* over individual sels in sela */
sel = selaGetSel(sela, j); /* not a copy */
selr = selRotateOrth(sel, r);
pixHMT(pixhmt[j], pixd, selr);
selDestroy(&selr);
if (j > 0)
pixOr(pixhmt[0], pixhmt[0], pixhmt[j]); /* accum result */
}
pixSubtract(pixd, pixd, pixhmt[0]); /* remove result */
}
pixEqual(pixd, pixt, &same);
pixDestroy(&pixt);
if (same) {
L_INFO("%d iterations to completion\n", procName, i);
break;
}
}
if (type == L_THIN_BG)
pixInvert(pixd, pixd);
pixaDestroy(&pixahmt);
return pixd;
}
开发者ID:xmarston,项目名称:BillRecognizer,代码行数:93,代码来源:ccthin.c
示例16: pixMorphCompSequenceDwa
/*!
* pixMorphCompSequenceDwa()
*
* Input: pixs
* sequence (string specifying sequence)
* dispsep (horizontal separation in pixels between
* successive displays; use zero to suppress display)
* Return: pixd, or null on error
*
* Notes:
* (1) This does dwa morphology on binary images, using brick Sels.
* (2) This runs a pipeline of operations; no branching is allowed.
* (3) It implements all brick Sels that have dimensions up to 63
* on each side, using a composite (linear + comb) when useful.
* (4) A new image is always produced; the input image is not changed.
* (5) This contains an interpreter, allowing sequences to be
* generated and run.
* (6) See pixMorphSequence() for further information about usage.
*/
PIX *
pixMorphCompSequenceDwa(PIX *pixs,
const char *sequence,
l_int32 dispsep)
{
char *rawop, *op;
l_int32 nops, i, j, nred, fact, w, h, x, y, border;
l_int32 level[4];
PIX *pixt1, *pixt2;
SARRAY *sa;
PROCNAME("pixMorphCompSequenceDwa");
if (!pixs)
return (PIX *)ERROR_PTR("pixs not defined", procName, NULL);
if (!sequence)
return (PIX *)ERROR_PTR("sequence not defined", procName, NULL);
/* Split sequence into individual operations */
sa = sarrayCreate(0);
sarraySplitString(sa, sequence, "+");
nops = sarrayGetCount(sa);
if (!morphSequenceVerify(sa)) {
sarrayDestroy(&sa);
return (PIX *)ERROR_PTR("sequence not valid", procName, NULL);
}
/* Parse and operate */
border = 0;
pixt1 = pixCopy(NULL, pixs);
pixt2 = NULL;
x = y = 0;
for (i = 0; i < nops; i++) {
rawop = sarrayGetString(sa, i, 0);
op = stringRemoveChars(rawop, " \n\t");
switch (op[0])
{
case 'd':
case 'D':
sscanf(&op[1], "%d.%d", &w, &h);
pixt2 = pixDilateCompBrickDwa(NULL, pixt1, w, h);
pixDestroy(&pixt1);
pixt1 = pixClone(pixt2);
pixDestroy(&pixt2);
if (dispsep > 0) {
pixDisplay(pixt1, x, y);
x += dispsep;
}
break;
case 'e':
case 'E':
sscanf(&op[1], "%d.%d", &w, &h);
pixt2 = pixErodeCompBrickDwa(NULL, pixt1, w, h);
pixDestroy(&pixt1);
pixt1 = pixClone(pixt2);
pixDestroy(&pixt2);
if (dispsep > 0) {
pixDisplay(pixt1, x, y);
x += dispsep;
}
break;
case 'o':
case 'O':
sscanf(&op[1], "%d.%d", &w, &h);
pixOpenCompBrickDwa(pixt1, pixt1, w, h);
if (dispsep > 0) {
pixDisplay(pixt1, x, y);
x += dispsep;
}
break;
case 'c':
case 'C':
sscanf(&op[1], "%d.%d", &w, &h);
pixCloseCompBrickDwa(pixt1, pixt1, w, h);
if (dispsep > 0) {
pixDisplay(pixt1, x, y);
x += dispsep;
}
break;
case 'r':
//.........这里部分代码省略.........
开发者ID:ONLYOFFICE,项目名称:core,代码行数:101,代码来源:morphseq.cpp
示例17: pixConnCompPixa
/*!
* \brief pixConnCompPixa()
*
* \param[in] pixs 1 bpp
* \param[out] ppixa pixa of each c.c.
* \param[in] connectivity 4 or 8
* \return boxa, or NULL on error
*
* <pre>
* 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.
* </pre>
*/
BOXA *
pixConnCompPixa(PIX *pixs,
PIXA **ppixa,
l_int32 connectivity)
{
l_int32 h, iszero;
l_int32 x, y, xstart, ystart;
PIX *pix1, *pix2, *pix3, *pix4;
PIXA *pixa;
BOX *box;
BOXA *boxa;
L_STACK *stack, *auxstack;
PROCNAME("pixConnCompPixa");
if (!ppixa)
return (BOXA *)ERROR_PTR("&pixa not defined", procName, NULL);
*ppixa = NULL;
if (!pixs || pixGetDepth(pixs) != 1)
return (BOXA *)ERROR_PTR("pixs undefined or not 1 bpp", procName, NULL);
if (connectivity != 4 && connectivity != 8)
return (BOXA *)ERROR_PTR("connectivity not 4 or 8", procName, NULL);
boxa = NULL;
pix1 = pix2 = pix3 = pix4 = NULL;
stack = NULL;
pixZero(pixs, &iszero);
if (iszero)
return boxaCreate(1); /* return empty boxa */
pix1 = pixCopy(NULL, pixs);
pix2 = pixCopy(NULL, pixs);
if (!pix1 || !pix2) {
L_ERROR("pix1 or pix2 not made\n", procName);
goto cleanup;
}
h = pixGetHeight(pixs);
if ((stack = lstackCreate(h)) == NULL) {
L_ERROR("stack not made\n", procName);
goto cleanup;
}
auxstack = lstackCreate(0);
stack->auxstack = auxstack;
pixa = pixaCreate(0);
boxa = boxaCreate(0);
xstart = 0;
ystart = 0;
while (1) {
if (!nextOnPixelInRaster(pix1, xstart, ystart, &x, &y))
break;
if ((box = pixSeedfillBB(pix1, stack, x, y, connectivity)) == NULL) {
L_ERROR("box not made\n", procName);
pixaDestroy(&pixa);
boxaDestroy(&boxa);
goto cleanup;
}
boxaAddBox(boxa, box, L_INSERT);
/* Save the c.c. and remove from pix2 as well */
pix3 = pixClipRectangle(pix1, box, NULL);
pix4 = pixClipRectangle(pix2, box, NULL);
pixXor(pix3, pix3, pix4);
pixRasterop(pix2, box->x, box->y, box->w, box->h, PIX_SRC ^ PIX_DST,
pix3, 0, 0);
pixaAddPix(pixa, pix3, L_INSERT);
pixDestroy(&pix4);
xstart = x;
ystart = y;
}
#if DEBUG
pixCountPixels(pix1, &iszero, NULL);
//.........这里部分代码省略.........
开发者ID:DanBloomberg,项目名称:leptonica,代码行数:101,代码来源:conncomp.c
示例18: ASSERT_HOST
// Top-level method to perform splitting based on current settings.
// Returns true if a split was actually performed.
// split_for_pageseg should be true if the splitting is being done prior to
// page segmentation. This mode uses the flag
// pageseg_devanagari_split_strategy to determine the splitting strategy.
bool ShiroRekhaSplitter::Split(bool split_for_pageseg) {
SplitStrategy split_strategy = split_for_pageseg ? pageseg_split_strategy_ :
ocr_split_strategy_;
if (split_strategy == NO_SPLIT) {
return false; // Nothing to do.
}
ASSERT_HOST(split_strategy == MINIMAL_SPLIT ||
split_strategy == MAXIMAL_SPLIT);
ASSERT_HOST(orig_pix_);
if (devanagari_split_debuglevel > 0) {
tprintf("Splitting shiro-rekha ...\n");
tprintf("Split strategy = %s\n",
split_strategy == MINIMAL_SPLIT ? "Minimal" : "Maximal");
tprintf("Initial pageseg available = %s\n",
segmentation_block_list_ ? "yes" : "no");
}
// Create a copy of original image to store the splitting output.
pixDestroy(&splitted_image_);
splitted_image_ = pixCopy(NULL, orig_pix_);
// Initialize debug image if required.
if (devanagari_split_debugimage) {
pixDestroy(&debug_image_);
debug_image_ = pixConvertTo32(orig_pix_);
}
// Determine all connected components in the input im
|
请发表评论