dlib C++ Library - image.cpp

    // Copyright (C) 2008  Davis E. King (davisking@users.sourceforge.net)
    // License: Boost Software License   See LICENSE.txt for the full license.
    #include <sstream>
    #include <string>
    #include <cstdlib>
    #include <ctime>
    #include <dlib/pixel.h>
    #include <dlib/array2d.h>
    #include <dlib/image_transforms.h>
    #include <dlib/image_io.h>

    #include "tester.h"

    namespace
    {
        using namespace test;
        using namespace dlib;
        using namespace std;

        logger dlog("test.image");

        void image_test (
        )
        /*!
            ensures
                - runs tests on pixel objects and functions for compliance with the specs
        !*/
        {

            print_spinner();

            array2d<unsigned char>::kernel_1a_c img1, img2;

            img1.set_size(100,100);

            assign_all_pixels(img1,7);

            assign_image(img2, img1);

            DLIB_CASSERT(img1.nr() == 100 && img1.nc() == 100 &&
                         img2.nr() == 100 && img2.nc() == 100,"");

            for (long r = 0; r < img1.nr(); ++r)
            {
                for (long c = 0; c < img1.nc(); ++c)
                {
                    DLIB_CASSERT(img1[r][c] == 7,"");
                    DLIB_CASSERT(img2[r][c] == 7,"");
                }
            }

            threshold_image(img1, img2, 4);

            for (long r = 0; r < img1.nr(); ++r)
            {
                for (long c = 0; c < img1.nc(); ++c)
                {
                    DLIB_CASSERT(img1[r][c] == 7,"");
                    DLIB_CASSERT(img2[r][c] == on_pixel,"");
                }
            }

            {
                array2d<hsi_pixel>::kernel_1a img;
                img.set_size(14,15);
                for (long r = 0; r < 14; ++r)
                {
                    for (long c = 0; c < 15; ++c)
                    {
                        img[r][c].h = static_cast<unsigned char>(r*14 + c + 1);
                        img[r][c].s = static_cast<unsigned char>(r*14 + c + 2);
                        img[r][c].i = static_cast<unsigned char>(r*14 + c + 3);
                    }
                }

                ostringstream sout;
                save_dng(img, sout);
                istringstream sin(sout.str());

                img.clear();
                DLIB_CASSERT(img.nr() == 0,"");
                DLIB_CASSERT(img.nc() == 0,"");

                load_dng(img, sin);

                DLIB_CASSERT(img.nr() == 14,"");
                DLIB_CASSERT(img.nc() == 15,"");

                for (long r = 0; r < 14; ++r)
                {
                    for (long c = 0; c < 15; ++c)
                    {
                        DLIB_CASSERT(img[r][c].h == r*14 + c + 1, "");
                        DLIB_CASSERT(img[r][c].s == r*14 + c + 2, "");
                        DLIB_CASSERT(img[r][c].i == r*14 + c + 3, "");
                    }
                }
            }

            {
                array2d<rgb_alpha_pixel>::kernel_1a img;
                img.set_size(14,15);
                for (long r = 0; r < 14; ++r)
                {
                    for (long c = 0; c < 15; ++c)
                    {
                        img[r][c].red = static_cast<unsigned char>(r*14 + c + 1);
                        img[r][c].green = static_cast<unsigned char>(r*14 + c + 2);
                        img[r][c].blue = static_cast<unsigned char>(r*14 + c + 3);
                        img[r][c].alpha = static_cast<unsigned char>(r*14 + c + 4);
                    }
                }

                ostringstream sout;
                save_dng(img, sout);
                istringstream sin(sout.str());

                img.clear();
                DLIB_CASSERT(img.nr() == 0,"");
                DLIB_CASSERT(img.nc() == 0,"");

                load_dng(img, sin);

                DLIB_CASSERT(img.nr() == 14,"");
                DLIB_CASSERT(img.nc() == 15,"");

                for (long r = 0; r < 14; ++r)
                {
                    for (long c = 0; c < 15; ++c)
                    {
                        DLIB_CASSERT(img[r][c].red == r*14 + c + 1, "");
                        DLIB_CASSERT(img[r][c].green == r*14 + c + 2, "");
                        DLIB_CASSERT(img[r][c].blue == r*14 + c + 3, "");
                        DLIB_CASSERT(img[r][c].alpha == r*14 + c + 4, "");
                    }
                }
            }

            {
                array2d<rgb_pixel>::kernel_1a img;
                img.set_size(14,15);
                for (long r = 0; r < 14; ++r)
                {
                    for (long c = 0; c < 15; ++c)
                    {
                        img[r][c].red = static_cast<unsigned char>(r*14 + c + 1);
                        img[r][c].green = static_cast<unsigned char>(r*14 + c + 2);
                        img[r][c].blue = static_cast<unsigned char>(r*14 + c + 3);
                    }
                }

                ostringstream sout;
                save_dng(img, sout);
                save_bmp(img, sout);
                save_dng(img, sout);
                save_bmp(img, sout);
                istringstream sin(sout.str());

                for (int i  = 0; i < 2; ++i)
                {
                    img.clear();
                    DLIB_CASSERT(img.nr() == 0,"");
                    DLIB_CASSERT(img.nc() == 0,"");

                    load_dng(img, sin);

                    DLIB_CASSERT(img.nr() == 14,"");
                    DLIB_CASSERT(img.nc() == 15,"");

                    for (long r = 0; r < 14; ++r)
                    {
                        for (long c = 0; c < 15; ++c)
                        {
                            DLIB_CASSERT(img[r][c].red == r*14 + c + 1, "");
                            DLIB_CASSERT(img[r][c].green == r*14 + c + 2, "");
                            DLIB_CASSERT(img[r][c].blue == r*14 + c + 3, "");
                        }
                    }

                    img.clear();
                    DLIB_CASSERT(img.nr() == 0,"");
                    DLIB_CASSERT(img.nc() == 0,"");

                    load_bmp(img, sin);

                    DLIB_CASSERT(img.nr() == 14,"");
                    DLIB_CASSERT(img.nc() == 15,"");

                    for (long r = 0; r < 14; ++r)
                    {
                        for (long c = 0; c < 15; ++c)
                        {
                            DLIB_CASSERT(img[r][c].red == r*14 + c + 1, "got " << (int)img[r][c].red << "  but expected " << r*14 + c + 1);
                            DLIB_CASSERT(img[r][c].green == r*14 + c + 2, "");
                            DLIB_CASSERT(img[r][c].blue == r*14 + c + 3, "");
                        }
                    }
                }
            }

            {
                array2d<unsigned short>::kernel_1a img;
                img.set_size(14,15);
                for (long r = 0; r < 14; ++r)
                {
                    for (long c = 0; c < 15; ++c)
                    {
                        img[r][c] = static_cast<unsigned short>(r*14 + c + 0xFF);
                    }
                }

                ostringstream sout;
                save_dng(img, sout);
                istringstream sin(sout.str());

                img.clear();
                DLIB_CASSERT(img.nr() == 0,"");
                DLIB_CASSERT(img.nc() == 0,"");

                load_dng(img, sin);

                DLIB_CASSERT(img.nr() == 14,"");
                DLIB_CASSERT(img.nc() == 15,"");

                for (long r = 0; r < 14; ++r)
                {
                    for (long c = 0; c < 15; ++c)
                    {
                        DLIB_CASSERT(img[r][c] == r*14 + c + 0xFF, "");
                    }
                }
            }

            {
                array2d<unsigned char>::kernel_1a img;
                img.set_size(14,15);
                for (long r = 0; r < 14; ++r)
                {
                    for (long c = 0; c < 15; ++c)
                    {
                        img[r][c] = static_cast<unsigned char>(r*14 + c);
                    }
                }

                ostringstream sout;
                save_dng(img, sout);
                save_bmp(img, sout);
                save_dng(img, sout);
                save_bmp(img, sout);
                istringstream sin(sout.str());

                for (int i = 0; i < 2; ++i)
                {
                    img.clear();
                    DLIB_CASSERT(img.nr() == 0,"");
                    DLIB_CASSERT(img.nc() == 0,"");

                    load_dng(img, sin);

                    DLIB_CASSERT(img.nr() == 14,"");
                    DLIB_CASSERT(img.nc() == 15,"");

                    for (long r = 0; r < 14; ++r)
                    {
                        for (long c = 0; c < 15; ++c)
                        {
                            DLIB_CASSERT(img[r][c] == r*14 + c, "");
                        }
                    }

                    img.clear();
                    DLIB_CASSERT(img.nr() == 0,"");
                    DLIB_CASSERT(img.nc() == 0,"");

                    load_bmp(img, sin);

                    DLIB_CASSERT(img.nr() == 14,"");
                    DLIB_CASSERT(img.nc() == 15,"");

                    for (long r = 0; r < 14; ++r)
                    {
                        for (long c = 0; c < 15; ++c)
                        {
                            DLIB_CASSERT(img[r][c] == r*14 + c, "");
                        }
                    }
                }
            }

            {
                // in this test we will only assign pixel values that can be
                // represented with 8 bits even though we are using a wider pixel type.
                array2d<unsigned short>::kernel_1a img;
                img.set_size(14,15);
                for (long r = 0; r < 14; ++r)
                {
                    for (long c = 0; c < 15; ++c)
                    {
                        img[r][c] = static_cast<unsigned char>(r*14 + c);
                    }
                }

                ostringstream sout;
                save_dng(img, sout);
                save_bmp(img, sout);
                save_dng(img, sout);
                save_bmp(img, sout);
                istringstream sin(sout.str());

                for (int i = 0; i < 2; ++i)
                {
                    img.clear();
                    DLIB_CASSERT(img.nr() == 0,"");
                    DLIB_CASSERT(img.nc() == 0,"");

                    load_dng(img, sin);

                    DLIB_CASSERT(img.nr() == 14,"");
                    DLIB_CASSERT(img.nc() == 15,"");

                    for (long r = 0; r < 14; ++r)
                    {
                        for (long c = 0; c < 15; ++c)
                        {
                            DLIB_CASSERT(img[r][c] == r*14 + c, "");
                        }
                    }

                    img.clear();
                    DLIB_CASSERT(img.nr() == 0,"");
                    DLIB_CASSERT(img.nc() == 0,"");

                    load_bmp(img, sin);

                    DLIB_CASSERT(img.nr() == 14,"");
                    DLIB_CASSERT(img.nc() == 15,"");

                    for (long r = 0; r < 14; ++r)
                    {
                        for (long c = 0; c < 15; ++c)
                        {
                            DLIB_CASSERT(img[r][c] == r*14 + c, "");
                        }
                    }
                }
            }

            {
                array2d<unsigned short>::kernel_1a_c img1;
                array2d<unsigned char>::kernel_1a_c img2;
                img1.set_size(10,10);
                assign_all_pixels(img1, 0);

                img1[5][5] = 10000;
                img1[7][7] = 10000;

                equalize_histogram(img1, img2);

                for (long r = 0; r < img1.nr(); ++r)
                {
                    for (long c = 0; c < img2.nc(); ++c)
                    {
                        if ((r == 5 && c == 5) ||
                            (r == 7 && c == 7))
                        {
                            DLIB_CASSERT(img2[r][c] == 255, "");
                        }
                        else
                        {
                            DLIB_CASSERT(img2[r][c] == 0, "");
                        }
                    }
                }

            }

        }

        class image_tester : public tester
        {
        public:
            image_tester (
            ) :
                tester ("test_image",
                        "Runs tests on the image processing objects and functions.")
            {}

            void perform_test (
            )
            {
                image_test();
            }
        } a;

    }