## Coverage Report

#### Created: 2026-05-04 15:30

next uncovered line (L), next uncovered region (R), next uncovered branch (B)

    /home/liu/actions-runner/_work/ccv/ccv/test/unit/basic.tests.c

    Line
    Count
    Source
    1
    #include "ccv.h"
    2
    #include "case.h"
    3
    #include "ccv_case.h"
    4
    5
    #ifdef HAVE_LIBPNG
    6
    TEST_CASE("sobel operation")
    7
    1
    {
    8
    1
      ccv_dense_matrix_t* image = 0;
    9
    1
      ccv_read("../../samples/chessbox.png", &image, CCV_IO_GRAY | CCV_IO_ANY_FILE);
    10
    1
      ccv_dense_matrix_t* x = 0;
    11
    1
      ccv_sobel(image, &x, 0, 0, 1);
    12
    1
      REQUIRE_MATRIX_FILE_EQ(x, "data/chessbox.sobel.x.bin", "should be sobel of partial derivative on x");
    13
    1
      ccv_dense_matrix_t* y = 0;
    14
    1
      ccv_sobel(image, &y, 0, 1, 0);
    15
    1
      REQUIRE_MATRIX_FILE_EQ(y, "data/chessbox.sobel.y.bin", "should be sobel of partial derivative on y");
    16
    1
      ccv_dense_matrix_t* u = 0;
    17
    1
      ccv_sobel(image, &u, 0, 1, 1);
    18
    1
      REQUIRE_MATRIX_FILE_EQ(u, "data/chessbox.sobel.u.bin", "should be sobel of derivative along diagonal");
    19
    1
      ccv_dense_matrix_t* v = 0;
    20
    1
      ccv_sobel(image, &v, 0, -1, 1);
    21
    1
      REQUIRE_MATRIX_FILE_EQ(v, "data/chessbox.sobel.v.bin", "should be sobel of derivative along the other diagonal");
    22
    1
      ccv_dense_matrix_t* x3 = 0;
    23
    1
      ccv_sobel(image, &x3, 0, 0, 3);
    24
    1
      REQUIRE_MATRIX_FILE_EQ(x3, "data/chessbox.sobel.x.3.bin", "should be sobel of partial derivative on x within 3x3 window");
    25
    1
      ccv_dense_matrix_t* y3 = 0;
    26
    1
      ccv_sobel(image, &y3, 0, 3, 0);
    27
    1
      REQUIRE_MATRIX_FILE_EQ(y3, "data/chessbox.sobel.y.3.bin", "should be sobel of partial derivative on y within 3x3 window");
    28
    1
      ccv_dense_matrix_t* x5 = 0;
    29
    1
      ccv_sobel(image, &x5, 0, 0, 5);
    30
    1
      REQUIRE_MATRIX_FILE_EQ(x5, "data/chessbox.sobel.x.5.bin", "should be sobel of partial derivative on x within 5x5 window");
    31
    1
      ccv_dense_matrix_t* y5 = 0;
    32
    1
      ccv_sobel(image, &y5, 0, 5, 0);
    33
    1
      REQUIRE_MATRIX_FILE_EQ(y5, "data/chessbox.sobel.y.5.bin", "should be sobel of partial derivative on y within 5x5 window");
    34
    1
      ccv_matrix_free(image);
    35
    1
      ccv_matrix_free(x);
    36
    1
      ccv_matrix_free(y);
    37
    1
      ccv_matrix_free(u);
    38
    1
      ccv_matrix_free(v);
    39
    1
      ccv_matrix_free(x3);
    40
    1
      ccv_matrix_free(y3);
    41
    1
      ccv_matrix_free(x5);
    42
    1
      ccv_matrix_free(y5);
    43
    1
    }
    44
    45
    TEST_CASE("resample operation of CCV_INTER_AREA")
    46
    1
    {
    47
    1
      ccv_dense_matrix_t* image = 0;
    48
    1
      ccv_read("../../samples/chessbox.png", &image, CCV_IO_ANY_FILE);
    49
    1
      ccv_dense_matrix_t* x = 0;
    50
    1
      ccv_resample(image, &x, 0, 1.0 / 5.0, 1.0 / 5.0, CCV_INTER_AREA);
    51
    1
      REQUIRE_MATRIX_FILE_EQ(x, "data/chessbox.resample.bin", "should be a image of color dot");
    52
    1
      ccv_matrix_free(image);
    53
    1
      ccv_matrix_free(x);
    54
    1
    }
    55
    56
    TEST_CASE("sample down operation with source offset (10, 10)")
    57
    1
    {
    58
    1
      ccv_dense_matrix_t* image = 0;
    59
    1
      ccv_read("../../samples/chessbox.png", &image, CCV_IO_ANY_FILE);
    60
    1
      ccv_dense_matrix_t* x = 0;
    61
    1
      ccv_sample_down(image, &x, 0, 10, 10);
    62
    1
      REQUIRE_MATRIX_FILE_EQ(x, "data/chessbox.sample_down.bin", "should be down sampled (/2) image with offset from source (10, 10)");
    63
    1
      ccv_matrix_free(image);
    64
    1
      ccv_matrix_free(x);
    65
    1
    }
    66
    67
    TEST_CASE("sample up operation with source offset (10, 10)")
    68
    1
    {
    69
    1
      ccv_dense_matrix_t* image = 0;
    70
    1
      ccv_read("../../samples/chessbox.png", &image, CCV_IO_ANY_FILE);
    71
    1
      ccv_dense_matrix_t* x = 0;
    72
    1
      ccv_sample_up(image, &x, 0, 10, 10);
    73
    1
      REQUIRE_MATRIX_FILE_EQ(x, "data/chessbox.sample_up.bin", "should be down sampled (/2) image with offset from source (10, 10)");
    74
    1
      ccv_matrix_free(image);
    75
    1
      ccv_matrix_free(x);
    76
    1
    }
    77
    78
    TEST_CASE("blur operation with sigma 10")
    79
    1
    {
    80
    1
      ccv_dense_matrix_t* image = 0;
    81
    1
      ccv_read("../../samples/nature.png", &image, CCV_IO_ANY_FILE);
    82
    1
      ccv_dense_matrix_t* x = 0;
    83
    1
      ccv_blur(image, &x, 0, sqrt(10));
    84
    1
      REQUIRE_MATRIX_FILE_EQ(x, "data/nature.blur.bin", "should be image applied with Gaussian filter with sigma sqrt(10)");
    85
    1
      ccv_matrix_free(image);
    86
    1
      ccv_matrix_free(x);
    87
    1
    }
    88
    89
    TEST_CASE("flip operation")
    90
    1
    {
    91
    1
      ccv_dense_matrix_t* image = 0;
    92
    1
      ccv_read("../../samples/chessbox.png", &image, CCV_IO_ANY_FILE);
    93
    1
      ccv_dense_matrix_t* x = 0;
    94
    1
      ccv_flip(image, &x, 0, CCV_FLIP_X);
    95
    1
      REQUIRE_MATRIX_FILE_EQ(x, "data/chessbox.flip_x.bin", "flipped x-axis (around y-axis)");
    96
    1
      ccv_dense_matrix_t* y = 0;
    97
    1
      ccv_flip(image, &y, 0, CCV_FLIP_Y);
    98
    1
      REQUIRE_MATRIX_FILE_EQ(y, "data/chessbox.flip_y.bin", "flipped y-axis (around x-axis)");
    99
    1
      ccv_dense_matrix_t* xy = 0;
    100
    1
      ccv_flip(image, &xy, 0, CCV_FLIP_X | CCV_FLIP_Y);
    101
    1
      REQUIRE_MATRIX_FILE_EQ(xy, "data/chessbox.flip_xy.bin", "flipped xy-axis (rotated 180)");
    102
    1
      ccv_matrix_free(image);
    103
    1
      ccv_matrix_free(x);
    104
    1
      ccv_matrix_free(y);
    105
    1
      ccv_matrix_free(xy);
    106
    1
    }
    107
    108
    TEST_CASE("canny edge detector")
    109
    1
    {
    110
    1
      ccv_dense_matrix_t* image = 0;
    111
    1
      ccv_read("../../samples/blackbox.png", &image, CCV_IO_GRAY | CCV_IO_ANY_FILE);
    112
    1
      ccv_dense_matrix_t* x = 0;
    113
    1
      ccv_canny(image, &x, 0, 3, 36, 36 * 3);
    114
    1
      REQUIRE_MATRIX_FILE_EQ(x, "data/blackbox.canny.bin", "Canny edge detector on artificial image");
    115
    1
      ccv_matrix_free(image);
    116
    1
      ccv_matrix_free(x);
    117
    1
    }
    118
    119
    TEST_CASE("otsu threshold")
    120
    1
    {
    121
    1
      ccv_dense_matrix_t* image = ccv_dense_matrix_new(6, 6, CCV_32S | CCV_C1, 0, 0);
    122
      /* the test case is grabbed from: http://www.labbookpages.co.uk/software/imgProc/otsuThreshold.html */
    123
    1
      image->data.i32[0] = image->data.i32[1] = image->data.i32[6] = image->data.i32[22] = image->data.i32[23] = image->data.i32[28] = image->data.i32[29] = image->data.i32[35] = 0;
    124
    1
      image->data.i32[2] = image->data.i32[7] = image->data.i32[12] = image->data.i32[16] = image->data.i32[21] = image->data.i32[27] = image->data.i32[34] = 1;
    125
    1
      image->data.i32[15] = image->data.i32[26] = 2;
    126
    1
      image->data.i32[8] = image->data.i32[10] = image->data.i32[13] = image->data.i32[17] = image->data.i32[20] = image->data.i32[33] = 3;
    127
    1
      image->data.i32[3] = image->data.i32[4] = image->data.i32[9] = image->data.i32[11] = image->data.i32[14] = image->data.i32[18] = image->data.i32[19] = image->data.i32[25] = image->data.i32[32] = 4;
    128
    1
      image->data.i32[5] = image->data.i32[24] = image->data.i32[30] = image->data.i32[31] = 5;
    129
    1
      double var;
    130
    1
      int threshold = ccv_otsu(image, &var, 6);
    131
    1
      REQUIRE_EQ(threshold, 2, "threshold should be 2 (inclusive)");
    132
    1
      REQUIRE_EQ_WITH_TOLERANCE(var, 2.6287, 0.0001, "between class variance should be 2.6287");
    133
    1
      ccv_matrix_free(image);
    134
    1
    }
    135
    136
    TEST_CASE("erode operation")
    137
    1
    {
    138
    1
      ccv_dense_matrix_t* image = 0;
    139
    1
      ccv_read("../../samples/chessbox.png", &image, CCV_IO_ANY_FILE);
    140
    1
      ccv_dense_matrix_t* x = 0;
    141
    1
      ccv_erode(image, &x, 0, 3);
    142
    1
      REQUIRE_MATRIX_FILE_EQ(x, "data/chessbox.erode_3x3.bin", "erode with 3x3");
    143
    1
      ccv_dense_matrix_t* y = 0;
    144
    1
      ccv_erode(image, &y, 0, 5);
    145
    1
      REQUIRE_MATRIX_FILE_EQ(y, "data/chessbox.erode_5x5.bin", "erode with 5x5");
    146
    1
      ccv_matrix_free(image);
    147
    1
      ccv_matrix_free(x);
    148
    1
      ccv_matrix_free(y);
    149
    1
    }
    150
    151
    TEST_CASE("dilate operation")
    152
    1
    {
    153
    1
      ccv_dense_matrix_t* image = 0;
    154
    1
      ccv_read("../../samples/chessbox.png", &image, CCV_IO_ANY_FILE);
    155
    1
      ccv_dense_matrix_t* x = 0;
    156
    1
      ccv_dilate(image, &x, 0, 3);
    157
    1
      REQUIRE_MATRIX_FILE_EQ(x, "data/chessbox.dilate_3x3.bin", "dilate with 3x3");
    158
    1
      ccv_dense_matrix_t* y = 0;
    159
    1
      ccv_dilate(image, &y, 0, 5);
    160
    1
      REQUIRE_MATRIX_FILE_EQ(y, "data/chessbox.dilate_5x5.bin", "dilate with 5x5");
    161
    1
      ccv_matrix_free(image);
    162
    1
      ccv_matrix_free(x);
    163
    1
      ccv_matrix_free(y);
    164
    1
    }
    165
    #endif
    166
    167
    #include "case_main.h"