comparison UnitTestsSources/ImageProcessingTests.cpp @ 3504:18566f9e1831

unit testing new functions in ImageProcessing
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 27 Aug 2019 14:26:04 +0200
parents 46cf170ba121
children 4066998150ef
comparison
equal deleted inserted replaced
3503:46cf170ba121 3504:18566f9e1831
276 unsigned int y, 276 unsigned int y,
277 uint8_t value) 277 uint8_t value)
278 { 278 {
279 PixelTraits<PixelFormat_Grayscale8>::PixelType p; 279 PixelTraits<PixelFormat_Grayscale8>::PixelType p;
280 ImageTraits<PixelFormat_Grayscale8>::GetPixel(p, image, x, y); 280 ImageTraits<PixelFormat_Grayscale8>::GetPixel(p, image, x, y);
281 if (p != value) printf("%d %d\n", p, value);
281 return p == value; 282 return p == value;
282 } 283 }
283 284
284 static void SetRGB24Pixel(ImageAccessor& image, 285 static void SetRGB24Pixel(ImageAccessor& image,
285 unsigned int x, 286 unsigned int x,
302 uint8_t green, 303 uint8_t green,
303 uint8_t blue) 304 uint8_t blue)
304 { 305 {
305 PixelTraits<PixelFormat_RGB24>::PixelType p; 306 PixelTraits<PixelFormat_RGB24>::PixelType p;
306 ImageTraits<PixelFormat_RGB24>::GetPixel(p, image, x, y); 307 ImageTraits<PixelFormat_RGB24>::GetPixel(p, image, x, y);
307 return (p.red_ == red && 308 bool ok = (p.red_ == red &&
308 p.green_ == green && 309 p.green_ == green &&
309 p.blue_ == blue); 310 p.blue_ == blue);
311 if (!ok) printf("%d,%d,%d %d,%d,%d\n", p.red_, p.green_, p.blue_, red, green, blue);
312 return ok;
310 } 313 }
311 314
312 315
313 TEST(ImageProcessing, FlipGrayscale8) 316 TEST(ImageProcessing, FlipGrayscale8)
314 { 317 {
465 Image source(PixelFormat_Grayscale8, 2, 2, false); 468 Image source(PixelFormat_Grayscale8, 2, 2, false);
466 Image target(PixelFormat_Grayscale8, 0, 0, false); 469 Image target(PixelFormat_Grayscale8, 0, 0, false);
467 ImageProcessing::Resize(target, source); 470 ImageProcessing::Resize(target, source);
468 } 471 }
469 } 472 }
473
474
475 TEST(ImageProcessing, Convolution)
476 {
477 std::vector<float> k1(5, 1);
478 std::vector<float> k2(1, 1);
479
480 {
481 Image image(PixelFormat_Grayscale8, 1, 1, false);
482 SetGrayscale8Pixel(image, 0, 0, 100);
483 ImageProcessing::SeparableConvolution(image, k1, 2, k2, 0);
484 ASSERT_TRUE(TestGrayscale8Pixel(image, 0, 0, 100));
485 ImageProcessing::SeparableConvolution(image, k1, 2, k1, 2);
486 ASSERT_TRUE(TestGrayscale8Pixel(image, 0, 0, 100));
487 ImageProcessing::SeparableConvolution(image, k2, 0, k1, 2);
488 ASSERT_TRUE(TestGrayscale8Pixel(image, 0, 0, 100));
489 ImageProcessing::SeparableConvolution(image, k2, 0, k2, 0);
490 ASSERT_TRUE(TestGrayscale8Pixel(image, 0, 0, 100));
491 }
492
493 {
494 Image image(PixelFormat_RGB24, 1, 1, false);
495 SetRGB24Pixel(image, 0, 0, 10, 20, 30);
496 ImageProcessing::SeparableConvolution(image, k1, 2, k2, 0);
497 ASSERT_TRUE(TestRGB24Pixel(image, 0, 0, 10, 20, 30));
498 ImageProcessing::SeparableConvolution(image, k1, 2, k1, 2);
499 ASSERT_TRUE(TestRGB24Pixel(image, 0, 0, 10, 20, 30));
500 ImageProcessing::SeparableConvolution(image, k2, 0, k1, 2);
501 ASSERT_TRUE(TestRGB24Pixel(image, 0, 0, 10, 20, 30));
502 ImageProcessing::SeparableConvolution(image, k2, 0, k2, 0);
503 ASSERT_TRUE(TestRGB24Pixel(image, 0, 0, 10, 20, 30));
504 }
505
506 {
507 Image dirac(PixelFormat_Grayscale8, 9, 1, false);
508 ImageProcessing::Set(dirac, 0);
509 SetGrayscale8Pixel(dirac, 4, 0, 100);
510
511 {
512 std::auto_ptr<ImageAccessor> image(Image::Clone(dirac));
513 ImageProcessing::SeparableConvolution(*image, k1, 2, k2, 0);
514 ASSERT_TRUE(TestGrayscale8Pixel(*image, 0, 0, 0));
515 ASSERT_TRUE(TestGrayscale8Pixel(*image, 1, 0, 0));
516 ASSERT_TRUE(TestGrayscale8Pixel(*image, 2, 0, 20));
517 ASSERT_TRUE(TestGrayscale8Pixel(*image, 3, 0, 20));
518 ASSERT_TRUE(TestGrayscale8Pixel(*image, 4, 0, 20));
519 ASSERT_TRUE(TestGrayscale8Pixel(*image, 5, 0, 20));
520 ASSERT_TRUE(TestGrayscale8Pixel(*image, 6, 0, 20));
521 ASSERT_TRUE(TestGrayscale8Pixel(*image, 7, 0, 0));
522 ASSERT_TRUE(TestGrayscale8Pixel(*image, 8, 0, 0));
523 }
524
525 {
526 std::auto_ptr<ImageAccessor> image(Image::Clone(dirac));
527 ImageProcessing::SeparableConvolution(*image, k2, 0, k1, 2);
528 ASSERT_TRUE(TestGrayscale8Pixel(*image, 0, 0, 0));
529 ASSERT_TRUE(TestGrayscale8Pixel(*image, 1, 0, 0));
530 ASSERT_TRUE(TestGrayscale8Pixel(*image, 2, 0, 0));
531 ASSERT_TRUE(TestGrayscale8Pixel(*image, 3, 0, 0));
532 ASSERT_TRUE(TestGrayscale8Pixel(*image, 4, 0, 100));
533 ASSERT_TRUE(TestGrayscale8Pixel(*image, 5, 0, 0));
534 ASSERT_TRUE(TestGrayscale8Pixel(*image, 6, 0, 0));
535 ASSERT_TRUE(TestGrayscale8Pixel(*image, 7, 0, 0));
536 ASSERT_TRUE(TestGrayscale8Pixel(*image, 8, 0, 0));
537 }
538
539 {
540 std::auto_ptr<ImageAccessor> image(Image::Clone(dirac));
541 ImageProcessing::SeparableConvolution(*image, k2, 0, k2, 0);
542 ASSERT_TRUE(TestGrayscale8Pixel(*image, 0, 0, 0));
543 ASSERT_TRUE(TestGrayscale8Pixel(*image, 1, 0, 0));
544 ASSERT_TRUE(TestGrayscale8Pixel(*image, 2, 0, 0));
545 ASSERT_TRUE(TestGrayscale8Pixel(*image, 3, 0, 0));
546 ASSERT_TRUE(TestGrayscale8Pixel(*image, 4, 0, 100));
547 ASSERT_TRUE(TestGrayscale8Pixel(*image, 5, 0, 0));
548 ASSERT_TRUE(TestGrayscale8Pixel(*image, 6, 0, 0));
549 ASSERT_TRUE(TestGrayscale8Pixel(*image, 7, 0, 0));
550 ASSERT_TRUE(TestGrayscale8Pixel(*image, 8, 0, 0));
551 }
552 }
553
554 {
555 Image dirac(PixelFormat_Grayscale8, 1, 9, false);
556 ImageProcessing::Set(dirac, 0);
557 SetGrayscale8Pixel(dirac, 0, 4, 100);
558
559 {
560 std::auto_ptr<ImageAccessor> image(Image::Clone(dirac));
561 ImageProcessing::SeparableConvolution(*image, k2, 0, k1, 2);
562 ASSERT_TRUE(TestGrayscale8Pixel(*image, 0, 0, 0));
563 ASSERT_TRUE(TestGrayscale8Pixel(*image, 0, 1, 0));
564 ASSERT_TRUE(TestGrayscale8Pixel(*image, 0, 2, 20));
565 ASSERT_TRUE(TestGrayscale8Pixel(*image, 0, 3, 20));
566 ASSERT_TRUE(TestGrayscale8Pixel(*image, 0, 4, 20));
567 ASSERT_TRUE(TestGrayscale8Pixel(*image, 0, 5, 20));
568 ASSERT_TRUE(TestGrayscale8Pixel(*image, 0, 6, 20));
569 ASSERT_TRUE(TestGrayscale8Pixel(*image, 0, 7, 0));
570 ASSERT_TRUE(TestGrayscale8Pixel(*image, 0, 8, 0));
571 }
572
573 {
574 std::auto_ptr<ImageAccessor> image(Image::Clone(dirac));
575 ImageProcessing::SeparableConvolution(*image, k1, 2, k2, 0);
576 ASSERT_TRUE(TestGrayscale8Pixel(*image, 0, 0, 0));
577 ASSERT_TRUE(TestGrayscale8Pixel(*image, 0, 1, 0));
578 ASSERT_TRUE(TestGrayscale8Pixel(*image, 0, 2, 0));
579 ASSERT_TRUE(TestGrayscale8Pixel(*image, 0, 3, 0));
580 ASSERT_TRUE(TestGrayscale8Pixel(*image, 0, 4, 100));
581 ASSERT_TRUE(TestGrayscale8Pixel(*image, 0, 5, 0));
582 ASSERT_TRUE(TestGrayscale8Pixel(*image, 0, 6, 0));
583 ASSERT_TRUE(TestGrayscale8Pixel(*image, 0, 7, 0));
584 ASSERT_TRUE(TestGrayscale8Pixel(*image, 0, 8, 0));
585 }
586
587 {
588 std::auto_ptr<ImageAccessor> image(Image::Clone(dirac));
589 ImageProcessing::SeparableConvolution(*image, k2, 0, k2, 0);
590 ASSERT_TRUE(TestGrayscale8Pixel(*image, 0, 0, 0));
591 ASSERT_TRUE(TestGrayscale8Pixel(*image, 0, 1, 0));
592 ASSERT_TRUE(TestGrayscale8Pixel(*image, 0, 2, 0));
593 ASSERT_TRUE(TestGrayscale8Pixel(*image, 0, 3, 0));
594 ASSERT_TRUE(TestGrayscale8Pixel(*image, 0, 4, 100));
595 ASSERT_TRUE(TestGrayscale8Pixel(*image, 0, 5, 0));
596 ASSERT_TRUE(TestGrayscale8Pixel(*image, 0, 6, 0));
597 ASSERT_TRUE(TestGrayscale8Pixel(*image, 0, 7, 0));
598 ASSERT_TRUE(TestGrayscale8Pixel(*image, 0, 8, 0));
599 }
600 }
601
602 {
603 Image dirac(PixelFormat_RGB24, 9, 1, false);
604 ImageProcessing::Set(dirac, 0);
605 SetRGB24Pixel(dirac, 4, 0, 100, 120, 140);
606
607 {
608 std::auto_ptr<ImageAccessor> image(Image::Clone(dirac));
609 ImageProcessing::SeparableConvolution(*image, k1, 2, k2, 0);
610 ASSERT_TRUE(TestRGB24Pixel(*image, 0, 0, 0, 0, 0));
611 ASSERT_TRUE(TestRGB24Pixel(*image, 1, 0, 0, 0, 0));
612 ASSERT_TRUE(TestRGB24Pixel(*image, 2, 0, 20, 24, 28));
613 ASSERT_TRUE(TestRGB24Pixel(*image, 3, 0, 20, 24, 28));
614 ASSERT_TRUE(TestRGB24Pixel(*image, 4, 0, 20, 24, 28));
615 ASSERT_TRUE(TestRGB24Pixel(*image, 5, 0, 20, 24, 28));
616 ASSERT_TRUE(TestRGB24Pixel(*image, 6, 0, 20, 24, 28));
617 ASSERT_TRUE(TestRGB24Pixel(*image, 7, 0, 0, 0, 0));
618 ASSERT_TRUE(TestRGB24Pixel(*image, 8, 0, 0, 0, 0));
619 }
620
621 {
622 std::auto_ptr<ImageAccessor> image(Image::Clone(dirac));
623 ImageProcessing::SeparableConvolution(*image, k2, 0, k1, 2);
624 ASSERT_TRUE(TestRGB24Pixel(*image, 0, 0, 0, 0, 0));
625 ASSERT_TRUE(TestRGB24Pixel(*image, 1, 0, 0, 0, 0));
626 ASSERT_TRUE(TestRGB24Pixel(*image, 2, 0, 0, 0, 0));
627 ASSERT_TRUE(TestRGB24Pixel(*image, 3, 0, 0, 0, 0));
628 ASSERT_TRUE(TestRGB24Pixel(*image, 4, 0, 100, 120, 140));
629 ASSERT_TRUE(TestRGB24Pixel(*image, 5, 0, 0, 0, 0));
630 ASSERT_TRUE(TestRGB24Pixel(*image, 6, 0, 0, 0, 0));
631 ASSERT_TRUE(TestRGB24Pixel(*image, 7, 0, 0, 0, 0));
632 ASSERT_TRUE(TestRGB24Pixel(*image, 8, 0, 0, 0, 0));
633 }
634
635 {
636 std::auto_ptr<ImageAccessor> image(Image::Clone(dirac));
637 ImageProcessing::SeparableConvolution(*image, k2, 0, k2, 0);
638 ASSERT_TRUE(TestRGB24Pixel(*image, 0, 0, 0, 0, 0));
639 ASSERT_TRUE(TestRGB24Pixel(*image, 1, 0, 0, 0, 0));
640 ASSERT_TRUE(TestRGB24Pixel(*image, 2, 0, 0, 0, 0));
641 ASSERT_TRUE(TestRGB24Pixel(*image, 3, 0, 0, 0, 0));
642 ASSERT_TRUE(TestRGB24Pixel(*image, 4, 0, 100, 120, 140));
643 ASSERT_TRUE(TestRGB24Pixel(*image, 5, 0, 0, 0, 0));
644 ASSERT_TRUE(TestRGB24Pixel(*image, 6, 0, 0, 0, 0));
645 ASSERT_TRUE(TestRGB24Pixel(*image, 7, 0, 0, 0, 0));
646 ASSERT_TRUE(TestRGB24Pixel(*image, 8, 0, 0, 0, 0));
647 }
648 }
649
650 {
651 Image dirac(PixelFormat_RGB24, 1, 9, false);
652 ImageProcessing::Set(dirac, 0);
653 SetRGB24Pixel(dirac, 0, 4, 100, 120, 140);
654
655 {
656 std::auto_ptr<ImageAccessor> image(Image::Clone(dirac));
657 ImageProcessing::SeparableConvolution(*image, k2, 0, k1, 2);
658 ASSERT_TRUE(TestRGB24Pixel(*image, 0, 0, 0, 0, 0));
659 ASSERT_TRUE(TestRGB24Pixel(*image, 0, 1, 0, 0, 0));
660 ASSERT_TRUE(TestRGB24Pixel(*image, 0, 2, 20, 24, 28));
661 ASSERT_TRUE(TestRGB24Pixel(*image, 0, 3, 20, 24, 28));
662 ASSERT_TRUE(TestRGB24Pixel(*image, 0, 4, 20, 24, 28));
663 ASSERT_TRUE(TestRGB24Pixel(*image, 0, 5, 20, 24, 28));
664 ASSERT_TRUE(TestRGB24Pixel(*image, 0, 6, 20, 24, 28));
665 ASSERT_TRUE(TestRGB24Pixel(*image, 0, 7, 0, 0, 0));
666 ASSERT_TRUE(TestRGB24Pixel(*image, 0, 8, 0, 0, 0));
667 }
668
669 {
670 std::auto_ptr<ImageAccessor> image(Image::Clone(dirac));
671 ImageProcessing::SeparableConvolution(*image, k1, 2, k2, 0);
672 ASSERT_TRUE(TestRGB24Pixel(*image, 0, 0, 0, 0, 0));
673 ASSERT_TRUE(TestRGB24Pixel(*image, 0, 1, 0, 0, 0));
674 ASSERT_TRUE(TestRGB24Pixel(*image, 0, 2, 0, 0, 0));
675 ASSERT_TRUE(TestRGB24Pixel(*image, 0, 3, 0, 0, 0));
676 ASSERT_TRUE(TestRGB24Pixel(*image, 0, 4, 100, 120, 140));
677 ASSERT_TRUE(TestRGB24Pixel(*image, 0, 5, 0, 0, 0));
678 ASSERT_TRUE(TestRGB24Pixel(*image, 0, 6, 0, 0, 0));
679 ASSERT_TRUE(TestRGB24Pixel(*image, 0, 7, 0, 0, 0));
680 ASSERT_TRUE(TestRGB24Pixel(*image, 0, 8, 0, 0, 0));
681 }
682
683 {
684 std::auto_ptr<ImageAccessor> image(Image::Clone(dirac));
685 ImageProcessing::SeparableConvolution(*image, k2, 0, k2, 0);
686 ASSERT_TRUE(TestRGB24Pixel(*image, 0, 0, 0, 0, 0));
687 ASSERT_TRUE(TestRGB24Pixel(*image, 0, 1, 0, 0, 0));
688 ASSERT_TRUE(TestRGB24Pixel(*image, 0, 2, 0, 0, 0));
689 ASSERT_TRUE(TestRGB24Pixel(*image, 0, 3, 0, 0, 0));
690 ASSERT_TRUE(TestRGB24Pixel(*image, 0, 4, 100, 120, 140));
691 ASSERT_TRUE(TestRGB24Pixel(*image, 0, 5, 0, 0, 0));
692 ASSERT_TRUE(TestRGB24Pixel(*image, 0, 6, 0, 0, 0));
693 ASSERT_TRUE(TestRGB24Pixel(*image, 0, 7, 0, 0, 0));
694 ASSERT_TRUE(TestRGB24Pixel(*image, 0, 8, 0, 0, 0));
695 }
696 }
697 }
698
699
700 TEST(ImageProcessing, SmoothGaussian5x5)
701 {
702 /**
703 Test the point spread function, as can be seen in Octave:
704 g1 = [ 1 4 6 4 1 ];
705 g1 /= sum(g1);
706 g2 = conv2(g1, g1');
707 floor(conv2(diag([ 0 0 100 0 0 ]), g2, 'same')) % red/green channels
708 floor(conv2(diag([ 0 0 200 0 0 ]), g2, 'same')) % blue channel
709 **/
710
711 {
712 Image image(PixelFormat_Grayscale8, 5, 5, false);
713 ImageProcessing::Set(image, 0);
714 SetGrayscale8Pixel(image, 2, 2, 100);
715 ImageProcessing::SmoothGaussian5x5(image);
716
717 ASSERT_TRUE(TestGrayscale8Pixel(image, 0, 0, 0));
718 ASSERT_TRUE(TestGrayscale8Pixel(image, 1, 0, 1));
719 ASSERT_TRUE(TestGrayscale8Pixel(image, 2, 0, 2));
720 ASSERT_TRUE(TestGrayscale8Pixel(image, 3, 0, 1));
721 ASSERT_TRUE(TestGrayscale8Pixel(image, 4, 0, 0));
722 ASSERT_TRUE(TestGrayscale8Pixel(image, 0, 1, 1));
723 ASSERT_TRUE(TestGrayscale8Pixel(image, 1, 1, 6));
724 ASSERT_TRUE(TestGrayscale8Pixel(image, 2, 1, 9));
725 ASSERT_TRUE(TestGrayscale8Pixel(image, 3, 1, 6));
726 ASSERT_TRUE(TestGrayscale8Pixel(image, 4, 1, 1));
727 ASSERT_TRUE(TestGrayscale8Pixel(image, 0, 2, 2));
728 ASSERT_TRUE(TestGrayscale8Pixel(image, 1, 2, 9));
729 ASSERT_TRUE(TestGrayscale8Pixel(image, 2, 2, 14));
730 ASSERT_TRUE(TestGrayscale8Pixel(image, 3, 2, 9));
731 ASSERT_TRUE(TestGrayscale8Pixel(image, 4, 2, 2));
732 ASSERT_TRUE(TestGrayscale8Pixel(image, 0, 3, 1));
733 ASSERT_TRUE(TestGrayscale8Pixel(image, 1, 3, 6));
734 ASSERT_TRUE(TestGrayscale8Pixel(image, 2, 3, 9));
735 ASSERT_TRUE(TestGrayscale8Pixel(image, 3, 3, 6));
736 ASSERT_TRUE(TestGrayscale8Pixel(image, 4, 3, 1));
737 ASSERT_TRUE(TestGrayscale8Pixel(image, 0, 4, 0));
738 ASSERT_TRUE(TestGrayscale8Pixel(image, 1, 4, 1));
739 ASSERT_TRUE(TestGrayscale8Pixel(image, 2, 4, 2));
740 ASSERT_TRUE(TestGrayscale8Pixel(image, 3, 4, 1));
741 ASSERT_TRUE(TestGrayscale8Pixel(image, 4, 4, 0));
742 }
743
744 {
745 Image image(PixelFormat_RGB24, 5, 5, false);
746 ImageProcessing::Set(image, 0);
747 SetRGB24Pixel(image, 2, 2, 100, 100, 200);
748 ImageProcessing::SmoothGaussian5x5(image);
749
750 ASSERT_TRUE(TestRGB24Pixel(image, 0, 0, 0, 0, 0));
751 ASSERT_TRUE(TestRGB24Pixel(image, 1, 0, 1, 1, 3));
752 ASSERT_TRUE(TestRGB24Pixel(image, 2, 0, 2, 2, 4));
753 ASSERT_TRUE(TestRGB24Pixel(image, 3, 0, 1, 1, 3));
754 ASSERT_TRUE(TestRGB24Pixel(image, 4, 0, 0, 0, 0));
755 ASSERT_TRUE(TestRGB24Pixel(image, 0, 1, 1, 1, 3));
756 ASSERT_TRUE(TestRGB24Pixel(image, 1, 1, 6, 6, 12));
757 ASSERT_TRUE(TestRGB24Pixel(image, 2, 1, 9, 9, 18));
758 ASSERT_TRUE(TestRGB24Pixel(image, 3, 1, 6, 6, 12));
759 ASSERT_TRUE(TestRGB24Pixel(image, 4, 1, 1, 1, 3));
760 ASSERT_TRUE(TestRGB24Pixel(image, 0, 2, 2, 2, 4));
761 ASSERT_TRUE(TestRGB24Pixel(image, 1, 2, 9, 9, 18));
762 ASSERT_TRUE(TestRGB24Pixel(image, 2, 2, 14, 14, 28));
763 ASSERT_TRUE(TestRGB24Pixel(image, 3, 2, 9, 9, 18));
764 ASSERT_TRUE(TestRGB24Pixel(image, 4, 2, 2, 2, 4));
765 ASSERT_TRUE(TestRGB24Pixel(image, 0, 3, 1, 1, 3));
766 ASSERT_TRUE(TestRGB24Pixel(image, 1, 3, 6, 6, 12));
767 ASSERT_TRUE(TestRGB24Pixel(image, 2, 3, 9, 9, 18));
768 ASSERT_TRUE(TestRGB24Pixel(image, 3, 3, 6, 6, 12));
769 ASSERT_TRUE(TestRGB24Pixel(image, 4, 3, 1, 1, 3));
770 ASSERT_TRUE(TestRGB24Pixel(image, 0, 4, 0, 0, 0));
771 ASSERT_TRUE(TestRGB24Pixel(image, 1, 4, 1, 1, 3));
772 ASSERT_TRUE(TestRGB24Pixel(image, 2, 4, 2, 2, 4));
773 ASSERT_TRUE(TestRGB24Pixel(image, 3, 4, 1, 1, 3));
774 ASSERT_TRUE(TestRGB24Pixel(image, 4, 4, 0, 0, 0));
775 }
776 }