62 #include <config_auto.h>
65 #include "allheaders.h"
97 l_int32 w, h, d, i, j, wplt, wpld, gx, gy, vald;
98 l_int32 val1, val2, val3, val4, val5, val6, val7, val8, val9;
99 l_uint32 *datat, *linet, *datad, *lined;
102 PROCNAME(
"pixSobelEdgeFilter");
105 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
108 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
111 return (
PIX *)ERROR_PTR(
"invalid orientflag", procName, NULL);
115 return (
PIX *)ERROR_PTR(
"pixt not made", procName, NULL);
120 wplt = pixGetWpl(pixt);
122 wpld = pixGetWpl(pixd);
123 for (i = 0; i < h; i++) {
124 linet = datat + i * wplt;
125 lined = datad + i * wpld;
126 for (j = 0; j < w; j++) {
149 vald = L_ABS(val1 + 2 * val4 + val7
150 - val3 - 2 * val6 - val9) >> 3;
152 vald = L_ABS(val1 + 2 * val2 + val3 - val7
153 - 2 * val8 - val9) >> 3;
155 gx = L_ABS(val1 + 2 * val2 + val3 - val7
156 - 2 * val8 - val9) >> 3;
157 gy = L_ABS(val1 + 2 * val4 + val7
158 - val3 - 2 * val6 - val9) >> 3;
159 vald = L_MIN(255, gx + gy);
205 l_int32 w, h, d, i, j, wpls, wpld;
206 l_int32 cval, rval, bval, val, lgrad, rgrad, tgrad, bgrad;
207 l_uint32 *datas, *lines, *datad, *lined;
210 PROCNAME(
"pixTwoSidedEdgeFilter");
213 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
216 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
218 return (
PIX *)ERROR_PTR(
"invalid orientflag", procName, NULL);
222 wpls = pixGetWpl(pixs);
224 wpld = pixGetWpl(pixd);
226 for (i = 0; i < h; i++) {
227 lines = datas + i * wpls;
228 lined = datad + i * wpld;
231 for (j = 1; j < w - 1; j++) {
234 if (lgrad * rgrad > 0) {
236 val = -L_MAX(lgrad, rgrad);
238 val = L_MIN(lgrad, rgrad);
247 for (j = 0; j < w; j++) {
248 lines = datas + wpls;
251 for (i = 1; i < h - 1; i++) {
253 lined = datad + i * wpld;
256 if (tgrad * bgrad > 0) {
258 val = -L_MAX(tgrad, bgrad);
260 val = L_MIN(tgrad, bgrad);
319 const char *debugfile)
321 l_int32 i, n, val, nval, diff, njumps, jumpsum, nreversal;
324 PROCNAME(
"pixMeasureEdgeSmoothness");
326 if (pjpl) *pjpl = 0.0;
327 if (pjspl) *pjspl = 0.0;
328 if (prpl) *prpl = 0.0;
329 if (!pjpl && !pjspl && !prpl && !debugfile)
330 return ERROR_INT(
"no output requested", procName, 1);
331 if (!pixs || pixGetDepth(pixs) != 1)
332 return ERROR_INT(
"pixs not defined or not 1 bpp", procName, 1);
335 return ERROR_INT(
"invalid side", procName, 1);
337 return ERROR_INT(
"invalid minjump; must be >= 1", procName, 1);
339 return ERROR_INT(
"invalid minreversal; must be >= 1", procName, 1);
342 return ERROR_INT(
"edge profile not made", procName, 1);
352 for (i = 1; i < n; i++) {
354 diff = L_ABS(nval - val);
355 if (diff >= minjump) {
362 *pjpl = (l_float32)njumps / (l_float32)(n - 1);
364 *pjspl = (l_float32)jumpsum / (l_float32)(n - 1);
370 *prpl = (l_float32)nreversal / (l_float32)(n - 1);
391 const char *debugfile)
393 l_int32 x, y, w, h, loc, index, ival;
399 PROCNAME(
"pixGetEdgeProfile");
401 if (!pixs || pixGetDepth(pixs) != 1)
402 return (
NUMA *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, NULL);
405 return (
NUMA *)ERROR_PTR(
"invalid side", procName, NULL);
413 pixGetLastOffPixelInRun(pixs, 0, 0,
L_FROM_LEFT, &loc);
414 loc = (loc == w - 1) ? 0 : loc + 1;
416 for (y = 1; y < h; y++) {
419 pixGetLastOnPixelInRun(pixs, loc, y,
L_FROM_RIGHT, &loc);
421 pixGetLastOffPixelInRun(pixs, loc, y,
L_FROM_LEFT, &loc);
422 loc = (loc == w - 1) ? 0 : loc + 1;
428 pixGetLastOffPixelInRun(pixs, w - 1, 0,
L_FROM_RIGHT, &loc);
429 loc = (loc == 0) ? w - 1 : loc - 1;
431 for (y = 1; y < h; y++) {
434 pixGetLastOnPixelInRun(pixs, loc, y,
L_FROM_LEFT, &loc);
436 pixGetLastOffPixelInRun(pixs, loc, y,
L_FROM_RIGHT, &loc);
437 loc = (loc == 0) ? w - 1 : loc - 1;
443 pixGetLastOffPixelInRun(pixs, 0, 0,
L_FROM_TOP, &loc);
444 loc = (loc == h - 1) ? 0 : loc + 1;
446 for (x = 1; x < w; x++) {
449 pixGetLastOnPixelInRun(pixs, x, loc,
L_FROM_BOT, &loc);
451 pixGetLastOffPixelInRun(pixs, x, loc,
L_FROM_TOP, &loc);
452 loc = (loc == h - 1) ? 0 : loc + 1;
458 pixGetLastOffPixelInRun(pixs, 0, h - 1,
L_FROM_BOT, &loc);
459 loc = (loc == 0) ? h - 1 : loc - 1;
461 for (x = 1; x < w; x++) {
464 pixGetLastOnPixelInRun(pixs, x, loc,
L_FROM_TOP, &loc);
466 pixGetLastOffPixelInRun(pixs, x, loc,
L_FROM_BOT, &loc);
467 loc = (loc == 0) ? h - 1 : loc - 1;
475 cmap = pixGetColormap(pixt);
479 for (y = 0; y < h; y++) {
484 for (x = 0; x < w; x++) {
489 pixWrite(debugfile, pixt, IFF_PNG);
520 pixGetLastOffPixelInRun(
PIX *pixs,
529 PROCNAME(
"pixGetLastOffPixelInRun");
532 return ERROR_INT(
"&loc not defined", procName, 1);
534 if (!pixs || pixGetDepth(pixs) != 1)
535 return ERROR_INT(
"pixs undefined or not 1 bpp", procName, 1);
538 return ERROR_INT(
"invalid side", procName, 1);
542 for (loc = x; loc < w; loc++) {
549 for (loc = x; loc >= 0; loc--) {
557 for (loc = y; loc < h; loc++) {
565 for (loc = y; loc >= 0; loc--) {
594 pixGetLastOnPixelInRun(
PIX *pixs,
603 PROCNAME(
"pixLastOnPixelInRun");
606 return ERROR_INT(
"&loc not defined", procName, 1);
608 if (!pixs || pixGetDepth(pixs) != 1)
609 return ERROR_INT(
"pixs undefined or not 1 bpp", procName, 1);
612 return ERROR_INT(
"invalid side", procName, 1);
616 for (loc = x; loc < w; loc++) {
623 for (loc = x; loc >= 0; loc--) {
631 for (loc = y; loc < h; loc++) {
639 for (loc = y; loc >= 0; loc--) {
#define GET_DATA_BYTE(pdata, n)
#define SET_DATA_BYTE(pdata, n, val)
l_int32 pixcmapGetCount(const PIXCMAP *cmap)
pixcmapGetCount()
l_ok pixcmapAddColor(PIXCMAP *cmap, l_int32 rval, l_int32 gval, l_int32 bval)
pixcmapAddColor()
PIX * pixTwoSidedEdgeFilter(PIX *pixs, l_int32 orientflag)
pixTwoSidedEdgeFilter()
PIX * pixSobelEdgeFilter(PIX *pixs, l_int32 orientflag)
pixSobelEdgeFilter()
NUMA * pixGetEdgeProfile(PIX *pixs, l_int32 side, const char *debugfile)
pixGetEdgeProfile()
l_ok pixMeasureEdgeSmoothness(PIX *pixs, l_int32 side, l_int32 minjump, l_int32 minreversal, l_float32 *pjpl, l_float32 *pjspl, l_float32 *prpl, const char *debugfile)
pixMeasureEdgeSmoothness()
l_ok numaAddNumber(NUMA *na, l_float32 val)
numaAddNumber()
NUMA * numaCreate(l_int32 n)
numaCreate()
void numaDestroy(NUMA **pna)
numaDestroy()
l_int32 numaGetCount(NUMA *na)
numaGetCount()
l_ok numaGetIValue(NUMA *na, l_int32 index, l_int32 *pival)
numaGetIValue()
NUMA * numaFindExtrema(NUMA *nas, l_float32 delta, NUMA **pnav)
numaFindExtrema()
l_uint32 * pixGetData(PIX *pix)
pixGetData()
void pixDestroy(PIX **ppix)
pixDestroy()
l_ok pixGetDimensions(const PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
PIX * pixCreateTemplate(const PIX *pixs)
pixCreateTemplate()
l_ok pixSetPixel(PIX *pix, l_int32 x, l_int32 y, l_uint32 val)
pixSetPixel()
l_ok pixGetPixel(PIX *pix, l_int32 x, l_int32 y, l_uint32 *pval)
pixGetPixel()
PIX * pixAddMirroredBorder(PIX *pixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot)
pixAddMirroredBorder()
PIX * pixConvertTo8(PIX *pixs, l_int32 cmapflag)
pixConvertTo8()