85 #include "allheaders.h" 112 PROCNAME(
"kernelCreate");
115 return (
L_KERNEL *)ERROR_PTR(
"width must be > 0", procName, NULL);
117 return (
L_KERNEL *)ERROR_PTR(
"height must be > 0", procName, NULL);
120 size64 = (l_uint64)width * (l_uint64)height;
121 if (size64 >= (1LL << 29)) {
122 L_ERROR(
"requested width = %d, height = %d\n", procName, width, height);
123 return (
L_KERNEL *)ERROR_PTR(
"size >= 2^29", procName, NULL);
131 return (
L_KERNEL *)ERROR_PTR(
"data not allocated", procName, NULL);
149 PROCNAME(
"kernelDestroy");
152 L_WARNING(
"ptr address is NULL!\n", procName);
155 if ((kel = *pkel) == NULL)
158 for (i = 0; i < kel->
sy; i++)
159 LEPT_FREE(kel->
data[i]);
160 LEPT_FREE(kel->
data);
177 l_int32 i, j, sx, sy, cx, cy;
180 PROCNAME(
"kernelCopy");
183 return (
L_KERNEL *)ERROR_PTR(
"kels not defined", procName, NULL);
187 return (
L_KERNEL *)ERROR_PTR(
"keld not made", procName, NULL);
190 for (i = 0; i < sy; i++)
191 for (j = 0; j < sx; j++)
192 keld->
data[i][j] = kels->
data[i][j];
216 PROCNAME(
"kernelGetElement");
219 return ERROR_INT(
"&val not defined", procName, 1);
222 return ERROR_INT(
"kernel not defined", procName, 1);
223 if (row < 0 || row >= kel->
sy)
224 return ERROR_INT(
"kernel row out of bounds", procName, 1);
225 if (col < 0 || col >= kel->
sx)
226 return ERROR_INT(
"kernel col out of bounds", procName, 1);
228 *pval = kel->
data[row][col];
248 PROCNAME(
"kernelSetElement");
251 return ERROR_INT(
"kel not defined", procName, 1);
252 if (row < 0 || row >= kel->
sy)
253 return ERROR_INT(
"kernel row out of bounds", procName, 1);
254 if (col < 0 || col >= kel->
sx)
255 return ERROR_INT(
"kernel col out of bounds", procName, 1);
257 kel->
data[row][col] = val;
276 PROCNAME(
"kernelGetParameters");
283 return ERROR_INT(
"kernel not defined", procName, 1);
284 if (psy) *psy = kel->
sy;
285 if (psx) *psx = kel->
sx;
286 if (pcy) *pcy = kel->
cy;
287 if (pcx) *pcx = kel->
cx;
304 PROCNAME(
"kernelSetOrigin");
307 return ERROR_INT(
"kel not defined", procName, 1);
325 l_int32 sx, sy, i, j;
327 PROCNAME(
"kernelGetSum");
330 return ERROR_INT(
"&sum not defined", procName, 1);
333 return ERROR_INT(
"kernel not defined", procName, 1);
336 for (i = 0; i < sy; i++) {
337 for (j = 0; j < sx; j++) {
338 *psum += kel->
data[i][j];
358 l_int32 sx, sy, i, j;
359 l_float32 val, minval, maxval;
361 PROCNAME(
"kernelGetMinmax");
364 return ERROR_INT(
"neither &min nor &max defined", procName, 1);
365 if (pmin) *pmin = 0.0;
366 if (pmax) *pmax = 0.0;
368 return ERROR_INT(
"kernel not defined", procName, 1);
372 maxval = -10000000.0;
373 for (i = 0; i < sy; i++) {
374 for (j = 0; j < sx; j++) {
375 val = kel->
data[i][j];
413 l_int32 i, j, sx, sy, cx, cy;
414 l_float32 sum, factor;
417 PROCNAME(
"kernelNormalize");
420 return (
L_KERNEL *)ERROR_PTR(
"kels not defined", procName, NULL);
423 if (L_ABS(sum) < 0.00001) {
424 L_WARNING(
"null sum; not normalizing; returning a copy\n", procName);
430 return (
L_KERNEL *)ERROR_PTR(
"keld not made", procName, NULL);
434 factor = normsum / sum;
435 for (i = 0; i < sy; i++)
436 for (j = 0; j < sx; j++)
437 keld->
data[i][j] = factor * kels->
data[i][j];
458 l_int32 i, j, sx, sy, cx, cy;
461 PROCNAME(
"kernelInvert");
464 return (
L_KERNEL *)ERROR_PTR(
"kels not defined", procName, NULL);
468 return (
L_KERNEL *)ERROR_PTR(
"keld not made", procName, NULL);
469 keld->
cy = sy - 1 - cy;
470 keld->
cx = sx - 1 - cx;
472 for (i = 0; i < sy; i++)
473 for (j = 0; j < sx; j++)
474 keld->
data[i][j] = kels->
data[sy - 1 - i][sx - 1 - j];
505 PROCNAME(
"create2dFloatArray");
507 if ((array = (l_float32 **)LEPT_CALLOC(sy,
sizeof(l_float32 *))) == NULL)
508 return (l_float32 **)ERROR_PTR(
"ptr array not made", procName, NULL);
510 for (i = 0; i < sy; i++)
511 array[i] = (l_float32 *)LEPT_CALLOC(sx,
sizeof(l_float32));
531 PROCNAME(
"kernelRead");
534 return (
L_KERNEL *)ERROR_PTR(
"fname not defined", procName, NULL);
537 return (
L_KERNEL *)ERROR_PTR(
"stream not opened", procName, NULL);
540 return (
L_KERNEL *)ERROR_PTR(
"kel not returned", procName, NULL);
557 l_int32 sy, sx, cy, cx, i, j, ret, version, ignore;
560 PROCNAME(
"kernelReadStream");
563 return (
L_KERNEL *)ERROR_PTR(
"stream not defined", procName, NULL);
565 ret = fscanf(fp,
" Kernel Version %d\n", &version);
567 return (
L_KERNEL *)ERROR_PTR(
"not a kernel file", procName, NULL);
568 if (version != KERNEL_VERSION_NUMBER)
569 return (
L_KERNEL *)ERROR_PTR(
"invalid kernel version", procName, NULL);
571 if (fscanf(fp,
" sy = %d, sx = %d, cy = %d, cx = %d\n",
572 &sy, &sx, &cy, &cx) != 4)
573 return (
L_KERNEL *)ERROR_PTR(
"dimensions not read", procName, NULL);
576 return (
L_KERNEL *)ERROR_PTR(
"kel not made", procName, NULL);
579 for (i = 0; i < sy; i++) {
580 for (j = 0; j < sx; j++)
581 ignore = fscanf(fp,
"%15f", &kel->
data[i][j]);
582 ignore = fscanf(fp,
"\n");
584 ignore = fscanf(fp,
"\n");
603 PROCNAME(
"kernelWrite");
606 return ERROR_INT(
"fname not defined", procName, 1);
608 return ERROR_INT(
"kel not defined", procName, 1);
611 return ERROR_INT(
"stream not opened", procName, 1);
630 l_int32 sx, sy, cx, cy, i, j;
632 PROCNAME(
"kernelWriteStream");
635 return ERROR_INT(
"stream not defined", procName, 1);
637 return ERROR_INT(
"kel not defined", procName, 1);
640 fprintf(fp,
" Kernel Version %d\n", KERNEL_VERSION_NUMBER);
641 fprintf(fp,
" sy = %d, sx = %d, cy = %d, cx = %d\n", sy, sx, cy, cx);
642 for (i = 0; i < sy; i++) {
643 for (j = 0; j < sx; j++)
644 fprintf(fp,
"%15.4f", kel->
data[i][j]);
685 l_int32 n, i, j, index;
690 PROCNAME(
"kernelCreateFromString");
693 return (
L_KERNEL *)ERROR_PTR(
"height must be > 0", procName, NULL);
695 return (
L_KERNEL *)ERROR_PTR(
"width must be > 0", procName, NULL);
696 if (cy < 0 || cy >= h)
697 return (
L_KERNEL *)ERROR_PTR(
"cy invalid", procName, NULL);
698 if (cx < 0 || cx >= w)
699 return (
L_KERNEL *)ERROR_PTR(
"cx invalid", procName, NULL);
708 fprintf(stderr,
"w = %d, h = %d, num ints = %d\n", w, h, n);
709 return (
L_KERNEL *)ERROR_PTR(
"invalid integer data", procName, NULL);
713 for (i = 0; i < h; i++) {
714 for (j = 0; j < w; j++) {
767 char *filestr, *line;
768 l_int32 nlines, i, j, first, index, w, h, cx, cy, n;
775 PROCNAME(
"kernelCreateFromFile");
778 return (
L_KERNEL *)ERROR_PTR(
"filename not defined", procName, NULL);
780 if ((filestr = (
char *)
l_binaryRead(filename, &size)) == NULL)
781 return (
L_KERNEL *)ERROR_PTR(
"file not found", procName, NULL);
784 return (
L_KERNEL *)ERROR_PTR(
"file is empty", procName, NULL);
792 for (i = 0, first = 0; i < nlines; i++) {
794 if (line[0] !=
'#') {
802 if (sscanf(line,
"%d %d", &h, &w) != 2) {
804 return (
L_KERNEL *)ERROR_PTR(
"error reading h,w", procName, NULL);
807 if (sscanf(line,
"%d %d", &cy, &cx) != 2) {
809 return (
L_KERNEL *)ERROR_PTR(
"error reading cy,cx", procName, NULL);
816 for (i = first + 2; i < nlines; i++) {
818 if (line[0] ==
'\0' || line[0] ==
'\n' || line[0] ==
'#')
829 fprintf(stderr,
"w = %d, h = %d, num ints = %d\n", w, h, n);
830 return (
L_KERNEL *)ERROR_PTR(
"invalid integer data", procName, NULL);
836 for (i = 0; i < h; i++) {
837 for (j = 0; j < w; j++) {
869 l_int32 i, j, w, h, d;
873 PROCNAME(
"kernelCreateFromPix");
876 return (
L_KERNEL *)ERROR_PTR(
"pix not defined", procName, NULL);
879 return (
L_KERNEL *)ERROR_PTR(
"pix not 8 bpp", procName, NULL);
880 if (cy < 0 || cx < 0 || cy >= h || cx >= w)
881 return (
L_KERNEL *)ERROR_PTR(
"(cy, cx) invalid", procName, NULL);
885 for (i = 0; i < h; i++) {
886 for (j = 0; j < w; j++) {
930 l_int32 i, j, w, h, sx, sy, cx, cy, width, x0, y0;
932 l_float32 minval, maxval, max, val, norm;
933 PIX *pixd, *pixt0, *pixt1;
935 PROCNAME(
"kernelDisplayInPix");
938 return (
PIX *)ERROR_PTR(
"kernel not defined", procName, NULL);
943 max = L_MAX(maxval, -minval);
945 return (
PIX *)ERROR_PTR(
"kernel elements all 0.0", procName, NULL);
946 norm = 255. / (l_float32)max;
949 if (size == 1 && gthick == 0) {
951 for (i = 0; i < sy; i++) {
952 for (j = 0; j < sx; j++) {
954 normval = (l_int32)(norm * L_ABS(val));
963 L_WARNING(
"size < 17; setting to 17\n", procName);
969 L_WARNING(
"grid thickness < 2; setting to 2\n", procName);
973 w = size * sx + gthick * (sx + 1);
974 h = size * sy + gthick * (sy + 1);
978 for (i = 0; i <= sy; i++)
980 w - 1, gthick / 2 + i * (size + gthick),
982 for (j = 0; j <= sx; j++)
984 gthick / 2 + j * (size + gthick), h - 1,
995 size / 2, (l_int32)(0.88 * size),
998 (l_int32)(0.85 * size), size / 2,
1000 pixRasterop(pixt1, size / 2 - width, size / 2 - width,
1005 for (i = 0; i < sy; i++) {
1007 for (j = 0; j < sx; j++) {
1009 normval = (l_int32)(norm * L_ABS(val));
1011 if (i == cy && j == cx)
1013 x0 += size + gthick;
1015 y0 += size + gthick;
1043 char *newstr, *head;
1048 PROCNAME(
"parseStringForNumbers");
1051 return (
NUMA *)ERROR_PTR(
"str not defined", procName, NULL);
1059 while ((head =
strtokSafe(NULL, seps, &tail)) != NULL) {
1101 PROCNAME(
"makeFlatKernel");
1104 return (
L_KERNEL *)ERROR_PTR(
"kel not made", procName, NULL);
1106 normval = 1.0 / (l_float32)(height * width);
1107 for (i = 0; i < height; i++) {
1108 for (j = 0; j < width; j++) {
1142 l_int32 sx, sy, i, j;
1146 PROCNAME(
"makeGaussianKernel");
1148 sx = 2 * halfwidth + 1;
1149 sy = 2 * halfheight + 1;
1151 return (
L_KERNEL *)ERROR_PTR(
"kel not made", procName, NULL);
1153 for (i = 0; i < sy; i++) {
1154 for (j = 0; j < sx; j++) {
1155 val = expf(-(l_float32)((i - halfheight) * (i - halfheight) +
1156 (j - halfwidth) * (j - halfwidth)) /
1157 (2. * stdev * stdev));
1198 PROCNAME(
"makeGaussianKernelSep");
1200 if (!pkelx || !pkely)
1201 return ERROR_INT(
"&kelx and &kely not defined", procName, 1);
1241 l_int32 sx, sy, i, j;
1242 l_float32 pi, squaredist, highnorm, lownorm, val;
1245 PROCNAME(
"makeDoGKernel");
1247 sx = 2 * halfwidth + 1;
1248 sy = 2 * halfheight + 1;
1250 return (
L_KERNEL *)ERROR_PTR(
"kel not made", procName, NULL);
1254 for (i = 0; i < sy; i++) {
1255 for (j = 0; j < sx; j++) {
1256 squaredist = (l_float32)((i - halfheight) * (i - halfheight) +
1257 (j - halfwidth) * (j - halfwidth));
1258 highnorm = 1. / (2 * stdev * stdev);
1259 lownorm = highnorm / (ratio * ratio);
1260 val = (highnorm / pi) * expf(-(highnorm * squaredist))
1261 - (lownorm / pi) * expf(-(lownorm * squaredist));
l_ok numaGetFValue(NUMA *na, l_int32 index, l_float32 *pval)
numaGetFValue()
PIX * kernelDisplayInPix(L_KERNEL *kel, l_int32 size, l_int32 gthick)
kernelDisplayInPix()
L_KERNEL * makeGaussianKernel(l_int32 halfheight, l_int32 halfwidth, l_float32 stdev, l_float32 max)
makeGaussianKernel()
NUMA * parseStringForNumbers(const char *str, const char *seps)
parseStringForNumbers()
l_ok kernelGetParameters(L_KERNEL *kel, l_int32 *psy, l_int32 *psx, l_int32 *pcy, l_int32 *pcx)
kernelGetParameters()
l_ok kernelGetSum(L_KERNEL *kel, l_float32 *psum)
kernelGetSum()
l_ok numaAddNumber(NUMA *na, l_float32 val)
numaAddNumber()
char * stringNew(const char *src)
stringNew()
l_ok pixRasterop(PIX *pixd, l_int32 dx, l_int32 dy, l_int32 dw, l_int32 dh, l_int32 op, PIX *pixs, l_int32 sx, l_int32 sy)
pixRasterop()
L_KERNEL * kernelCreateFromPix(PIX *pix, l_int32 cy, l_int32 cx)
kernelCreateFromPix()
PIX * pixCreate(l_int32 width, l_int32 height, l_int32 depth)
pixCreate()
l_ok pixSetMaskedGeneral(PIX *pixd, PIX *pixm, l_uint32 val, l_int32 x, l_int32 y)
pixSetMaskedGeneral()
l_ok pixSetAll(PIX *pix)
pixSetAll()
NUMA * numaCreate(l_int32 n)
numaCreate()
l_ok makeGaussianKernelSep(l_int32 halfheight, l_int32 halfwidth, l_float32 stdev, l_float32 max, L_KERNEL **pkelx, L_KERNEL **pkely)
makeGaussianKernelSep()
l_ok kernelWrite(const char *fname, L_KERNEL *kel)
kernelWrite()
l_ok pixPaintThroughMask(PIX *pixd, PIX *pixm, l_int32 x, l_int32 y, l_uint32 val)
pixPaintThroughMask()
l_uint8 * l_binaryRead(const char *filename, size_t *pnbytes)
l_binaryRead()
l_ok kernelSetOrigin(L_KERNEL *kel, l_int32 cy, l_int32 cx)
kernelSetOrigin()
l_int32 numaGetCount(NUMA *na)
numaGetCount()
l_ok pixSetPixel(PIX *pix, l_int32 x, l_int32 y, l_uint32 val)
pixSetPixel()
L_KERNEL * kernelCopy(L_KERNEL *kels)
kernelCopy()
char * sarrayGetString(SARRAY *sa, l_int32 index, l_int32 copyflag)
sarrayGetString()
void pixDestroy(PIX **ppix)
pixDestroy()
L_KERNEL * kernelReadStream(FILE *fp)
kernelReadStream()
L_KERNEL * kernelNormalize(L_KERNEL *kels, l_float32 normsum)
kernelNormalize()
SARRAY * sarrayCreateLinesFromString(const char *string, l_int32 blankflag)
sarrayCreateLinesFromString()
l_ok pixRenderLine(PIX *pix, l_int32 x1, l_int32 y1, l_int32 x2, l_int32 y2, l_int32 width, l_int32 op)
pixRenderLine()
void numaDestroy(NUMA **pna)
numaDestroy()
l_ok pixGetPixel(PIX *pix, l_int32 x, l_int32 y, l_uint32 *pval)
pixGetPixel()
l_ok pixGetDimensions(const PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
FILE * fopenWriteStream(const char *filename, const char *modestring)
fopenWriteStream()
L_KERNEL * kernelInvert(L_KERNEL *kels)
kernelInvert()
void kernelDestroy(L_KERNEL **pkel)
kernelDestroy()
FILE * fopenReadStream(const char *filename)
fopenReadStream()
l_int32 sarrayGetCount(SARRAY *sa)
sarrayGetCount()
l_ok kernelSetElement(L_KERNEL *kel, l_int32 row, l_int32 col, l_float32 val)
kernelSetElement()
l_ok numaJoin(NUMA *nad, NUMA *nas, l_int32 istart, l_int32 iend)
numaJoin()
l_ok kernelGetElement(L_KERNEL *kel, l_int32 row, l_int32 col, l_float32 *pval)
kernelGetElement()
l_ok kernelGetMinMax(L_KERNEL *kel, l_float32 *pmin, l_float32 *pmax)
kernelGetMinMax()
L_KERNEL * kernelCreateFromString(l_int32 h, l_int32 w, l_int32 cy, l_int32 cx, const char *kdata)
kernelCreateFromString()
L_KERNEL * makeFlatKernel(l_int32 height, l_int32 width, l_int32 cy, l_int32 cx)
makeFlatKernel()
L_KERNEL * kernelRead(const char *fname)
kernelRead()
char * strtokSafe(char *cstr, const char *seps, char **psaveptr)
strtokSafe()
L_KERNEL * kernelCreateFromFile(const char *filename)
kernelCreateFromFile()
l_ok kernelWriteStream(FILE *fp, L_KERNEL *kel)
kernelWriteStream()
L_KERNEL * makeDoGKernel(l_int32 halfheight, l_int32 halfwidth, l_float32 stdev, l_float32 ratio)
makeDoGKernel()
l_float32 ** create2dFloatArray(l_int32 sy, l_int32 sx)
create2dFloatArray()
void sarrayDestroy(SARRAY **psa)
sarrayDestroy()
L_KERNEL * kernelCreate(l_int32 height, l_int32 width)
kernelCreate()