1 #ifndef VBL_LOCAL_MINIMA_TXX_ 2 #define VBL_LOCAL_MINIMA_TXX_ 8 # include <vcl_msvc_warnings.h> 15 const unsigned int n = (
unsigned int)(in.
size());
16 assert(minima.
size()==n);
21 bool minima_found =
false;
22 for (
unsigned int i=0; i<n; ++i)
25 for (
unsigned int c=1; c<n-1; ++c) {
26 T dm = in[c-1]-in[c], dp = in[c+1]-in[c];
27 if (dm>thresh && dp > thresh) {
37 if ((in[1]-in[0])>thresh) {
38 minima[0]=in[1]-in[0];
42 if ((in[n-2]-in[n-1])>thresh) {
43 minima[n-1]=in[n-2]-in[n-1];
53 const unsigned int nr = (
unsigned int)(in.
rows()), nc = (
unsigned int)(in.
cols());
54 assert(nr==minima.
rows() && nc==minima.
cols());
59 bool minima_found =
false;
60 T mval = std::numeric_limits<T>::max();
61 for (
unsigned r = 0; r<nr; ++r)
62 for (
unsigned c = 0; c<nc; ++c)
70 for (
unsigned r = 1; r<nr-1; ++r)
71 for (
unsigned c = 1; c<nc-1; ++c) {
77 ul = in[r-1][c-1] - in[r][c];
78 um = in[r-1][c] - in[r][c];
79 ur = in[r-1][c] - in[r][c];
80 lf = in[r][c-1] - in[r][c];
81 ri = in[r][c+1] - in[r][c];
82 ll = in[r+1][c-1] - in[r][c];
83 lm = in[r+1][c] - in[r][c];
84 lr = in[r+1][c+1] - in[r][c];
86 if (ul<=thresh)
continue;
if (ul<dmin) dmin = ul;
87 if (um<=thresh)
continue;
if (um<dmin) dmin = um;
88 if (ur<=thresh)
continue;
if (ur<dmin) dmin = ur;
89 if (lf<=thresh)
continue;
if (lf<dmin) dmin = lf;
90 if (ri<=thresh)
continue;
if (ri<dmin) dmin = ri;
91 if (ll<=thresh)
continue;
if (ll<dmin) dmin = ll;
92 if (lm<=thresh)
continue;
if (lm<dmin) dmin = lm;
93 if (lr<=thresh)
continue;
if (lr<dmin) dmin = lr;
102 for (
unsigned c = 1; c<nc-1; ++c) {
107 lf = in[0][c-1] - in[0][c];
108 ri = in[0][c+1] - in[0][c];
109 ll = in[1][c-1] - in[0][c];
110 lm = in[1][c] - in[0][c];
111 lr = in[1][c+1] - in[0][c];
113 if (lf<=thresh)
continue;
if (lf<dmin) dmin = lf;
114 if (ri<=thresh)
continue;
if (ri<dmin) dmin = ri;
115 if (ll<=thresh)
continue;
if (ll<dmin) dmin = ll;
116 if (lm<=thresh)
continue;
if (lm<dmin) dmin = lm;
117 if (lr<=thresh)
continue;
if (lr<dmin) dmin = lr;
123 for (
unsigned c = 1; c<nc-1; ++c) {
128 ul = in[nr-2][c-1] - in[nr-1][c];
129 um = in[nr-2][c] - in[nr-1][c];
130 ur = in[nr-2][c+1] - in[nr-1][c];
131 lf = in[nr-1][c-1] - in[nr-1][c];
132 ri = in[nr-1][c+1] - in[nr-1][c];
134 if (ul<=thresh)
continue;
if (ul<dmin) dmin = ul;
135 if (um<=thresh)
continue;
if (um<dmin) dmin = um;
136 if (ur<=thresh)
continue;
if (ur<dmin) dmin = ur;
137 if (lf<=thresh)
continue;
if (lf<dmin) dmin = lf;
138 if (ri<=thresh)
continue;
if (ri<dmin) dmin = ri;
140 minima[nr-1][c] = dmin;
147 for (
unsigned r = 1; r<nr-1; ++r) {
151 um = in[r-1][0] - in[r][0];
152 ur = in[r-1][1] - in[r][0];
153 ri = in[r][1] - in[r][0];
154 lm = in[r+1][0] - in[r][0];
155 lr = in[r+1][1] - in[r][0];
157 if (um<=thresh)
continue;
if (um<dmin) dmin = um;
158 if (ur<=thresh)
continue;
if (ur<dmin) dmin = ur;
159 if (ri<=thresh)
continue;
if (ri<dmin) dmin = ri;
160 if (lm<=thresh)
continue;
if (lm<dmin) dmin = lm;
161 if (lr<=thresh)
continue;
if (lr<dmin) dmin = lr;
168 for (
unsigned r = 1; r<nr-1; ++r) {
172 ul = in[r-1][nc-2] - in[r][nc-1];
173 um = in[r-1][nc-1] - in[r][nc-1];
174 lf = in[r][nc-2] - in[r][nc-1];
175 ll = in[r+1][nc-2] - in[r][nc-1];
176 lm = in[r+1][nc-1] - in[r][nc-1];
178 if (ul<=thresh)
continue;
if (ul<dmin) dmin = ul;
179 if (um<=thresh)
continue;
if (um<dmin) dmin = um;
180 if (lf<=thresh)
continue;
if (lf<dmin) dmin = lf;
181 if (ll<=thresh)
continue;
if (ll<dmin) dmin = ll;
182 if (lm<=thresh)
continue;
if (lm<dmin) dmin = lm;
184 minima[r][nc-1] = dmin;
194 ri = in[0][1] - in[0][0];
195 lm = in[1][0] - in[0][0];
196 lr = in[1][1] - in[0][0];
198 if (ri<=thresh) fail =
true;
if (ri<dmin) dmin = ri;
199 if (lm<=thresh) fail =
true;
if (lm<dmin) dmin = lm;
200 if (lr<=thresh) fail =
true;
if (lr<dmin) dmin = lr;
209 lf = in[0][nc-2] - in[0][nc-1];
210 lm = in[1][nc-1] - in[0][nc-1];
211 ll = in[1][nc-2] - in[0][nc-1];
213 if (lf<=thresh) fail =
true;
if (lf<dmin) dmin = lf;
214 if (lm<=thresh) fail =
true;
if (lm<dmin) dmin = lm;
215 if (ll<=thresh) fail =
true;
if (ll<dmin) dmin = ll;
217 minima[0][nc-1] = dmin;
224 ul = in[nr-2][nc-2] - in[nr-1][nc-1];
225 um = in[nr-2][nc-1] - in[nr-1][nc-1];
226 lf = in[nr-1][nc-2] - in[nr-1][nc-1];
228 if (ul<=thresh) fail =
true;
if (ul<dmin) dmin = ul;
229 if (um<=thresh) fail =
true;
if (um<dmin) dmin = um;
230 if (lf<=thresh) fail =
true;
if (lf<dmin) dmin = lf;
232 minima[nr-1][nc-1] = dmin;
239 ur = in[nr-2][1] - in[nr-1][0];
240 um = in[nr-2][0] - in[nr-1][0];
241 ri = in[nr-1][1] - in[nr-1][0];
243 if (ur<=thresh) fail =
true;
if (ur<dmin) dmin = ur;
244 if (um<=thresh) fail =
true;
if (um<dmin) dmin = um;
245 if (ri<=thresh) fail =
true;
if (ri<dmin) dmin = ri;
247 minima[nr-1][0] = dmin;
264 if (n3<2||n2<2||n1<2)
266 bool minima_found =
false;
267 unsigned int x3=0, x2=0, x1=0;
268 for (x3 = 0; x3<n3; ++x3)
269 for (x2 = 0; x2<n2; ++x2)
270 for (x1 = 0; x1<n1; ++x1)
271 minima[x1][x2][x3] = T(0);
274 const T mval = std::numeric_limits<T>::max();
276 if (n3>2||n2>2||n1>2)
277 for (x3 = 1; x3<n3-1; ++x3)
278 for (x2 = 1; x2<n2-1; ++x2)
279 for (x1 = 1; x1<n1-1; ++x1) {
283 for (
int k3 = -1; k3<=1;++k3)
284 for (
int k2 = -1; k2<=1;++k2)
285 for (
int k1 = -1; k1<=1;++k1)
286 if (k1!=0||k2!=0||k3!=0) {
287 d = in[x1+k1][x2+k2][x3+k3]-v;
288 if (d<=thresh) {fail =
true;
break;}
289 if (d<mind) mind = d;
292 minima[x1][x2][x3]=mind;
300 for (x3 = 1; x3<n3-1; ++x3)
301 for (x2 = 1; x2<n2-1; ++x2) {
302 mind = mval; fail =
false;
304 for (
int k3 = -1; k3<=1;++k3)
305 for (
int k2 = -1; k2<=1;++k2)
306 for (
int k1 = 0; k1<=1;++k1)
307 if (k3!=0||k2!=0||k1!=0) {
308 d = in[x1+k1][x2+k2][x3+k3]-v;
if (d<=thresh) {fail=
true;
break;}
309 if (d<mind) mind = d;
312 minima[x1][x2][x3]=mind;
318 for (x3 = 1; x3<n3-1; ++x3)
319 for (x2 = 1; x2<n2-1; ++x2) {
320 mind = mval; fail =
false;
322 for (
int k3 = -1; k3<=1;++k3)
323 for (
int k2 = -1; k2<=1;++k2)
324 for (
int k1 = -1; k1<=0;++k1)
325 if (k3!=0||k2!=0||k1!=0) {
326 d = in[x1+k1][x2+k2][x3+k3]-v;
if (d<=thresh) {fail=
true;
break;}
327 if (d<mind) mind = d;
330 minima[x1][x2][x3]=mind;
338 for (x3 = 1; x3<n3-1; ++x3)
339 for (x1 = 1; x1<n1-1; ++x1) {
340 mind = mval; fail =
false;
342 for (
int k3 = -1; k3<=1;++k3)
343 for (
int k2 = 0; k2<=1;++k2)
344 for (
int k1 = -1; k1<=1;++k1)
345 if (k3!=0||k2!=0||k1!=0) {
346 d = in[x1+k1][x2+k2][x3+k3]-v;
if (d<=thresh) {fail=
true;
break;}
347 if (d<mind) mind = d;
350 minima[x1][x2][x3]=mind;
356 for (x3 = 1; x3<n3-1; ++x3)
357 for (x1 = 1; x1<n1-1; ++x1) {
358 mind = mval; fail =
false;
360 for (
int k3 = -1; k3<=1;++k3)
361 for (
int k2 = -1; k2<=0;++k2)
362 for (
int k1 = -1; k1<=1;++k1)
363 if (k3!=0||k2!=0||k1!=0) {
364 d = in[x1+k1][x2+k2][x3+k3]-v;
if (d<=thresh) {fail=
true;
break;}
365 if (d<mind) mind = d;
368 minima[x1][x2][x3]=mind;
377 for (x2 = 1; x2<n2-1; ++x2)
378 for (x1 = 1; x1<n1-1; ++x1) {
379 mind = mval; fail =
false;
381 for (
int k3 = 0; k3<=1;++k3)
382 for (
int k2 = -1; k2<=1;++k2)
383 for (
int k1 = -1; k1<=1;++k1)
384 if (k3!=0||k2!=0||k1!=0) {
385 d = in[x1+k1][x2+k2][x3+k3]-v;
if (d<=thresh) {fail=
true;
break;}
386 if (d<mind) mind = d;
389 minima[x1][x2][x3]=mind;
395 for (x2 = 1; x2<n2-1; ++x2)
396 for (x1 = 1; x1<n1-1; ++x1) {
397 mind = mval; fail =
false;
399 for (
int k3 = -1; k3<=0;++k3)
400 for (
int k2 = -1; k2<=1;++k2)
401 for (
int k1 = -1; k1<=1;++k1)
402 if (k3!=0||k2!=0||k1!=0) {
403 d = in[x1+k1][x2+k2][x3+k3]-v;
if (d<=thresh) {fail=
true;
break;}
404 if (d<mind) mind = d;
407 minima[x1][x2][x3]=mind;
418 for (x1 = 1; x1<n1-1; ++x1) {
419 mind = mval; fail =
false;
421 for (
int k3 = 0; k3<=1;++k3)
422 for (
int k2 = 0; k2<=1;++k2)
423 for (
int k1 = -1; k1<=1;++k1)
424 if (k3!=0||k2!=0||k1!=0) {
425 d = in[x1+k1][x2+k2][x3+k3]-v;
if (d<=thresh) {fail=
true;
break;}
426 if (d<mind) mind = d;
429 minima[x1][x2][x3]=mind;
434 for (x1 = 1; x1<n1-1; ++x1) {
435 mind = mval; fail =
false;
437 for (
int k3 = 0; k3<=1;++k3)
438 for (
int k2 = 0; k2<=1;++k2)
439 for (
int k1 = -1; k1<=1;++k1)
440 if (k3!=0||k2!=0||k1!=0) {
441 d = in[x1+k1][x2+k2][x3+k3]-v;
if (d<=thresh) {fail=
true;
break;}
442 if (d<mind) mind = d;
445 minima[x1][x2][x3]=mind;
450 for (x1 = 1; x1<n1-1; ++x1) {
451 mind = mval; fail =
false;
453 for (
int k3 = 0; k3<=1;++k3)
454 for (
int k2 = -1; k2<=0;++k2)
455 for (
int k1 = -1; k1<=1;++k1)
456 if (k3!=0||k2!=0||k1!=0) {
457 d = in[x1+k1][x2+k2][x3+k3]-v;
if (d<=thresh) {fail=
true;
break;}
458 if (d<mind) mind = d;
461 minima[x1][x2][x3]=mind;
465 x3 = n3-1; x2 = n2-1;
466 for (x1 = 1; x1<n1-1; ++x1) {
467 mind = mval; fail =
false;
469 for (
int k3 = -1; k3<=0;++k3)
470 for (
int k2 = -1; k2<=0;++k2)
471 for (
int k1 = -1; k1<=1;++k1)
472 if (k3!=0||k2!=0||k1!=0) {
473 d = in[x1+k1][x2+k2][x3+k3]-v;
if (d<=thresh) {fail=
true;
break;}
474 if (d<mind) mind = d;
477 minima[x1][x2][x3]=mind;
486 for (x2 = 1; x2<n2-1; ++x2) {
487 mind = mval; fail =
false;
489 for (
int k3 = 0; k3<=1;++k3)
490 for (
int k2 = -1; k2<=1;++k2)
491 for (
int k1 = 0; k1<=1;++k1)
492 if (k3!=0||k2!=0||k1!=0) {
493 d = in[x1+k1][x2+k2][x3+k3]-v;
if (d<=thresh) {fail=
true;
break;}
494 if (d<mind) mind = d;
497 minima[x1][x2][x3]=mind;
502 for (x2 = 1; x2<n2-1; ++x2) {
503 mind = mval; fail =
false;
505 for (
int k3 = -1; k3<=0;++k3)
506 for (
int k2 = -1; k2<=1;++k2)
507 for (
int k1 = 0; k1<=1;++k1)
508 if (k3!=0||k2!=0||k1!=0) {
509 d = in[x1+k1][x2+k2][x3+k3]-v;
if (d<=thresh) {fail=
true;
break;}
510 if (d<mind) mind = d;
513 minima[x1][x2][x3]=mind;
518 for (x2 = 1; x2<n2-1; ++x2) {
519 mind = mval; fail =
false;
521 for (
int k3 = 0; k3<=1;++k3)
522 for (
int k2 = -1; k2<=1;++k2)
523 for (
int k1 = -1; k1<=0;++k1)
524 if (k3!=0||k2!=0||k1!=0) {
525 d = in[x1+k1][x2+k2][x3+k3]-v;
if (d<=thresh) {fail=
true;
break;}
526 if (d<mind) mind = d;
529 minima[x1][x2][x3]=mind;
533 x3 = n3-1; x1 = n1-1;
534 for (x2 = 1; x2<n2-1; ++x2) {
535 mind = mval; fail =
false;
537 for (
int k3 = -1; k3<=0;++k3)
538 for (
int k2 = -1; k2<=1;++k2)
539 for (
int k1 = -1; k1<=0;++k1)
540 if (k3!=0||k2!=0||k1!=0) {
541 d = in[x1+k1][x2+k2][x3+k3]-v;
if (d<=thresh) {fail=
true;
break;}
542 if (d<mind) mind = d;
545 minima[x1][x2][x3]=mind;
554 for (x3 = 1; x3<n3-1; ++x3) {
555 mind = mval; fail =
false;
557 for (
int k3 = -1; k3<=1;++k3)
558 for (
int k2 = 0; k2<=1;++k2)
559 for (
int k1 = 0; k1<=1;++k1)
560 if (k3!=0||k2!=0||k1!=0) {
561 d = in[x1+k1][x2+k2][x3+k3]-v;
if (d<=thresh) {fail=
true;
break;}
562 if (d<mind) mind = d;
565 minima[x1][x2][x3]=mind;
570 for (x3 = 1; x3<n3-1; ++x3) {
571 mind = mval; fail =
false;
573 for (
int k3 = -1; k3<=1;++k3)
574 for (
int k2 = -1; k2<=0;++k2)
575 for (
int k1 = 0; k1<=1;++k1)
576 if (k3!=0||k2!=0||k1!=0) {
577 d = in[x1+k1][x2+k2][x3+k3]-v;
if (d<=thresh) {fail=
true;
break;}
578 if (d<mind) mind = d;
581 minima[x1][x2][x3]=mind;
586 for (x3 = 1; x3<n3-1; ++x3) {
587 mind = mval; fail =
false;
589 for (
int k3 = -1; k3<=1;++k3)
590 for (
int k2 = 0; k2<=1;++k2)
591 for (
int k1 = -1; k1<=0;++k1)
592 if (k3!=0||k2!=0||k1!=0) {
593 d = in[x1+k1][x2+k2][x3+k3]-v;
if (d<=thresh) {fail=
true;
break;}
594 if (d<mind) mind = d;
597 minima[x1][x2][x3]=mind;
601 x2 = n2-1; x1 = n1-1;
602 for (x3 = 1; x3<n3-1; ++x3) {
603 mind = mval; fail =
false;
605 for (
int k3 = -1; k3<=1;++k3)
606 for (
int k2 = -1; k2<=0;++k2)
607 for (
int k1 = -1; k1<=0;++k1)
608 if (k3!=0||k2!=0||k1!=0) {
609 d = in[x1+k1][x2+k2][x3+k3]-v;
if (d<=thresh) {fail=
true;
break;}
610 if (d<mind) mind = d;
613 minima[x1][x2][x3]=mind;
622 mind = mval; fail =
false;
623 for (
int k3 = 0; k3<=1;++k3)
624 for (
int k2 = 0; k2<=1;++k2)
625 for (
int k1 = 0; k1<=1;++k1)
626 if (k3!=0||k2!=0||k1!=0) {
627 d = in[x1+k1][x2+k2][x3+k3]-v;
if (d<=thresh) {fail=
true;
break;}
628 if (d<mind) mind = d;
631 minima[x1][x2][x3]=mind;
637 mind = mval; fail =
false;
638 for (
int k3 = -1; k3<=0;++k3)
639 for (
int k2 = 0; k2<=1;++k2)
640 for (
int k1 = 0; k1<=1;++k1)
641 if (k3!=0||k2!=0||k1!=0) {
642 d = in[x1+k1][x2+k2][x3+k3]-v;
if (d<=thresh) {fail=
true;
break;}
643 if (d<mind) mind = d;
646 minima[x1][x2][x3]=mind;
652 mind = mval; fail =
false;
653 for (
int k3 = 0; k3<=1;++k3)
654 for (
int k2 = -1; k2<=0;++k2)
655 for (
int k1 = 0; k1<=1;++k1)
656 if (k3!=0||k2!=0||k1!=0) {
657 d = in[x1+k1][x2+k2][x3+k3]-v;
if (d<=thresh) {fail=
true;
break;}
658 if (d<mind) mind = d;
661 minima[x1][x2][x3]=mind;
665 x3=n3-1; x2=n2-1; x1=0;
667 mind = mval; fail =
false;
668 for (
int k3 = -1; k3<=0;++k3)
669 for (
int k2 = -1; k2<=0;++k2)
670 for (
int k1 = 0; k1<=1;++k1)
671 if (k3!=0||k2!=0||k1!=0) {
672 d = in[x1+k1][x2+k2][x3+k3]-v;
if (d<=thresh) {fail=
true;
break;}
673 if (d<mind) mind = d;
676 minima[x1][x2][x3]=mind;
682 mind = mval; fail =
false;
683 for (
int k3 = 0; k3<=1;++k3)
684 for (
int k2 = 0; k2<=1;++k2)
685 for (
int k1 = -1; k1<=0;++k1)
686 if (k3!=0||k2!=0||k1!=0) {
687 d = in[x1+k1][x2+k2][x3+k3]-v;
if (d<=thresh) {fail=
true;
break;}
688 if (d<mind) mind = d;
691 minima[x1][x2][x3]=mind;
695 x3=n3-1; x2=0; x1=n1-1;
697 mind = mval; fail =
false;
698 for (
int k3 = -1; k3<=0;++k3)
699 for (
int k2 = 0; k2<=1;++k2)
700 for (
int k1 = -1; k1<=0;++k1)
701 if (k3!=0||k2!=0||k1!=0) {
702 d = in[x1+k1][x2+k2][x3+k3]-v;
if (d<=thresh) {fail=
true;
break;}
703 if (d<mind) mind = d;
706 minima[x1][x2][x3]=mind;
709 mind = mval; fail =
false;
710 x3=0; x2=n2-1; x1=n1-1;
712 for (
int k3 = 0; k3<=1;++k3)
713 for (
int k2 = -1; k2<=0;++k2)
714 for (
int k1 = -1; k1<=0;++k1)
715 if (k3!=0||k2!=0||k1!=0) {
716 d = in[x1+k1][x2+k2][x3+k3]-v;
if (d<=thresh) {fail=
true;
break;}
717 if (d<mind) mind = d;
720 minima[x1][x2][x3]=mind;
723 mind = mval; fail =
false;
724 x3=n3-1; x2=n2-1; x1=n1-1;
726 for (
int k3 = -1; k3<=0;++k3)
727 for (
int k2 = -1; k2<=0;++k2)
728 for (
int k1 = -1; k1<=0;++k1)
729 if (k3!=0||k2!=0||k1!=0) {
730 d = in[x1+k1][x2+k2][x3+k3]-v;
if (d<=thresh) {fail=
true;
break;}
731 if (d<mind) mind = d;
734 minima[x1][x2][x3]=mind;
740 #define VBL_LOCAL_MINIMA_INSTANTIATE(T) \ 741 template vbl_array_1d<T > vbl_local_minima(vbl_array_1d<T >const&, T); \ 742 template vbl_array_2d<T > vbl_local_minima(vbl_array_2d<T >const&, T); \ 743 template vbl_array_3d<T > vbl_local_minima(vbl_array_3d<T >const&, T); \ 744 template bool local_minima(vbl_array_1d<T >const&, vbl_array_1d<T >&, T); \ 745 template bool local_minima(vbl_array_2d<T >const&, vbl_array_2d<T >&, T); \ 746 template bool local_minima(vbl_array_3d<T >const&, vbl_array_3d<T >&, T) 748 #endif // VBL_LOCAL_MINIMA_TXX_
size_type get_row3_count() const
size_type rows() const
Return number of rows.
size_type cols() const
Return number of columns.
Find local minima in arrays.
bool local_minima(vbl_array_1d< T > const &in, vbl_array_1d< T > &minima, T thresh)
DEPRECATED.
Templated 3-dimensional array.
size_type get_row2_count() const
size_type get_row1_count() const