1 // This is core/vil/algo/tests/test_algo_cartesian_differential_invariants.cxx
2 #include <iostream>
3 #include <cmath>
4 #include <cassert>
5 #ifdef _MSC_VER
6 # include "vcl_msvc_warnings.h"
7 #endif
8 #include "vil/vil_image_view.h"
9 #include "vil/vil_print.h"
10 #include <vil/algo/vil_cartesian_differential_invariants.h>
11 #include "testlib/testlib_test.h"
12
13 static void
test_algo_cartesian_differential_invariants()14 test_algo_cartesian_differential_invariants()
15 {
16 std::cout << "*****************************************************\n"
17 << " Testing test_algo_cartesian_differential_invariants\n"
18 << "*****************************************************\n";
19
20 constexpr unsigned n = 11;
21
22 vil_image_view<float> src(n, n);
23 vil_image_view<float> dest, dest2;
24
25 src.fill(0);
26 src(n / 2, n / 2) = 255;
27
28 vil_cartesian_differential_invariants_3(src, dest, 1.0);
29 std::cout << "Source\n";
30 vil_print_all(std::cout, src);
31 std::cout << "Destination\n";
32 vil_print_all(std::cout, dest);
33 TEST("dest is correct size", dest.ni() == n && dest.nj() == n && dest.nplanes() == 8, true);
34
35
36 // I have visually compared impulse response function images from
37 // Kevin's original code, and my new code. They look the same.
38 // Kevin's code used point sampling to build the filters, whereas
39 // my code uses pixel integration sampling, so the results are not
40 // directly comparable.
41 // See cpp_above_matlab_comparing_cdi_code.png for impulse responses
42 // from VXL and matlab versions (VXL version on top).
43 // Not the lack of radial symmetry (especially in 4th, 5th, and 7th planes)
44 // are due to rounding error. They should be zero, and are actually small values that
45 // have been scaled up while saving to file.
46
47 // The following is a regression test. The golden values are
48 // merely verified as above.
49
50 const float golden_data[] = { 0.f,
51 0.f,
52 0.f,
53 0.f,
54 0.f,
55 0.f,
56 0.f,
57 0.f,
58 0.f,
59 0.f,
60 0.f,
61 0.f,
62 0.f,
63 0.f,
64 0.f,
65 0.f,
66 0.f,
67 0.f,
68 0.f,
69 0.f,
70 0.f,
71 0.f,
72 0.f,
73 0.f,
74 0.00261491f,
75 0.193499f,
76 2.37197f,
77 5.36639f,
78 2.37197f,
79 0.193499f,
80 0.00261491f,
81 0.f,
82 0.f,
83 0.f,
84 0.f,
85 0.193499f,
86 12.1514f,
87 120.676f,
88 242.613f,
89 120.676f,
90 12.1514f,
91 0.193499f,
92 0.f,
93 0.f,
94 0.f,
95 0.f,
96 2.37197f,
97 120.676f,
98 763.611f,
99 958.092f,
100 763.611f,
101 120.676f,
102 2.37197f,
103 0.f,
104 0.f,
105 0.f,
106 0.f,
107 5.36639f,
108 242.613f,
109 958.092f,
110 0.f,
111 958.092f,
112 242.613f,
113 5.36639f,
114 0.f,
115 0.f,
116 0.f,
117 0.f,
118 2.37197f,
119 120.676f,
120 763.611f,
121 958.092f,
122 763.611f,
123 120.676f,
124 2.37197f,
125 0.f,
126 0.f,
127 0.f,
128 0.f,
129 0.193499f,
130 12.1514f,
131 120.676f,
132 242.613f,
133 120.676f,
134 12.1514f,
135 0.193499f,
136 0.f,
137 0.f,
138 0.f,
139 0.f,
140 0.00261491f,
141 0.193499f,
142 2.37197f,
143 5.36639f,
144 2.37197f,
145 0.193499f,
146 0.00261491f,
147 0.f,
148 0.f,
149 0.f,
150 0.f,
151 0.f,
152 0.f,
153 0.f,
154 0.f,
155 0.f,
156 0.f,
157 0.f,
158 0.f,
159 0.f,
160 0.f,
161 0.f,
162 0.f,
163 0.f,
164 0.f,
165 0.f,
166 0.f,
167 0.f,
168 0.f,
169 0.f,
170 0.f,
171
172 0.f,
173 0.f,
174 0.f,
175 0.f,
176 0.f,
177 0.f,
178 0.f,
179 0.f,
180 0.f,
181 0.f,
182 0.f,
183 0.f,
184 0.f,
185 0.f,
186 0.f,
187 0.f,
188 0.f,
189 0.f,
190 0.f,
191 0.f,
192 0.f,
193 0.f,
194 0.f,
195 0.f,
196 0.000585776f,
197 0.2993f,
198 9.67222f,
199 27.7197f,
200 9.67222f,
201 0.2993f,
202 0.000585776f,
203 0.f,
204 0.f,
205 0.f,
206 0.f,
207 0.2993f,
208 115.43f,
209 2395.66f,
210 4625.15f,
211 2395.66f,
212 115.43f,
213 0.2993f,
214 0.f,
215 0.f,
216 0.f,
217 0.f,
218 9.67222f,
219 2395.66f,
220 18433.9f,
221 -2214.75f,
222 18433.9f,
223 2395.66f,
224 9.67222f,
225 0.f,
226 0.f,
227 0.f,
228 0.f,
229 27.7197f,
230 4625.15f,
231 -2214.75f,
232 0.f,
233 -2214.75f,
234 4625.15f,
235 27.7197f,
236 0.f,
237 0.f,
238 0.f,
239 0.f,
240 9.67222f,
241 2395.66f,
242 18433.9f,
243 -2214.75f,
244 18433.9f,
245 2395.66f,
246 9.67222f,
247 0.f,
248 0.f,
249 0.f,
250 0.f,
251 0.2993f,
252 115.43f,
253 2395.66f,
254 4625.15f,
255 2395.66f,
256 115.43f,
257 0.2993f,
258 0.f,
259 0.f,
260 0.f,
261 0.f,
262 0.000585776f,
263 0.2993f,
264 9.67222f,
265 27.7197f,
266 9.67222f,
267 0.2993f,
268 0.000585776f,
269 0.f,
270 0.f,
271 0.f,
272 0.f,
273 0.f,
274 0.f,
275 0.f,
276 0.f,
277 0.f,
278 0.f,
279 0.f,
280 0.f,
281 0.f,
282 0.f,
283 0.f,
284 0.f,
285 0.f,
286 0.f,
287 0.f,
288 0.f,
289 0.f,
290 0.f,
291 0.f,
292 0.f,
293
294 0.f,
295 0.f,
296 0.f,
297 0.f,
298 0.f,
299 0.f,
300 0.f,
301 0.f,
302 0.f,
303 0.f,
304 0.f,
305 0.f,
306 0.f,
307 0.f,
308 0.f,
309 0.f,
310 0.f,
311 0.f,
312 0.f,
313 0.f,
314 0.f,
315 0.f,
316 0.f,
317 0.f,
318 -0.000164114f,
319 -0.0835501f,
320 -2.02331f,
321 -3.73664f,
322 -2.02331f,
323 -0.0835501f,
324 -0.000164114f,
325 0.f,
326 0.f,
327 0.f,
328 0.f,
329 -0.0835501f,
330 -42.1126f,
331 -987.525f,
332 -1712.7f,
333 -987.525f,
334 -42.1126f,
335 -0.0835501f,
336 0.f,
337 0.f,
338 0.f,
339 0.f,
340 -2.02331f,
341 -987.525f,
342 -20662.6f,
343 -26980.6f,
344 -20662.6f,
345 -987.525f,
346 -2.02331f,
347 0.f,
348 0.f,
349 0.f,
350 0.f,
351 -3.73664f,
352 -1712.7f,
353 -26980.6f,
354 0.f,
355 -26980.6f,
356 -1712.7f,
357 -3.73664f,
358 0.f,
359 0.f,
360 0.f,
361 0.f,
362 -2.02331f,
363 -987.525f,
364 -20662.6f,
365 -26980.6f,
366 -20662.6f,
367 -987.525f,
368 -2.02331f,
369 0.f,
370 0.f,
371 0.f,
372 0.f,
373 -0.0835501f,
374 -42.1126f,
375 -987.525f,
376 -1712.7f,
377 -987.525f,
378 -42.1126f,
379 -0.0835501f,
380 0.f,
381 0.f,
382 0.f,
383 0.f,
384 -0.000164114f,
385 -0.0835501f,
386 -2.02331f,
387 -3.73664f,
388 -2.02331f,
389 -0.0835501f,
390 -0.000164114f,
391 0.f,
392 0.f,
393 0.f,
394 0.f,
395 0.f,
396 0.f,
397 0.f,
398 0.f,
399 0.f,
400 0.f,
401 0.f,
402 0.f,
403 0.f,
404 0.f,
405 0.f,
406 0.f,
407 0.f,
408 0.f,
409 0.f,
410 0.f,
411 0.f,
412 0.f,
413 0.f,
414 0.f,
415
416 0.f,
417 0.f,
418 0.f,
419 0.f,
420 0.f,
421 0.f,
422 0.f,
423 0.f,
424 0.f,
425 0.f,
426 0.f,
427 0.f,
428 0.f,
429 0.f,
430 0.f,
431 0.f,
432 0.f,
433 0.f,
434 0.f,
435 0.f,
436 0.f,
437 0.f,
438 0.f,
439 0.f,
440 2.05217e-011f,
441 0.0262445f,
442 1.32065f,
443 0.f,
444 -1.32065f,
445 -0.0262445f,
446 -2.05217e-011f,
447 0.f,
448 0.f,
449 0.f,
450 0.f,
451 -0.0262445f,
452 6.72063e-006f,
453 339.152f,
454 0.f,
455 -339.152f,
456 -6.72063e-006f,
457 0.0262445f,
458 0.f,
459 0.f,
460 0.f,
461 0.f,
462 -1.32065f,
463 -339.152f,
464 -0.00219401f,
465 0.f,
466 0.00219401f,
467 339.152f,
468 1.32065f,
469 0.f,
470 0.f,
471 0.f,
472 0.f,
473 0.f,
474 0.f,
475 0.f,
476 0.f,
477 0.f,
478 0.f,
479 0.f,
480 0.f,
481 0.f,
482 0.f,
483 0.f,
484 1.32065f,
485 339.152f,
486 0.00219401f,
487 0.f,
488 -0.00219401f,
489 -339.152f,
490 -1.32065f,
491 0.f,
492 0.f,
493 0.f,
494 0.f,
495 0.0262445f,
496 -6.72063e-006f,
497 -339.152f,
498 0.f,
499 339.152f,
500 6.72063e-006f,
501 -0.0262445f,
502 0.f,
503 0.f,
504 0.f,
505 0.f,
506 -2.05217e-011f,
507 -0.0262445f,
508 -1.32065f,
509 0.f,
510 1.32065f,
511 0.0262445f,
512 2.05217e-011f,
513 0.f,
514 0.f,
515 0.f,
516 0.f,
517 0.f,
518 0.f,
519 0.f,
520 0.f,
521 0.f,
522 0.f,
523 0.f,
524 0.f,
525 0.f,
526 0.f,
527 0.f,
528 0.f,
529 0.f,
530 0.f,
531 0.f,
532 0.f,
533 0.f,
534 0.f,
535 0.f,
536 0.f,
537
538 0.f,
539 0.f,
540 0.f,
541 0.f,
542 0.f,
543 0.f,
544 0.f,
545 0.f,
546 0.f,
547 0.f,
548 0.f,
549 0.f,
550 0.f,
551 0.f,
552 0.f,
553 0.f,
554 0.f,
555 0.f,
556 0.f,
557 0.f,
558 0.f,
559 0.f,
560 0.f,
561 0.f,
562 0.f,
563 0.0123648f,
564 2.47208f,
565 0.f,
566 -2.47208f,
567 -0.0123648f,
568 0.f,
569 0.f,
570 0.f,
571 0.f,
572 0.f,
573 -0.0123648f,
574 -1.2593e-005f,
575 6425.73f,
576 0.f,
577 -6425.73f,
578 1.2593e-005f,
579 0.0123648f,
580 0.f,
581 0.f,
582 0.f,
583 0.f,
584 -2.47208f,
585 -6425.73f,
586 0.0353556f,
587 0.f,
588 -0.0353556f,
589 6425.73f,
590 2.47208f,
591 0.f,
592 0.f,
593 0.f,
594 0.f,
595 0.f,
596 0.f,
597 0.f,
598 0.f,
599 0.f,
600 0.f,
601 0.f,
602 0.f,
603 0.f,
604 0.f,
605 0.f,
606 2.47208f,
607 6425.73f,
608 -0.0353556f,
609 0.f,
610 0.0353556f,
611 -6425.73f,
612 -2.47208f,
613 0.f,
614 0.f,
615 0.f,
616 0.f,
617 0.0123648f,
618 1.2593e-005f,
619 -6425.73f,
620 0.f,
621 6425.73f,
622 -1.2593e-005f,
623 -0.0123648f,
624 0.f,
625 0.f,
626 0.f,
627 0.f,
628 0.f,
629 -0.0123648f,
630 -2.47208f,
631 0.f,
632 2.47208f,
633 0.0123648f,
634 0.f,
635 0.f,
636 0.f,
637 0.f,
638 0.f,
639 0.f,
640 0.f,
641 0.f,
642 0.f,
643 0.f,
644 0.f,
645 0.f,
646 0.f,
647 0.f,
648 0.f,
649 0.f,
650 0.f,
651 0.f,
652 0.f,
653 0.f,
654 0.f,
655 0.f,
656 0.f,
657 0.f,
658 0.f,
659
660 0.f,
661 0.f,
662 0.f,
663 0.f,
664 0.f,
665 0.f,
666 0.f,
667 0.f,
668 0.f,
669 0.f,
670 0.f,
671 0.f,
672 0.f,
673 0.f,
674 0.f,
675 0.f,
676 0.f,
677 0.f,
678 0.f,
679 0.f,
680 0.f,
681 0.f,
682 0.f,
683 0.f,
684 -2.39812e-005f,
685 -0.0894585f,
686 -8.45908f,
687 -34.3258f,
688 -8.45908f,
689 -0.0894585f,
690 -2.39812e-005f,
691 0.f,
692 0.f,
693 0.f,
694 0.f,
695 -0.0894584f,
696 -250.537f,
697 -17086.f,
698 -70159.f,
699 -17086.f,
700 -250.537f,
701 -0.0894584f,
702 0.f,
703 0.f,
704 0.f,
705 0.f,
706 -8.45908f,
707 -17086.f,
708 -366049.f,
709 -1.09413e+006f,
710 -366049.f,
711 -17086.f,
712 -8.45908f,
713 0.f,
714 0.f,
715 0.f,
716 0.f,
717 -34.3257f,
718 -70159.f,
719 -1.09413e+006f,
720 0.f,
721 -1.09413e+006f,
722 -70159.f,
723 -34.3257f,
724 0.f,
725 0.f,
726 0.f,
727 0.f,
728 -8.45908f,
729 -17086.f,
730 -366049.f,
731 -1.09413e+006f,
732 -366049.f,
733 -17086.f,
734 -8.45908f,
735 0.f,
736 0.f,
737 0.f,
738 0.f,
739 -0.0894584f,
740 -250.537f,
741 -17086.f,
742 -70159.f,
743 -17086.f,
744 -250.537f,
745 -0.0894584f,
746 0.f,
747 0.f,
748 0.f,
749 0.f,
750 -2.39812e-005f,
751 -0.0894585f,
752 -8.45908f,
753 -34.3258f,
754 -8.45908f,
755 -0.0894585f,
756 -2.39812e-005f,
757 0.f,
758 0.f,
759 0.f,
760 0.f,
761 0.f,
762 0.f,
763 0.f,
764 0.f,
765 0.f,
766 0.f,
767 0.f,
768 0.f,
769 0.f,
770 0.f,
771 0.f,
772 0.f,
773 0.f,
774 0.f,
775 0.f,
776 0.f,
777 0.f,
778 0.f,
779 0.f,
780 0.f,
781
782 0.f,
783 0.f,
784 0.f,
785 0.f,
786 0.f,
787 0.f,
788 0.f,
789 0.f,
790 0.f,
791 0.f,
792 0.f,
793 0.f,
794 0.f,
795 0.f,
796 0.f,
797 0.f,
798 0.f,
799 0.f,
800 0.f,
801 0.f,
802 0.f,
803 0.f,
804 0.f,
805 0.f,
806 3.38813e-021f,
807 0.0500808f,
808 7.17904f,
809 0.f,
810 -7.17904f,
811 -0.0500808f,
812 -3.38813e-021f,
813 0.f,
814 0.f,
815 0.f,
816 0.f,
817 -0.0500808f,
818 4.8993e-005f,
819 6000.63f,
820 0.f,
821 -6000.63f,
822 -4.8993e-005f,
823 0.0500808f,
824 0.f,
825 0.f,
826 0.f,
827 0.f,
828 -7.17904f,
829 -6000.63f,
830 -0.0113272f,
831 0.f,
832 0.0113272f,
833 6000.63f,
834 7.17904f,
835 0.f,
836 0.f,
837 0.f,
838 0.f,
839 0.f,
840 0.f,
841 0.f,
842 0.f,
843 0.f,
844 0.f,
845 0.f,
846 0.f,
847 0.f,
848 0.f,
849 0.f,
850 7.17904f,
851 6000.63f,
852 0.0113272f,
853 0.f,
854 -0.0113272f,
855 -6000.63f,
856 -7.17904f,
857 0.f,
858 0.f,
859 0.f,
860 0.f,
861 0.0500808f,
862 -4.8993e-005f,
863 -6000.63f,
864 0.f,
865 6000.63f,
866 4.8993e-005f,
867 -0.0500808f,
868 0.f,
869 0.f,
870 0.f,
871 0.f,
872 -3.38813e-021f,
873 -0.0500808f,
874 -7.17904f,
875 0.f,
876 7.17904f,
877 0.0500808f,
878 3.38813e-021f,
879 0.f,
880 0.f,
881 0.f,
882 0.f,
883 0.f,
884 0.f,
885 0.f,
886 0.f,
887 0.f,
888 0.f,
889 0.f,
890 0.f,
891 0.f,
892 0.f,
893 0.f,
894 0.f,
895 0.f,
896 0.f,
897 0.f,
898 0.f,
899 0.f,
900 0.f,
901 0.f,
902 0.f,
903
904 0.f,
905 0.f,
906 0.f,
907 0.f,
908 0.f,
909 0.f,
910 0.f,
911 0.f,
912 0.f,
913 0.f,
914 0.f,
915 0.f,
916 0.f,
917 0.f,
918 0.f,
919 0.f,
920 0.f,
921 0.f,
922 0.f,
923 0.f,
924 0.f,
925 0.f,
926 0.f,
927 0.f,
928 0.000187632f,
929 0.894689f,
930 60.6675f,
931 52.6394f,
932 86.8583f,
933 2.0444f,
934 0.000731781f,
935 0.f,
936 0.f,
937 0.f,
938 0.f,
939 0.60726f,
940 2125.88f,
941 84466.9f,
942 -10280.9f,
943 127906.f,
944 4977.58f,
945 2.33183f,
946 0.f,
947 0.f,
948 0.f,
949 0.f,
950 34.4766f,
951 62747.2f,
952 -736888.f,
953 -1.24231e+006f,
954 -908045.f,
955 149626.f,
956 113.049f,
957 0.f,
958 0.f,
959 0.f,
960 0.f,
961 52.6394f,
962 -10280.9f,
963 -1.24231e+006f,
964 0.f,
965 -1.24231e+006f,
966 -10280.9f,
967 52.6394f,
968 0.f,
969 0.f,
970 0.f,
971 0.f,
972 34.4766f,
973 62747.2f,
974 -736888.f,
975 -1.24231e+006f,
976 -908045.f,
977 149626.f,
978 113.049f,
979 0.f,
980 0.f,
981 0.f,
982 0.f,
983 0.60726f,
984 2125.88f,
985 84466.9f,
986 -10280.9f,
987 127906.f,
988 4977.58f,
989 2.33183f,
990 0.f,
991 0.f,
992 0.f,
993 0.f,
994 0.000187632f,
995 0.894689f,
996 60.6675f,
997 52.6394f,
998 86.8583f,
999 2.0444f,
1000 0.000731781f,
1001 0.f,
1002 0.f,
1003 0.f,
1004 0.f,
1005 0.f,
1006 0.f,
1007 0.f,
1008 0.f,
1009 0.f,
1010 0.f,
1011 0.f,
1012 0.f,
1013 0.f,
1014 0.f,
1015 0.f,
1016 0.f,
1017 0.f,
1018 0.f,
1019 0.f,
1020 0.f,
1021 0.f,
1022 0.f,
1023 0.f,
1024 0.f };
1025
1026 assert(dest.is_contiguous());
1027 assert(dest.istep() == 1);
1028 const float *p_dest = dest.begin(), *p_golden = golden_data;
1029 unsigned i;
1030 for (i = 0; i < dest.size(); ++i)
1031 {
1032 if (std::fabs(*p_dest - *p_golden) > std::fabs(*p_golden) * 1e-6)
1033 {
1034 std::cout << "Found excess value at pixel " << i << std::endl;
1035 break;
1036 }
1037 }
1038 TEST("impulse response matches golden data", i, dest.size());
1039
1040
1041 // Test invariant properties
1042
1043 src.fill(0.f);
1044 src(n / 2, n / 2) = 256.f;
1045 src(n / 2 - 1, n / 2) = 128.f;
1046 src(n / 2 + 1, n / 2) = 512.f;
1047 vil_cartesian_differential_invariants_3(src, dest, 1.0);
1048 src.fill(0.f);
1049 src(n / 2, n / 2) = 256.f;
1050 src(n / 2, n / 2 - 1) = 128.f;
1051 src(n / 2, n / 2 + 1) = 512.f;
1052 vil_cartesian_differential_invariants_3(src, dest2, 1.0);
1053 for (unsigned i = 0; i < 8; ++i)
1054 TEST_NEAR("cartesian invariance",
1055 dest2(n / 2, n / 2, i),
1056 dest2(n / 2, n / 2, i),
1057 std::fabs(dest2(n / 2, n / 2, i) * 1.e-4f));
1058 }
1059
1060 TESTMAIN(test_algo_cartesian_differential_invariants);
1061