Ejemplo n.º 1
0
main(int    argc,
     char **argv)
{
l_int32      h;
l_float32    scalefactor;
BOX         *box;
BOXA        *boxa1, *boxa2;
BOXAA       *baa;
PIX         *pix1, *pix2, *pix3, *pix4, *pix5, *pix6, *pix7, *pix8, *pix9;
L_REGPARAMS  *rp;

    if (regTestSetup(argc, argv, &rp))
        return 1;

    lept_rmdir("segtest");
    lept_mkdir("segtest");
    baa = boxaaCreate(5);

        /* Image region input.  */
    pix1 = pixRead("wet-day.jpg");
    pix2 = pixScaleToSize(pix1, WIDTH, 0);
    pixWrite("/tmp/segtest/0.jpg", pix2, IFF_JFIF_JPEG);
    regTestCheckFile(rp, "/tmp/segtest/0.jpg");   /* 0 */
    box = boxCreate(105, 161, 620, 872);   /* image region */
    boxa1 = boxaCreate(1);
    boxaAddBox(boxa1, box, L_INSERT);
    boxaaAddBoxa(baa, boxa1, L_INSERT);
    pixDestroy(&pix1);
    pixDestroy(&pix2);

        /* Compute image region at w = 2 * WIDTH */
    pix1 = pixRead("candelabrum-11.jpg");
    pix2 = pixScaleToSize(pix1, WIDTH, 0);
    pix3 = pixConvertTo1(pix2, 100);
    pix4 = pixExpandBinaryPower2(pix3, 2);  /* w = 2 * WIDTH */
    pix5 = pixGenHalftoneMask(pix4, NULL, NULL, 1);
    pix6 = pixMorphSequence(pix5, "c20.1 + c1.20", 0);
    pix7 = pixMaskConnComp(pix6, 8, &boxa1);
    pix8 = pixReduceBinary2(pix7, NULL);  /* back to w = WIDTH */
    pix9 = pixBackgroundNormSimple(pix2, pix8, NULL);
    pixWrite("/tmp/segtest/1.jpg", pix9, IFF_JFIF_JPEG);
    regTestCheckFile(rp, "/tmp/segtest/1.jpg");   /* 1 */
    boxa2 = boxaTransform(boxa1, 0, 0, 0.5, 0.5);  /* back to w = WIDTH */
    boxaaAddBoxa(baa, boxa2, L_INSERT);
    pixDestroy(&pix1);
    pixDestroy(&pix2);
    pixDestroy(&pix3);
    pixDestroy(&pix4);
    pixDestroy(&pix5);
    pixDestroy(&pix6);
    pixDestroy(&pix7);
    pixDestroy(&pix8);
    pixDestroy(&pix9);
    boxaDestroy(&boxa1);

        /* Use mask to find image region */
    pix1 = pixRead("lion-page.00016.jpg");
    pix2 = pixScaleToSize(pix1, WIDTH, 0);
    pixWrite("/tmp/segtest/2.jpg", pix2, IFF_JFIF_JPEG);
    regTestCheckFile(rp, "/tmp/segtest/2.jpg");   /* 2 */
    pix3 = pixRead("lion-mask.00016.tif");
    pix4 = pixScaleToSize(pix3, WIDTH, 0);
    boxa1 = pixConnComp(pix4, NULL, 8);
    boxaaAddBoxa(baa, boxa1, L_INSERT);
    pixDestroy(&pix1);
    pixDestroy(&pix2);
    pixDestroy(&pix3);
    pixDestroy(&pix4);

        /* Compute image region at full res */
    pix1 = pixRead("rabi.png");
    scalefactor = (l_float32)WIDTH / (l_float32)pixGetWidth(pix1);
    pix2 = pixScaleToGray(pix1, scalefactor);
    pixWrite("/tmp/segtest/3.jpg", pix2, IFF_JFIF_JPEG);
    regTestCheckFile(rp, "/tmp/segtest/3.jpg");   /* 3 */
    pix3 = pixGenHalftoneMask(pix1, NULL, NULL, 0);
    pix4 = pixMorphSequence(pix3, "c20.1 + c1.20", 0);
    boxa1 = pixConnComp(pix4, NULL, 8);
    boxa2 = boxaTransform(boxa1, 0, 0, scalefactor, scalefactor);
    boxaaAddBoxa(baa, boxa2, L_INSERT);
    pixDestroy(&pix1);
    pixDestroy(&pix2);
    pixDestroy(&pix3);
    pixDestroy(&pix4);
    boxaDestroy(&boxa1);

        /* Page with no image regions */
    pix1 = pixRead("lucasta-47.jpg");
    pix2 = pixScaleToSize(pix1, WIDTH, 0);
    boxa1 = boxaCreate(1);
    pixWrite("/tmp/segtest/4.jpg", pix2, IFF_JFIF_JPEG);
    regTestCheckFile(rp, "/tmp/segtest/4.jpg");   /* 4 */
    boxaaAddBoxa(baa, boxa1, L_INSERT);
    pixDestroy(&pix1);
    pixDestroy(&pix2);

        /* Page that is all image */
    pix1 = pixRead("map1.jpg");
    pix2 = pixScaleToSize(pix1, WIDTH, 0);
    pixWrite("/tmp/segtest/5.jpg", pix2, IFF_JFIF_JPEG);
    regTestCheckFile(rp, "/tmp/segtest/5.jpg");   /* 5 */
    h = pixGetHeight(pix2);
    box = boxCreate(0, 0, WIDTH, h);
    boxa1 = boxaCreate(1);
    boxaAddBox(boxa1, box, L_INSERT);
    boxaaAddBoxa(baa, boxa1, L_INSERT);
    pixDestroy(&pix1);
    pixDestroy(&pix2);

        /* Save the boxaa file */
    boxaaWrite("/tmp/segtest/seg.baa", baa);
    regTestCheckFile(rp, "/tmp/segtest/seg.baa");   /* 6 */

        /* Do the conversion */
    l_pdfSetDateAndVersion(FALSE);
    convertSegmentedFilesToPdf("/tmp/segtest", ".jpg", 100, L_G4_ENCODE,
                               140, baa, 75, 0.6, "Segmentation Test",
                               "/tmp/pdfseg.7.pdf");
    regTestCheckFile(rp, "/tmp/pdfseg.7.pdf");   /* 7 */

    boxaaDestroy(&baa);
    return regTestCleanup(rp);
}
Ejemplo n.º 2
0
//---------------------------------------------------------------------------
//Уменьшение в 2 раза
//Поиск угла
//Предварительное выпрямление
//Эрозия для удаления тонких линий
//Поиск box для обрезки белых полей изображения
//Обрезка предварительно выпрямленного изображения
//Получение трёх изображений:
//------------------------------------------------------------------------------
PIX* LeptPrepareFile::getClearImage(PIX *pix, l_float32 *angle, l_float32 *conf)
{
	PIX        *pixReduce2, *pixDeskew, *pixCrop, *pixErode;
	PIXA       *pixa1, *pixa2;
	l_int32	   result;
	l_float32  _angle, _conf;
	l_int32    XC_crop, YC_crop, XC_old, YC_old, XC_new, YC_new;


		LEP_LOG("enter");
	SetNULL(7, (void **)&pixReduce2, &pixDeskew, &pixCrop, &pixErode, &pixa1, &pixa2, &boxFirstCrop);
	SetNULL(2, (void **)angle, conf);
	try
	{
		LEP_STR_THROW(!pix, "Изображение не найдено");
		//Уменьшение в 2 раза для ускорения (при DPI = 600)
	if ((pix->xres == 600) && (pix->yres == 600))                 //В дальнейшем переработать потому как в текущем варианте обрабатывает корректно только DPI300 и DPI600
		pixReduce2 = pixReduceBinary2(pix, NULL);
	else
	{
		pixReduce2 = pixCreateTemplateNoInit(pix);
		LEP_STR_THROW(!pixReduce2, "Ошибка в pixReduceBinary2");

		pixCopy(pixReduce2, pix);
	}

		LEP_STR_THROW(!pixReduce2, "Ошибка в pixReduceBinary2");
		//Поиск угла наклона
	result = pixFindSkewSweepAndSearch(pixReduce2, &_angle, &_conf,
						4,    //линеное уменьшение,  DEFAULT_SWEEP_REDUCTION = 4
						2,    //бинарное уменьшение, DEFAULT_BS_REDUCTION = 2
						10,   //максимальный угол поиска
				    		0.1,  //дельта угла поиска
						0.01);//конечная дельта угла поиска, DEFAULT_MINBS_DELTA = 0.01
		LEP_STR_THROW(result != 0, "Ошибка поиска угла");
	if (angle) *angle = _angle;
	if (conf) *conf = _conf;
		//Предварительное выпрямление
	pixDeskew = pixRotate(pixReduce2, 3.1415926535 / 180. * _angle, L_ROTATE_AREA_MAP, L_BRING_IN_WHITE, 0, 0);
		LEP_STR_THROW(!pixDeskew, "Ошибка при предварительном повороте изображения");
		//Эрозия для удаления тонких линий
	pixErode = pixCreateTemplateNoInit(pixDeskew);
		LEP_STR_THROW(!pixErode, "Ошибка в pixCreateTemplateNoInit");
	pixCopy(pixErode, pixDeskew);
	pixErodeBrick(pixErode, pixErode, 3, 3);
		//pixWrite("c:\\temp0_0.tif", pixErode, IFF_TIFF_ZIP);
		//Поиск box для обрезки белых полей изображения
	result = pixClipBoxToForeground(pixErode, NULL, NULL, &boxFirstCrop);
		LEP_STR_THROW(result != 0, "Ошибка при поиске обрезки изображения");
		//Получение точки вокруг которой происходило вращение, с учётом обрезки
		XC_old = pixErode->w / 2;      //точка вращения старого изображения на старом изображении
		YC_old = pixErode->h / 2;
		XC_new = boxFirstCrop->w / 2;       //точка вращения нового изображения на новом изображении
		YC_new = boxFirstCrop->h / 2;
		XC_crop = boxFirstCrop->x + XC_new; //точка вращения нового изображения на старом изображении
		YC_crop = boxFirstCrop->y + YC_new;
		centerXRotate = XC_new - (XC_crop - XC_old);   //точка вращения старого изображения на новом изображении
		centerYRotate = YC_new - (YC_crop - YC_old);
		//Обрезка предварительно выпрямленного изображения
	pixCrop = pixClipRectangle(pixDeskew, boxFirstCrop, NULL);
		LEP_STR_THROW(!pixCrop, "Ошибка при обрезке изображения");
		//pixWrite("c:\\pixCrop.tif", pixCrop, IFF_TIFF_ZIP);
	}catch (string error)
	{
		LEP_ERROR(error);
	};

	pixDestroy(&pixReduce2);
	pixDestroy(&pixDeskew);
	pixDestroy(&pixErode);
		LEP_LOG("exit");
	return pixCrop;

}