225l_int32 i, j, r, nsels, same;
228PIX *pix1, *pix2, *pixd;
232 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
233 if (pixGetDepth(pixs) != 1)
234 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", __func__, NULL);
236 return (
PIX *)ERROR_PTR(
"invalid fg/bg type", __func__, NULL);
238 return (
PIX *)ERROR_PTR(
"sela not defined", __func__, NULL);
239 if (maxiters == 0) maxiters = 10000;
242 nsels = selaGetCount(sela);
243 pixahmt = pixaCreate(nsels);
244 for (i = 0; i < nsels; i++) {
245 pix1 = pixCreateTemplate(pixs);
246 pixaAddPix(pixahmt, pix1,
L_INSERT);
248 pixhmt = pixaGetPixArray(pixahmt);
250 pixaDestroy(&pixahmt);
251 return (
PIX *)ERROR_PTR(
"pixhmt array not made", __func__, NULL);
256 pixd = pixCopy(NULL, pixs);
258 pixd = pixInvert(NULL, pixs);
261 for (i = 0; i < maxiters; i++) {
262 pix1 = pixCopy(NULL, pixd);
263 for (r = 0; r < 4; r++) {
264 for (j = 0; j < nsels; j++) {
265 sel = selaGetSel(sela, j);
266 selr = selRotateOrth(sel, r);
267 pixHMT(pixhmt[j], pixd, selr);
270 pixOr(pixhmt[0], pixhmt[0], pixhmt[j]);
272 pixSubtract(pixd, pixd, pixhmt[0]);
274 pixEqual(pixd, pix1, &same);
296 pixInvert(pixd, pixd);
297 pix1 = pixSubtract(NULL, pixd, pixs);
298 pix2 = pixExtractBorderConnComps(pix1, 4);
299 pixSubtract(pixd, pixd, pix2);
304 pixaDestroy(&pixahmt);
343SELA *sela1, *sela2, *sela3;
345 if (index < 1 || index > 11)
346 return (
SELA *)ERROR_PTR(
"invalid index", __func__, NULL);
348 sela2 = selaCreate(4);
352 sela1 = sela4ccThin(NULL);
353 selaFindSelByName(sela1,
"sel_4_1", NULL, &sel);
354 selaAddSel(sela2, sel, NULL,
L_COPY);
355 selaFindSelByName(sela1,
"sel_4_2", NULL, &sel);
356 selaAddSel(sela2, sel, NULL,
L_COPY);
357 selaFindSelByName(sela1,
"sel_4_3", NULL, &sel);
358 selaAddSel(sela2, sel, NULL,
L_COPY);
361 sela1 = sela4ccThin(NULL);
362 selaFindSelByName(sela1,
"sel_4_1", NULL, &sel);
363 selaAddSel(sela2, sel, NULL,
L_COPY);
364 selaFindSelByName(sela1,
"sel_4_5", NULL, &sel);
365 selaAddSel(sela2, sel, NULL,
L_COPY);
366 selaFindSelByName(sela1,
"sel_4_6", NULL, &sel);
367 selaAddSel(sela2, sel, NULL,
L_COPY);
370 sela1 = sela4ccThin(NULL);
371 selaFindSelByName(sela1,
"sel_4_1", NULL, &sel);
372 selaAddSel(sela2, sel, NULL,
L_COPY);
373 selaFindSelByName(sela1,
"sel_4_7", NULL, &sel);
374 selaAddSel(sela2, sel, NULL,
L_COPY);
375 sel = selRotateOrth(sel, 1);
376 selaAddSel(sela2, sel,
"sel_4_7_rot",
L_INSERT);
379 sela1 = sela4and8ccThin(NULL);
380 selaFindSelByName(sela1,
"sel_48_1", NULL, &sel);
381 selaAddSel(sela2, sel, NULL,
L_COPY);
382 sel = selRotateOrth(sel, 1);
383 selaAddSel(sela2, sel,
"sel_48_1_rot",
L_INSERT);
384 selaFindSelByName(sela1,
"sel_48_2", NULL, &sel);
385 selaAddSel(sela2, sel, NULL,
L_COPY);
388 sela1 = sela8ccThin(NULL);
389 selaFindSelByName(sela1,
"sel_8_2", NULL, &sel);
390 selaAddSel(sela2, sel, NULL,
L_COPY);
391 selaFindSelByName(sela1,
"sel_8_3", NULL, &sel);
392 selaAddSel(sela2, sel, NULL,
L_COPY);
393 selaFindSelByName(sela1,
"sel_8_5", NULL, &sel);
394 selaAddSel(sela2, sel, NULL,
L_COPY);
395 selaFindSelByName(sela1,
"sel_8_6", NULL, &sel);
396 selaAddSel(sela2, sel, NULL,
L_COPY);
399 sela1 = sela8ccThin(NULL);
400 sela3 = sela4and8ccThin(NULL);
401 selaFindSelByName(sela1,
"sel_8_2", NULL, &sel);
402 selaAddSel(sela2, sel, NULL,
L_COPY);
403 selaFindSelByName(sela1,
"sel_8_3", NULL, &sel);
404 selaAddSel(sela2, sel, NULL,
L_COPY);
405 selaFindSelByName(sela3,
"sel_48_2", NULL, &sel);
406 selaAddSel(sela2, sel, NULL,
L_COPY);
410 sela1 = sela8ccThin(NULL);
411 selaFindSelByName(sela1,
"sel_8_1", NULL, &sel);
412 selaAddSel(sela2, sel, NULL,
L_COPY);
413 selaFindSelByName(sela1,
"sel_8_5", NULL, &sel);
414 selaAddSel(sela2, sel, NULL,
L_COPY);
415 selaFindSelByName(sela1,
"sel_8_6", NULL, &sel);
416 selaAddSel(sela2, sel, NULL,
L_COPY);
419 sela1 = sela8ccThin(NULL);
420 selaFindSelByName(sela1,
"sel_8_2", NULL, &sel);
421 selaAddSel(sela2, sel, NULL,
L_COPY);
422 selaFindSelByName(sela1,
"sel_8_3", NULL, &sel);
423 selaAddSel(sela2, sel, NULL,
L_COPY);
424 selaFindSelByName(sela1,
"sel_8_8", NULL, &sel);
425 selaAddSel(sela2, sel, NULL,
L_COPY);
426 selaFindSelByName(sela1,
"sel_8_9", NULL, &sel);
427 selaAddSel(sela2, sel, NULL,
L_COPY);
430 sela1 = sela8ccThin(NULL);
431 selaFindSelByName(sela1,
"sel_8_5", NULL, &sel);
432 selaAddSel(sela2, sel, NULL,
L_COPY);
433 selaFindSelByName(sela1,
"sel_8_6", NULL, &sel);
434 selaAddSel(sela2, sel, NULL,
L_COPY);
435 selaFindSelByName(sela1,
"sel_8_7", NULL, &sel);
436 selaAddSel(sela2, sel, NULL,
L_COPY);
437 sel = selRotateOrth(sel, 1);
438 selaAddSel(sela2, sel,
"sel_8_7_rot",
L_INSERT);
441 sela1 = sela4ccThin(NULL);
442 selaFindSelByName(sela1,
"sel_4_2", NULL, &sel);
443 selaAddSel(sela2, sel, NULL,
L_COPY);
444 selaFindSelByName(sela1,
"sel_4_3", NULL, &sel);
445 selaAddSel(sela2, sel, NULL,
L_COPY);
448 sela1 = sela8ccThin(NULL);
449 selaFindSelByName(sela1,
"sel_8_4", NULL, &sel);
450 selaAddSel(sela2, sel, NULL,
L_COPY);
458 lept_mkdir(
"/lept/sels");
459 pix1 = selaDisplayInPix(sela2, 35, 3, 15, 4);
460 snprintf(buf,
sizeof(buf),
"/tmp/lept/sels/set%d.png", index);
461 pixWrite(buf, pix1, IFF_PNG);
462 pixDisplay(pix1, 100, 100);