124 #include "allheaders.h" 127 static const l_int32 BinSizeArray[] = {2, 5, 10, 20, 50, 100, 200, 500, 1000,\
128 2000, 5000, 10000, 20000, 50000, 100000, 200000,\
129 500000, 1000000, 2000000, 5000000, 10000000,\
130 200000000, 50000000, 100000000};
131 static const l_int32 NBinSizes = 24;
134 #ifndef NO_CONSOLE_IO 135 #define DEBUG_HISTO 0 136 #define DEBUG_CROSSINGS 0 137 #define DEBUG_FREQUENCY 0 168 l_int32 i, j, n, hsize, len;
170 l_float32 *fa, *fas, *fad;
173 PROCNAME(
"numaErode");
176 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
178 return (
NUMA *)ERROR_PTR(
"size must be > 0", procName, NULL);
179 if ((size & 1) == 0 ) {
180 L_WARNING(
"sel size must be odd; increasing by 1\n", procName);
194 if ((fas = (l_float32 *)LEPT_CALLOC(len,
sizeof(l_float32))) == NULL)
195 return (
NUMA *)ERROR_PTR(
"fas not made", procName, NULL);
196 for (i = 0; i < hsize; i++)
198 for (i = hsize + n; i < len; i++)
201 for (i = 0; i < n; i++)
202 fas[hsize + i] = fa[i];
207 for (i = 0; i < n; i++) {
209 for (j = 0; j < size; j++)
210 minval = L_MIN(minval, fas[i + j]);
236 l_int32 i, j, n, hsize, len;
238 l_float32 *fa, *fas, *fad;
241 PROCNAME(
"numaDilate");
244 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
246 return (
NUMA *)ERROR_PTR(
"size must be > 0", procName, NULL);
247 if ((size & 1) == 0 ) {
248 L_WARNING(
"sel size must be odd; increasing by 1\n", procName);
262 if ((fas = (l_float32 *)LEPT_CALLOC(len,
sizeof(l_float32))) == NULL)
263 return (
NUMA *)ERROR_PTR(
"fas not made", procName, NULL);
264 for (i = 0; i < hsize; i++)
266 for (i = hsize + n; i < len; i++)
269 for (i = 0; i < n; i++)
270 fas[hsize + i] = fa[i];
275 for (i = 0; i < n; i++) {
277 for (j = 0; j < size; j++)
278 maxval = L_MAX(maxval, fas[i + j]);
306 PROCNAME(
"numaOpen");
309 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
311 return (
NUMA *)ERROR_PTR(
"size must be > 0", procName, NULL);
312 if ((size & 1) == 0 ) {
313 L_WARNING(
"sel size must be odd; increasing by 1\n", procName);
350 NUMA *nab, *nat1, *nat2, *nad;
352 PROCNAME(
"numaClose");
355 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
357 return (
NUMA *)ERROR_PTR(
"size must be > 0", procName, NULL);
358 if ((size & 1) == 0 ) {
359 L_WARNING(
"sel size must be odd; increasing by 1\n", procName);
402 PROCNAME(
"numaTransform");
405 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
408 return (
NUMA *)ERROR_PTR(
"nad not made", procName, NULL);
410 for (i = 0; i < n; i++) {
412 val = scale * (val + shift);
439 l_float32 sum, sumsq, val, mean, var;
441 PROCNAME(
"numaSimpleStats");
443 if (pmean) *pmean = 0.0;
444 if (pvar) *pvar = 0.0;
445 if (prvar) *prvar = 0.0;
446 if (!pmean && !pvar && !prvar)
447 return ERROR_INT(
"nothing requested", procName, 1);
449 return ERROR_INT(
"na not defined", procName, 1);
451 return ERROR_INT(
"na is empty", procName, 1);
452 if (last == 0) last = n - 1;
453 last = L_MIN(last, n - 1);
455 L_ERROR(
"invalid: first(%d) > last(%d)\n", procName, first, last);
458 ni = last - first + 1;
460 for (i = first; i <= last; i++) {
470 var = sumsq / ni - mean * mean;
471 if (pvar) *pvar = var;
472 if (prvar) *prvar = sqrtf(var);
520 PROCNAME(
"numaWindowedStats");
523 return ERROR_INT(
"nas not defined", procName, 1);
525 L_WARNING(
"filter wider than input array!\n", procName);
527 if (!pnav && !pnarv) {
565 l_int32 i, n, n1, width;
567 l_float32 *fa1, *fad, *suma;
570 PROCNAME(
"numaWindowedMean");
573 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
577 L_WARNING(
"filter wider than input array!\n", procName);
586 if ((suma = (l_float32 *)LEPT_CALLOC(n1 + 1,
sizeof(l_float32))) == NULL) {
589 return (
NUMA *)ERROR_PTR(
"suma not made", procName, NULL);
593 for (i = 0; i < n1; i++) {
598 norm = 1. / (2 * wc + 1);
599 for (i = 0; i < n; i++)
600 fad[i] = norm * (suma[width + i] - suma[i]);
625 l_int32 i, n, n1, width;
627 l_float32 *fa1, *fad, *suma;
630 PROCNAME(
"numaWindowedMeanSquare");
633 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
637 L_WARNING(
"filter wider than input array!\n", procName);
646 if ((suma = (l_float32 *)LEPT_CALLOC(n1 + 1,
sizeof(l_float32))) == NULL) {
649 return (
NUMA *)ERROR_PTR(
"suma not made", procName, NULL);
653 for (i = 0; i < n1; i++) {
654 sum += fa1[i] * fa1[i];
658 norm = 1. / (2 * wc + 1);
659 for (i = 0; i < n; i++)
660 fad[i] = norm * (suma[width + i] - suma[i]);
697 l_float32 *fam, *fams, *fav, *farv;
700 PROCNAME(
"numaWindowedVariance");
702 if (pnav) *pnav = NULL;
703 if (pnarv) *pnarv = NULL;
705 return ERROR_INT(
"neither &nav nor &narv are defined", procName, 1);
707 return ERROR_INT(
"nam not defined", procName, 1);
709 return ERROR_INT(
"nams not defined", procName, 1);
713 return ERROR_INT(
"sizes of nam and nams differ", procName, 1);
728 for (i = 0; i < nm; i++) {
729 var = fams[i] - fam[i] * fam[i];
733 farv[i] = sqrtf(var);
763 NUMA *na1, *na2, *nad;
765 PROCNAME(
"numaWindowedMedian");
768 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
772 L_ERROR(
"filter too small; returning a copy\n", procName);
776 if (halfwin > (n - 1) / 2) {
777 halfwin = (n - 1) / 2;
778 L_INFO(
"reducing filter to halfwin = %d\n", procName, halfwin);
787 for (i = 0; i < n; i++) {
812 PROCNAME(
"numaConvertToInt");
815 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
819 return (
NUMA *)ERROR_PTR(
"nad not made", procName, NULL);
821 for (i = 0; i < n; i++) {
864 l_int32 i, n, ival, hval;
865 l_int32 iminval, imaxval, range, binsize, nbins, ibin;
866 l_float32 val, ratio;
869 PROCNAME(
"numaMakeHistogram");
872 return (
NUMA *)ERROR_PTR(
"na not defined", procName, NULL);
874 return (
NUMA *)ERROR_PTR(
"&binsize not defined", procName, NULL);
878 iminval = (l_int32)(val + 0.5);
880 imaxval = (l_int32)(val + 0.5);
881 if (pbinstart == NULL) {
884 return (
NUMA *)ERROR_PTR(
"all values < 0", procName, NULL);
888 range = imaxval - iminval + 1;
889 if (range > maxbins - 1) {
890 ratio = (l_float64)range / (l_float64)maxbins;
892 for (i = 0; i < NBinSizes; i++) {
893 if (ratio < BinSizeArray[i]) {
894 binsize = BinSizeArray[i];
899 return (
NUMA *)ERROR_PTR(
"numbers too large", procName, NULL);
904 nbins = 1 + range / binsize;
907 if (pbinstart && binsize > 1) {
909 iminval = binsize * (iminval / binsize);
911 iminval = binsize * ((iminval - binsize + 1) / binsize);
914 *pbinstart = iminval;
917 fprintf(stderr,
" imaxval = %d, range = %d, nbins = %d\n",
918 imaxval, range, nbins);
923 return (
NUMA *)ERROR_PTR(
"nai not made", procName, NULL);
930 return (
NUMA *)ERROR_PTR(
"nahist not made", procName, NULL);
934 for (i = 0; i < n; i++) {
936 ibin = (ival - iminval) / binsize;
937 if (ibin >= 0 && ibin < nbins) {
974 l_int32 i, n, imin, imax, irange, ibin, ival, allints;
975 l_float32 minval, maxval, range, binsize, fval;
978 PROCNAME(
"numaMakeHistogramAuto");
981 return (
NUMA *)ERROR_PTR(
"na not defined", procName, NULL);
982 maxbins = L_MAX(1, maxbins);
993 if (allints && (maxval - minval < maxbins)) {
994 imin = (l_int32)minval;
995 imax = (l_int32)maxval;
996 irange = imax - imin + 1;
1000 for (i = 0; i < n; i++) {
1011 range = maxval - minval;
1012 binsize = range / (l_float32)maxbins;
1022 for (i = 0; i < n; i++) {
1024 ibin = (l_int32)((fval - minval) / binsize);
1025 ibin = L_MIN(ibin, maxbins - 1);
1059 l_int32 i, n, nbins, ival, ibin;
1060 l_float32 val, maxval;
1063 PROCNAME(
"numaMakeHistogramClipped");
1066 return (
NUMA *)ERROR_PTR(
"na not defined", procName, NULL);
1068 return (
NUMA *)ERROR_PTR(
"binsize must be > 0.0", procName, NULL);
1069 if (binsize > maxsize)
1074 maxsize = L_MIN(maxsize, maxval);
1075 nbins = (l_int32)(maxsize / binsize) + 1;
1080 return (
NUMA *)ERROR_PTR(
"nad not made", procName, NULL);
1083 for (i = 0; i < n; i++) {
1085 ibin = (l_int32)(val / binsize);
1086 if (ibin >= 0 && ibin < nbins) {
1107 l_int32 i, j, ns, nd, index, count, val;
1108 l_float32 start, oldsize;
1111 PROCNAME(
"numaRebinHistogram");
1114 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
1116 return (
NUMA *)ERROR_PTR(
"newsize must be > 1", procName, NULL);
1118 return (
NUMA *)ERROR_PTR(
"no bins in nas", procName, NULL);
1120 nd = (ns + newsize - 1) / newsize;
1122 return (
NUMA *)ERROR_PTR(
"nad not made", procName, NULL);
1126 for (i = 0; i < nd; i++) {
1128 index = i * newsize;
1129 for (j = 0; j < newsize; j++) {
1157 l_float32 sum, factor, fval;
1160 PROCNAME(
"numaNormalizeHistogram");
1163 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
1165 return (
NUMA *)ERROR_PTR(
"tsum must be > 0.0", procName, NULL);
1167 return (
NUMA *)ERROR_PTR(
"no bins in nas", procName, NULL);
1170 factor = tsum / sum;
1173 return (
NUMA *)ERROR_PTR(
"nad not made", procName, NULL);
1176 for (i = 0; i < ns; i++) {
1240 l_float32 *pvariance,
1247 l_float32 minval, maxval, fval, mean, sum;
1250 PROCNAME(
"numaGetStatsUsingHistogram");
1252 if (pmin) *pmin = 0.0;
1253 if (pmax) *pmax = 0.0;
1254 if (pmean) *pmean = 0.0;
1255 if (pvariance) *pvariance = 0.0;
1256 if (pmedian) *pmedian = 0.0;
1257 if (prval) *prval = 0.0;
1258 if (phisto) *phisto = NULL;
1260 return ERROR_INT(
"na not defined", procName, 1);
1262 return ERROR_INT(
"numa is empty", procName, 1);
1266 if (pmin) *pmin = minval;
1267 if (pmax) *pmax = maxval;
1268 if (pmean || pvariance) {
1270 for (i = 0; i < n; i++) {
1274 mean = sum / (l_float32)n;
1275 if (pmean) *pmean = mean;
1279 for (i = 0; i < n; i++) {
1283 *pvariance = sum / (l_float32)n - mean * mean;
1286 if (!pmedian && !prval && !phisto)
1330 l_float32 *pxmedian,
1332 l_float32 *pxvariance)
1334 PROCNAME(
"numaGetHistogramStats");
1336 if (pxmean) *pxmean = 0.0;
1337 if (pxmedian) *pxmedian = 0.0;
1338 if (pxmode) *pxmode = 0.0;
1339 if (pxvariance) *pxvariance = 0.0;
1341 return ERROR_INT(
"nahisto not defined", procName, 1);
1344 pxmean, pxmedian, pxmode,
1381 l_float32 *pxmedian,
1383 l_float32 *pxvariance)
1386 l_float32 sum, sumval, halfsum, moment, var, x, y, ymax;
1388 PROCNAME(
"numaGetHistogramStatsOnInterval");
1390 if (pxmean) *pxmean = 0.0;
1391 if (pxmedian) *pxmedian = 0.0;
1392 if (pxmode) *pxmode = 0.0;
1393 if (pxvariance) *pxvariance = 0.0;
1395 return ERROR_INT(
"nahisto not defined", procName, 1);
1396 if (!pxmean && !pxmedian && !pxmode && !pxvariance)
1397 return ERROR_INT(
"nothing to compute", procName, 1);
1400 if (ilast <= 0) ilast = n - 1;
1401 if (ifirst < 0) ifirst = 0;
1402 if (ifirst > ilast || ifirst > n - 1)
1403 return ERROR_INT(
"ifirst is too large", procName, 1);
1404 for (sum = 0.0, moment = 0.0, var = 0.0, i = ifirst; i <= ilast ; i++) {
1405 x = startx + i * deltax;
1412 L_INFO(
"sum is 0\n", procName);
1417 *pxmean = moment / sum;
1419 *pxvariance = var / sum - moment * moment / (sum * sum);
1422 halfsum = sum / 2.0;
1423 for (sumval = 0.0, i = ifirst; i <= ilast; i++) {
1426 if (sumval >= halfsum) {
1427 *pxmedian = startx + i * deltax;
1436 for (i = ifirst; i <= ilast; i++) {
1443 *pxmode = startx + imax * deltax;
1470 l_float32 sum, fval;
1473 PROCNAME(
"numaMakeRankFromHistogram");
1475 if (pnax) *pnax = NULL;
1477 return ERROR_INT(
"&nay not defined", procName, 1);
1480 return ERROR_INT(
"nasy not defined", procName, 1);
1482 return ERROR_INT(
"no bins in nas", procName, 1);
1490 for (i = 0; i < n; i++) {
1499 startx, startx + n * deltax, npts,
1534 l_int32 i, ibinval, n;
1535 l_float32 startval, binsize, binval, maxval, fractval, total, sum, val;
1537 PROCNAME(
"numaHistogramGetRankFromVal");
1540 return ERROR_INT(
"prank not defined", procName, 1);
1543 return ERROR_INT(
"na not defined", procName, 1);
1546 if (rval < startval)
1548 maxval = startval + n * binsize;
1549 if (rval > maxval) {
1554 binval = (rval - startval) / binsize;
1555 ibinval = (l_int32)binval;
1560 fractval = binval - (l_float32)ibinval;
1563 for (i = 0; i < ibinval; i++) {
1568 sum += fractval * val;
1570 *prank = sum / total;
1606 l_float32 startval, binsize, rankcount, total, sum, fract, val;
1608 PROCNAME(
"numaHistogramGetValFromRank");
1611 return ERROR_INT(
"prval not defined", procName, 1);
1614 return ERROR_INT(
"na not defined", procName, 1);
1616 L_WARNING(
"rank < 0; setting to 0.0\n", procName);
1620 L_WARNING(
"rank > 1.0; setting to 1.0\n", procName);
1627 rankcount = rank * total;
1629 for (i = 0; i < n; i++) {
1631 if (sum + val >= rankcount)
1638 fract = (rankcount - sum) / val;
1642 *prval = startval + binsize * ((l_float32)i + fract);
1692 l_int32 i, j, npts, start, midfound, mcount, rightedge;
1693 l_float32 sum, midrank, endrank, val;
1695 PROCNAME(
"numaDiscretizeRankAndIntensity");
1697 if (pnarbin) *pnarbin = NULL;
1698 if (pnam) *pnam = NULL;
1699 if (pnar) *pnar = NULL;
1700 if (pnabb) *pnabb = NULL;
1701 if (!pnarbin && !pnam && !pnar && !pnabb)
1702 return ERROR_INT(
"no output requested", procName, 1);
1704 return ERROR_INT(
"na not defined", procName, 1);
1706 return ERROR_INT(
"nbins must be > 1", procName, 1);
1714 return ERROR_INT(
"nar not made", procName, 1);
1717 for (i = 0; i < npts; i++) {
1726 if (!nam || !narbin || !nabb) {
1731 return ERROR_INT(
"numa not made", procName, 1);
1741 for (i = 0; i < nbins; i++) {
1742 midrank = (l_float32)(i + 0.5) / (l_float32)(nbins);
1743 endrank = (l_float32)(i + 1.0) / (l_float32)(nbins);
1744 endrank = L_MAX(0.0, L_MIN(endrank - 0.001, 1.0));
1746 for (j = start; j < npts; j++) {
1749 if ((!midfound && val >= midrank) ||
1750 (mcount < nbins && j == npts - 1)) {
1755 if ((val >= endrank) || (j == npts - 1)) {
1768 if (mcount != nbins)
1769 L_WARNING(
"found data for %d bins; should be %d\n",
1770 procName, mcount, nbins);
1774 for (i = 0; i < nbins; i++) {
1776 for (j = start; j < npts; j++) {
1779 if (j > rightedge) {
1783 if (j == npts - 1) {
1835 l_int32 maxbins, discardval;
1836 l_float32 maxval, delx;
1838 PROCNAME(
"numaGetRankBinValues");
1840 if (pnarbin) *pnarbin = NULL;
1841 if (pnam) *pnam = NULL;
1842 if (!pnarbin && !pnam)
1843 return ERROR_INT(
"no output requested", procName, 1);
1845 return ERROR_INT(
"na not defined", procName, 1);
1847 return ERROR_INT(
"na is empty", procName, 1);
1849 return ERROR_INT(
"nbins must be > 1", procName, 1);
1853 maxbins = L_MIN(100002, (l_int32)maxval + 2);
1861 L_WARNING(
"scale change: delx = %6.2f\n", procName, delx);
1925 l_float32 scorefract,
1926 l_int32 *psplitindex,
1933 l_int32 i, n, bestsplit, minrange, maxrange, maxindex;
1934 l_float32 ave1, ave2, ave1prev, ave2prev;
1935 l_float32 num1, num2, num1prev, num2prev;
1936 l_float32 val, minval, sum, fract1;
1937 l_float32 norm, score, minscore, maxscore;
1938 NUMA *nascore, *naave1, *naave2, *nanum1, *nanum2;
1940 PROCNAME(
"numaSplitDistribution");
1942 if (psplitindex) *psplitindex = 0;
1943 if (pave1) *pave1 = 0.0;
1944 if (pave2) *pave2 = 0.0;
1945 if (pnum1) *pnum1 = 0.0;
1946 if (pnum2) *pnum2 = 0.0;
1947 if (pnascore) *pnascore = NULL;
1949 return ERROR_INT(
"na not defined", procName, 1);
1953 return ERROR_INT(
"n = 1 in histogram", procName, 1);
1956 return ERROR_INT(
"sum <= 0.0", procName, 1);
1957 norm = 4.0 / ((l_float32)(n - 1) * (n - 1));
1968 return ERROR_INT(
"nascore not made", procName, 1);
1974 for (i = 0; i < n; i++) {
1976 num1 = num1prev + val;
1980 ave1 = (num1prev * ave1prev + i * val) / num1;
1981 num2 = num2prev - val;
1985 ave2 = (num2prev * ave2prev - i * val) / num2;
1986 fract1 = num1 / sum;
1987 score = norm * (fract1 * (1 - fract1)) * (ave2 - ave1) * (ave2 - ave1);
1993 if (score > maxscore) {
2006 minscore = (1. - scorefract) * maxscore;
2007 for (i = maxindex - 1; i >= 0; i--) {
2013 for (i = maxindex + 1; i < n; i++) {
2020 bestsplit = minrange;
2021 for (i = minrange + 1; i <= maxrange; i++) {
2032 bestsplit = L_MIN(255, bestsplit + 1);
2034 if (psplitindex) *psplitindex = bestsplit;
2041 fprintf(stderr,
"minrange = %d, maxrange = %d\n", minrange, maxrange);
2042 fprintf(stderr,
"minval = %10.0f\n", minval);
2044 "Score for split distribution");
2045 *pnascore = nascore;
2092 NUMA *na1, *na2, *nad;
2094 PROCNAME(
"grayHistogramsToEMD");
2097 return ERROR_INT(
"&nad not defined", procName, 1);
2100 return ERROR_INT(
"na1 and na2 not both defined", procName, 1);
2103 return ERROR_INT(
"naa1 and naa2 numa counts differ", procName, 1);
2106 return ERROR_INT(
"naa1 and naa2 number counts differ", procName, 1);
2108 return ERROR_INT(
"na sizes must be 256", procName, 1);
2112 for (i = 0; i < n; i++) {
2157 l_float32 sum1, sum2, diff, total;
2158 l_float32 *array1, *array3;
2161 PROCNAME(
"numaEarthMoverDistance");
2164 return ERROR_INT(
"&dist not defined", procName, 1);
2167 return ERROR_INT(
"na1 and na2 not both defined", procName, 1);
2170 return ERROR_INT(
"na1 and na2 have different size", procName, 1);
2175 norm = (L_ABS(sum1 - sum2) < 0.00001 * L_ABS(sum1)) ? 1 : 0;
2185 for (i = 1; i < n; i++) {
2186 diff = array1[i - 1] - array3[i - 1];
2188 total += L_ABS(diff);
2190 *pdist = total / sum1;
2250 l_int32 i, j, n, nn;
2252 l_float32 mean, var, rvar;
2253 NUMA *na1, *na2, *na3, *na4;
2255 PROCNAME(
"grayInterHistogramStats");
2257 if (pnam) *pnam = NULL;
2258 if (pnams) *pnams = NULL;
2259 if (pnav) *pnav = NULL;
2260 if (pnarv) *pnarv = NULL;
2261 if (!pnam && !pnams && !pnav && !pnarv)
2262 return ERROR_INT(
"nothing requested", procName, 1);
2264 return ERROR_INT(
"naa not defined", procName, 1);
2266 for (i = 0; i < n; i++) {
2269 L_ERROR(
"%d numbers in numa[%d]\n", procName, nn, i);
2281 arrays = (l_float32 **)LEPT_CALLOC(n,
sizeof(l_float32 *));
2282 for (i = 0; i < n; i++) {
2293 for (j = 0; j < 256; j++) {
2295 for (i = 0; i < n; i++) {
2306 for (i = 0; i < n; i++)
2307 LEPT_FREE(arrays[i]);
2338 l_int32 i, k, n, maxloc, lloc, rloc;
2339 l_float32 fmaxval, sum, total, newtotal, val, lastval;
2340 l_float32 peakfract;
2343 PROCNAME(
"numaFindPeaks");
2346 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
2352 return (
NUMA *)ERROR_PTR(
"na not made", procName, NULL);
2353 if ((napeak =
numaCreate(4 * nmax)) == NULL) {
2355 return (
NUMA *)ERROR_PTR(
"napeak not made", procName, NULL);
2358 for (k = 0; k < nmax; k++) {
2360 if (newtotal == 0.0)
2366 for (i = maxloc - 1; i >= 0; --i) {
2372 if (val > fract1 * fmaxval) {
2377 if (lastval - val > fract2 * lastval) {
2387 for (i = maxloc + 1; i < n; ++i) {
2393 if (val > fract1 * fmaxval) {
2398 if (lastval - val > fract2 * lastval) {
2406 peakfract = sum / total;
2412 for (i = lloc; i <= rloc; i++)
2452 l_int32 i, n, found, loc, direction;
2453 l_float32 startval, val, maxval, minval;
2456 PROCNAME(
"numaFindExtrema");
2458 if (pnav) *pnav = NULL;
2460 return (
NUMA *)ERROR_PTR(
"nas not defined", procName, NULL);
2475 for (i = 1; i < n; i++) {
2477 if (L_ABS(val - startval) >= delta) {
2487 if (val > startval) {
2498 for (i = i + 1; i < n; i++) {
2500 if (direction == 1 && val > maxval ) {
2503 }
else if (direction == -1 && val < minval ) {
2506 }
else if (direction == 1 && (maxval - val >= delta)) {
2512 }
else if (direction == -1 && (val - minval >= delta)) {
2545 l_float32 minreversal,
2550 l_float32 delx, len;
2553 PROCNAME(
"numaCountReversals");
2556 if (pnrpl) *pnrpl = 0.0;
2558 return ERROR_INT(
"neither &nr nor &nrpl are defined", procName, 1);
2560 return ERROR_INT(
"nas not defined", procName, 1);
2569 *pnrpl = (l_float32)nr / len;
2608 l_float32 estthresh,
2609 l_float32 *pbestthresh)
2611 l_int32 i, inrun, istart, iend, maxstart, maxend, runlen, maxrunlen;
2612 l_int32 val, maxval, nmax, count;
2613 l_float32 thresh, fmaxval, fmodeval;
2616 PROCNAME(
"numaSelectCrossingThreshold");
2619 return ERROR_INT(
"&bestthresh not defined", procName, 1);
2622 return ERROR_INT(
"nay not defined", procName, 1);
2626 for (i = 0; i < 41; i++) {
2627 thresh = estthresh - 80.0 + 4.0 * i;
2636 maxval = (l_int32)fmaxval;
2638 for (i = 0; i < 41; i++) {
2645 if (count > nmax && fmodeval > 0.5 * fmaxval)
2646 maxval = (l_int32)fmodeval;
2651 maxrunlen = 0, maxstart = 0, maxend = 0;
2652 for (i = 0; i < 41; i++) {
2654 if (val == maxval) {
2661 if (inrun && (val != maxval)) {
2663 runlen = iend - istart + 1;
2665 if (runlen > maxrunlen) {
2673 runlen = i - istart;
2674 if (runlen > maxrunlen) {
2681 *pbestthresh = estthresh - 80.0 + 2.0 * (l_float32)(maxstart + maxend);
2684 fprintf(stderr,
"\nCrossings attain a maximum at %d thresholds, between:\n" 2685 " thresh[%d] = %5.1f and thresh[%d] = %5.1f\n",
2686 nmax, maxstart, estthresh - 80.0 + 4.0 * maxstart,
2687 maxend, estthresh - 80.0 + 4.0 * maxend);
2688 fprintf(stderr,
"The best choice: %5.1f\n", *pbestthresh);
2689 fprintf(stderr,
"Number of crossings at the 41 thresholds:");
2718 l_float32 startx, delx;
2719 l_float32 xval1, xval2, yval1, yval2, delta1, delta2, crossval, fract;
2722 PROCNAME(
"numaCrossingsByThreshold");
2725 return (
NUMA *)ERROR_PTR(
"nay not defined", procName, NULL);
2729 return (
NUMA *)ERROR_PTR(
"nax and nay sizes differ", procName, NULL);
2738 for (i = 1; i < n; i++) {
2743 xval2 = startx + i * delx;
2744 delta1 = yval1 - thresh;
2745 delta2 = yval2 - thresh;
2746 if (delta1 == 0.0) {
2748 }
else if (delta2 == 0.0) {
2750 }
else if (delta1 * delta2 < 0.0) {
2751 fract = L_ABS(delta1) / L_ABS(yval1 - yval2);
2752 crossval = xval1 + fract * (xval2 - xval1);
2782 l_int32 i, j, n, np, previndex, curindex;
2783 l_float32 startx, delx;
2784 l_float32 xval1, xval2, yval1, yval2, delta1, delta2;
2785 l_float32 prevval, curval, thresh, crossval, fract;
2788 PROCNAME(
"numaCrossingsByPeaks");
2791 return (
NUMA *)ERROR_PTR(
"nay not defined", procName, NULL);
2795 return (
NUMA *)ERROR_PTR(
"nax and nay sizes differ", procName, NULL);
2803 L_INFO(
"Number of crossings: %d\n", procName, np);
2810 for (i = 0; i < np; i++) {
2813 thresh = (prevval + curval) / 2.0;
2817 xval1 = startx + previndex * delx;
2819 for (j = previndex + 1; j <= curindex; j++) {
2823 xval2 = startx + j * delx;
2825 delta1 = yval1 - thresh;
2826 delta2 = yval2 - thresh;
2827 if (delta1 == 0.0) {
2830 }
else if (delta2 == 0.0) {
2833 }
else if (delta1 * delta2 < 0.0) {
2834 fract = L_ABS(delta1) / L_ABS(yval1 - yval2);
2835 crossval = xval1 + fract * (xval2 - xval1);
2842 previndex = curindex;
2891 l_float32 relweight,
2896 l_float32 *pbestwidth,
2897 l_float32 *pbestshift,
2898 l_float32 *pbestscore)
2901 l_float32 delwidth, delshift, width, shift, score;
2902 l_float32 bestwidth, bestshift, bestscore;
2904 PROCNAME(
"numaEvalBestHaarParameters");
2906 if (pbestscore) *pbestscore = 0.0;
2907 if (pbestwidth) *pbestwidth = 0.0;
2908 if (pbestshift) *pbestshift = 0.0;
2909 if (!pbestwidth || !pbestshift)
2910 return ERROR_INT(
"&bestwidth and &bestshift not defined", procName, 1);
2912 return ERROR_INT(
"nas not defined", procName, 1);
2914 bestscore = bestwidth = bestshift = 0.0;
2915 delwidth = (maxwidth - minwidth) / (nwidth - 1.0);
2916 for (i = 0; i < nwidth; i++) {
2917 width = minwidth + delwidth * i;
2918 delshift = width / (l_float32)(nshift);
2919 for (j = 0; j < nshift; j++) {
2920 shift = j * delshift;
2922 if (score > bestscore) {
2927 fprintf(stderr,
"width = %7.3f, shift = %7.3f, score = %7.3f\n",
2928 width, shift, score);
2934 *pbestwidth = bestwidth;
2935 *pbestshift = bestshift;
2937 *pbestscore = bestscore;
2978 l_float32 relweight,
2981 l_int32 i, n, nsamp, index;
2982 l_float32 score, weight, val;
2984 PROCNAME(
"numaEvalHaarSum");
2987 return ERROR_INT(
"&score not defined", procName, 1);
2990 return ERROR_INT(
"nas not defined", procName, 1);
2992 return ERROR_INT(
"nas size too small", procName, 1);
2995 nsamp = (l_int32)((n - shift) / width);
2996 for (i = 0; i < nsamp; i++) {
2997 index = (l_int32)(shift + i * width);
2998 weight = (i % 2) ? 1.0 : -1.0 * relweight;
3000 score += weight * val;
3003 *pscore = 2.0 * width * score / (l_float32)n;
3037 l_int32 i, nsets, val;
3041 PROCNAME(
"genConstrainedNumaInRange");
3043 first = L_MAX(0, first);
3045 return (
NUMA *)ERROR_PTR(
"last < first!", procName, NULL);
3047 return (
NUMA *)ERROR_PTR(
"nmax < 1!", procName, NULL);
3049 nsets = L_MIN(nmax, last - first + 1);
3053 return (
NUMA *)ERROR_PTR(
"nsets == 0", procName, NULL);
3060 delta = (l_float32)(last - first) / (nsets - 1);
3062 delta = (l_float32)(last - first - 1) / (nsets - 1);
3066 for (i = 0; i < nsets; i++) {
3067 val = (l_int32)(first + i * delta + 0.5);
l_int32 numaDiscretizeRankAndIntensity(NUMA *na, l_int32 nbins, NUMA **pnarbin, NUMA **pnam, NUMA **pnar, NUMA **pnabb)
numaDiscretizeRankAndIntensity()
l_int32 gplotSimple1(NUMA *na, l_int32 outformat, const char *outroot, const char *title)
gplotSimple1()
l_int32 numaSetCount(NUMA *na, l_int32 newcount)
numaSetCount()
NUMA * numaFindExtrema(NUMA *nas, l_float32 delta, NUMA **pnav)
numaFindExtrema()
NUMA * numaDilate(NUMA *nas, l_int32 size)
numaDilate()
NUMA * numaCrossingsByPeaks(NUMA *nax, NUMA *nay, l_float32 delta)
numaCrossingsByPeaks()
l_int32 numaAddNumber(NUMA *na, l_float32 val)
numaAddNumber()
NUMA * numaConvertToInt(NUMA *nas)
numaConvertToInt()
NUMA * numaMakeHistogram(NUMA *na, l_int32 maxbins, l_int32 *pbinsize, l_int32 *pbinstart)
numaMakeHistogram()
l_int32 grayInterHistogramStats(NUMAA *naa, l_int32 wc, NUMA **pnam, NUMA **pnams, NUMA **pnav, NUMA **pnarv)
grayInterHistogramStats()
l_int32 numaHasOnlyIntegers(NUMA *na, l_int32 maxsamples, l_int32 *pallints)
numaHasOnlyIntegers()
NUMA * numaFindPeaks(NUMA *nas, l_int32 nmax, l_float32 fract1, l_float32 fract2)
numaFindPeaks()
l_int32 numaaGetNumberCount(NUMAA *naa)
numaaGetNumberCount()
l_int32 numaGetMax(NUMA *na, l_float32 *pmaxval, l_int32 *pimaxloc)
numaGetMax()
NUMA * numaRebinHistogram(NUMA *nas, l_int32 newsize)
numaRebinHistogram()
l_int32 numaGetHistogramStats(NUMA *nahisto, l_float32 startx, l_float32 deltax, l_float32 *pxmean, l_float32 *pxmedian, l_float32 *pxmode, l_float32 *pxvariance)
numaGetHistogramStats()
NUMA * numaMakeConstant(l_float32 val, l_int32 size)
numaMakeConstant()
l_int32 numaGetFValue(NUMA *na, l_int32 index, l_float32 *pval)
numaGetFValue()
l_int32 numaEarthMoverDistance(NUMA *na1, NUMA *na2, l_float32 *pdist)
numaEarthMoverDistance()
NUMA * numaErode(NUMA *nas, l_int32 size)
numaErode()
NUMA * numaMakeHistogramClipped(NUMA *na, l_float32 binsize, l_float32 maxsize)
numaMakeHistogramClipped()
NUMA * numaCreate(l_int32 n)
numaCreate()
l_int32 numaGetSum(NUMA *na, l_float32 *psum)
numaGetSum()
NUMA * numaWindowedMedian(NUMA *nas, l_int32 halfwin)
numaWindowedMedian()
NUMA * numaClipToInterval(NUMA *nas, l_int32 first, l_int32 last)
numaClipToInterval()
l_int32 numaGetParameters(NUMA *na, l_float32 *pstartx, l_float32 *pdelx)
numaGetParameters()
l_int32 numaSimpleStats(NUMA *na, l_int32 first, l_int32 last, l_float32 *pmean, l_float32 *pvar, l_float32 *prvar)
numaSimpleStats()
NUMA * numaRemoveBorder(NUMA *nas, l_int32 left, l_int32 right)
numaRemoveBorder()
l_int32 numaWindowedVariance(NUMA *nam, NUMA *nams, NUMA **pnav, NUMA **pnarv)
numaWindowedVariance()
NUMA * genConstrainedNumaInRange(l_int32 first, l_int32 last, l_int32 nmax, l_int32 use_pairs)
genConstrainedNumaInRange()
NUMA * numaaGetNuma(NUMAA *naa, l_int32 index, l_int32 accessflag)
numaaGetNuma()
NUMA * numaClose(NUMA *nas, l_int32 size)
numaClose()
l_int32 grayHistogramsToEMD(NUMAA *naa1, NUMAA *naa2, NUMA **pnad)
grayHistogramsToEMD()
l_int32 numaGetCount(NUMA *na)
numaGetCount()
l_int32 numaSplitDistribution(NUMA *na, l_float32 scorefract, l_int32 *psplitindex, l_float32 *pave1, l_float32 *pave2, l_float32 *pnum1, l_float32 *pnum2, NUMA **pnascore)
numaSplitDistribution()
l_int32 numaEvalHaarSum(NUMA *nas, l_float32 width, l_float32 shift, l_float32 relweight, l_float32 *pscore)
numaEvalHaarSum()
l_int32 numaHistogramGetRankFromVal(NUMA *na, l_float32 rval, l_float32 *prank)
numaHistogramGetRankFromVal()
l_int32 numaGetHistogramStatsOnInterval(NUMA *nahisto, l_float32 startx, l_float32 deltax, l_int32 ifirst, l_int32 ilast, l_float32 *pxmean, l_float32 *pxmedian, l_float32 *pxmode, l_float32 *pxvariance)
numaGetHistogramStatsOnInterval()
NUMA * numaAddSpecifiedBorder(NUMA *nas, l_int32 left, l_int32 right, l_int32 type)
numaAddSpecifiedBorder()
NUMA * numaWindowedMeanSquare(NUMA *nas, l_int32 wc)
numaWindowedMeanSquare()
NUMA * numaOpen(NUMA *nas, l_int32 size)
numaOpen()
l_int32 numaSelectCrossingThreshold(NUMA *nax, NUMA *nay, l_float32 estthresh, l_float32 *pbestthresh)
numaSelectCrossingThreshold()
NUMA * numaMakeHistogramAuto(NUMA *na, l_int32 maxbins)
numaMakeHistogramAuto()
l_int32 numaGetRankBinValues(NUMA *na, l_int32 nbins, NUMA **pnarbin, NUMA **pnam)
numaGetRankBinValues()
l_int32 numaWindowedStats(NUMA *nas, l_int32 wc, NUMA **pnam, NUMA **pnams, NUMA **pnav, NUMA **pnarv)
numaWindowedStats()
l_int32 numaEvalBestHaarParameters(NUMA *nas, l_float32 relweight, l_int32 nwidth, l_int32 nshift, l_float32 minwidth, l_float32 maxwidth, l_float32 *pbestwidth, l_float32 *pbestshift, l_float32 *pbestscore)
numaEvalBestHaarParameters()
l_int32 numaSetParameters(NUMA *na, l_float32 startx, l_float32 delx)
numaSetParameters()
l_int32 numaHistogramGetValFromRank(NUMA *na, l_float32 rank, l_float32 *prval)
numaHistogramGetValFromRank()
NUMA * numaCopy(NUMA *na)
numaCopy()
NUMA * numaAddBorder(NUMA *nas, l_int32 left, l_int32 right, l_float32 val)
numaAddBorder()
l_int32 numaInterpolateEqxInterval(l_float32 startx, l_float32 deltax, NUMA *nasy, l_int32 type, l_float32 x0, l_float32 x1, l_int32 npts, NUMA **pnax, NUMA **pnay)
numaInterpolateEqxInterval()
void numaDestroy(NUMA **pna)
numaDestroy()
NUMA * numaCrossingsByThreshold(NUMA *nax, NUMA *nay, l_float32 thresh)
numaCrossingsByThreshold()
l_int32 numaGetStatsUsingHistogram(NUMA *na, l_int32 maxbins, l_float32 *pmin, l_float32 *pmax, l_float32 *pmean, l_float32 *pvariance, l_float32 *pmedian, l_float32 rank, l_float32 *prval, NUMA **phisto)
numaGetStatsUsingHistogram()
NUMA * numaTransform(NUMA *nas, l_float32 shift, l_float32 scale)
numaTransform()
l_int32 numaCopyParameters(NUMA *nad, NUMA *nas)
numaCopyParameters()
l_int32 numaGetMin(NUMA *na, l_float32 *pminval, l_int32 *piminloc)
numaGetMin()
NUMA * numaWindowedMean(NUMA *nas, l_int32 wc)
numaWindowedMean()
l_float32 * numaGetFArray(NUMA *na, l_int32 copyflag)
numaGetFArray()
l_int32 numaaGetCount(NUMAA *naa)
numaaGetCount()
l_int32 numaaGetNumaCount(NUMAA *naa, l_int32 index)
numaaGetNumaCount()
l_int32 numaSetValue(NUMA *na, l_int32 index, l_float32 val)
numaSetValue()
l_int32 numaCountReversals(NUMA *nas, l_float32 minreversal, l_int32 *pnr, l_float32 *pnrpl)
numaCountReversals()
l_int32 numaGetMode(NUMA *na, l_float32 *pval, l_int32 *pcount)
numaGetMode()
l_int32 numaGetMedian(NUMA *na, l_float32 *pval)
numaGetMedian()
NUMA * numaNormalizeHistogram(NUMA *nas, l_float32 tsum)
numaNormalizeHistogram()
l_int32 numaGetIValue(NUMA *na, l_int32 index, l_int32 *pival)
numaGetIValue()
l_int32 numaMakeRankFromHistogram(l_float32 startx, l_float32 deltax, NUMA *nasy, l_int32 npts, NUMA **pnax, NUMA **pnay)
numaMakeRankFromHistogram()
l_int32 numaWriteStream(FILE *fp, NUMA *na)
numaWriteStream()