119 return (L_KERNEL *)ERROR_PTR(
"width must be > 0", __func__, NULL);
121 return (L_KERNEL *)ERROR_PTR(
"height must be > 0", __func__, NULL);
124 size64 = (l_uint64)width * (l_uint64)height;
125 if (size64 >= (1LL << 29)) {
126 L_ERROR(
"requested width = %d, height = %d\n", __func__, width, height);
127 return (L_KERNEL *)ERROR_PTR(
"size >= 2^29", __func__, NULL);
130 kel = (L_KERNEL *)LEPT_CALLOC(1,
sizeof(L_KERNEL));
133 if ((kel->
data = create2dFloatArray(height, width)) == NULL) {
135 return (L_KERNEL *)ERROR_PTR(
"data not allocated", __func__, NULL);
538l_int32 sy, sx, cy, cx, i, j, ret, version, ignore;
542 return (L_KERNEL *)ERROR_PTR(
"stream not defined", __func__, NULL);
544 ret = fscanf(fp,
" Kernel Version %d\n", &version);
546 return (L_KERNEL *)ERROR_PTR(
"not a kernel file", __func__, NULL);
547 if (version != KERNEL_VERSION_NUMBER)
548 return (L_KERNEL *)ERROR_PTR(
"invalid kernel version", __func__, NULL);
550 if (fscanf(fp,
" sy = %d, sx = %d, cy = %d, cx = %d\n",
551 &sy, &sx, &cy, &cx) != 4)
552 return (L_KERNEL *)ERROR_PTR(
"dimensions not read", __func__, NULL);
553 if (sx > MaxArraySize || sy > MaxArraySize) {
554 L_ERROR(
"sx = %d or sy = %d > %d\n", __func__, sx, sy, MaxArraySize);
558 return (L_KERNEL *)ERROR_PTR(
"kel not made", __func__, NULL);
561 for (i = 0; i < sy; i++) {
562 for (j = 0; j < sx; j++)
563 ignore = fscanf(fp,
"%15f", &kel->
data[i][j]);
564 ignore = fscanf(fp,
"\n");
566 ignore = fscanf(fp,
"\n");
744l_int32 nlines, i, j, first, index, w, h, cx, cy, n;
752 return (L_KERNEL *)ERROR_PTR(
"filename not defined", __func__, NULL);
754 if ((filestr = (
char *)l_binaryRead(filename, &size)) == NULL)
755 return (L_KERNEL *)ERROR_PTR(
"file not found", __func__, NULL);
758 return (L_KERNEL *)ERROR_PTR(
"file is empty", __func__, NULL);
761 sa = sarrayCreateLinesFromString(filestr, 1);
763 nlines = sarrayGetCount(sa);
766 for (i = 0, first = 0; i < nlines; i++) {
767 line = sarrayGetString(sa, i,
L_NOCOPY);
768 if (line[0] !=
'#') {
775 line = sarrayGetString(sa, first,
L_NOCOPY);
776 if (sscanf(line,
"%d %d", &h, &w) != 2) {
778 return (L_KERNEL *)ERROR_PTR(
"error reading h,w", __func__, NULL);
780 if (h > MaxArraySize || w > MaxArraySize) {
781 L_ERROR(
"h = %d or w = %d > %d\n", __func__, h, w, MaxArraySize);
785 line = sarrayGetString(sa, first + 1,
L_NOCOPY);
786 if (sscanf(line,
"%d %d", &cy, &cx) != 2) {
788 return (L_KERNEL *)ERROR_PTR(
"error reading cy,cx", __func__, NULL);
795 for (i = first + 2; i < nlines; i++) {
796 line = sarrayGetString(sa, i,
L_NOCOPY);
797 if (line[0] ==
'\0' || line[0] ==
'\n' || line[0] ==
'#')
800 numaJoin(na, nat, 0, -1);
805 n = numaGetCount(na);
808 lept_stderr(
"w = %d, h = %d, num ints = %d\n", w, h, n);
809 return (L_KERNEL *)ERROR_PTR(
"invalid integer data", __func__, NULL);
815 for (i = 0; i < h; i++) {
816 for (j = 0; j < w; j++) {
817 numaGetFValue(na, index, &val);
848l_int32 i, j, w, h, d;
853 return (L_KERNEL *)ERROR_PTR(
"pix not defined", __func__, NULL);
854 pixGetDimensions(pix, &w, &h, &d);
856 return (L_KERNEL *)ERROR_PTR(
"pix not 8 bpp", __func__, NULL);
857 if (cy < 0 || cx < 0 || cy >= h || cx >= w)
858 return (L_KERNEL *)ERROR_PTR(
"(cy, cx) invalid", __func__, NULL);
862 for (i = 0; i < h; i++) {
863 for (j = 0; j < w; j++) {
864 pixGetPixel(pix, j, i, &val);
907l_int32 i, j, w, h, sx, sy, cx, cy, width, x0, y0;
909l_float32 minval, maxval, max, val, norm;
910PIX *pixd, *pixt0, *pixt1;
913 return (
PIX *)ERROR_PTR(
"kernel not defined", __func__, NULL);
918 max = L_MAX(maxval, -minval);
920 return (
PIX *)ERROR_PTR(
"kernel elements all 0.0", __func__, NULL);
921 norm = 255. / (l_float32)max;
924 if (size == 1 && gthick == 0) {
925 pixd = pixCreate(sx, sy, 8);
926 for (i = 0; i < sy; i++) {
927 for (j = 0; j < sx; j++) {
929 normval = (l_int32)(norm * L_ABS(val));
930 pixSetPixel(pixd, j, i, normval);
938 L_WARNING(
"size < 17; setting to 17\n", __func__);
944 L_WARNING(
"grid thickness < 2; setting to 2\n", __func__);
948 w = size * sx + gthick * (sx + 1);
949 h = size * sy + gthick * (sy + 1);
950 pixd = pixCreate(w, h, 8);
953 for (i = 0; i <= sy; i++)
954 pixRenderLine(pixd, 0, gthick / 2 + i * (size + gthick),
955 w - 1, gthick / 2 + i * (size + gthick),
957 for (j = 0; j <= sx; j++)
958 pixRenderLine(pixd, gthick / 2 + j * (size + gthick), 0,
959 gthick / 2 + j * (size + gthick), h - 1,
963 pixt0 = pixCreate(size, size, 1);
967 pixt1 = pixCreate(size, size, 1);
969 pixRenderLine(pixt1, size / 2, (l_int32)(0.12 * size),
970 size / 2, (l_int32)(0.88 * size),
972 pixRenderLine(pixt1, (l_int32)(0.15 * size), size / 2,
973 (l_int32)(0.85 * size), size / 2,
975 pixRasterop(pixt1, size / 2 - width, size / 2 - width,
980 for (i = 0; i < sy; i++) {
982 for (j = 0; j < sx; j++) {
984 normval = (l_int32)(norm * L_ABS(val));
985 pixSetMaskedGeneral(pixd, pixt0, normval, x0, y0);
986 if (i == cy && j == cx)
987 pixPaintThroughMask(pixd, pixt1, x0, y0, 255 - normval);
1211l_int32 sx, sy, i, j;
1212l_float32 pi, squaredist, highnorm, lownorm, val;
1218 return (L_KERNEL *)ERROR_PTR(
"kel not made", __func__, NULL);
1222 for (i = 0; i < sy; i++) {
1223 for (j = 0; j < sx; j++) {
1224 squaredist = (l_float32)((i - halfh) * (i - halfh) +
1225 (j - halfw) * (j - halfw));
1226 highnorm = 1. / (2 * stdev * stdev);
1227 lownorm = highnorm / (ratio * ratio);
1228 val = (highnorm / pi) * expf(-(highnorm * squaredist))
1229 - (lownorm / pi) * expf(-(lownorm * squaredist));