1 // This file is part of OpenCV project.
2 // It is subject to the license terms in the LICENSE file found in the top-level directory
3 // of this distribution and at http://opencv.org/license.html.
4 
5 #include "test_precomp.hpp"
6 
7 using namespace cv;
8 
9 namespace opencv_test { namespace {
10 
TEST(intensity_transform_logTransform,accuracy)11 TEST(intensity_transform_logTransform, accuracy)
12 {
13     uchar image_data[] = {
14          51, 211, 212,  38,  48,  25, 189,  16,  64, 197,
15         104, 137,  60,  10,  78, 234, 186, 149,  37, 236,
16         128,  80,   6,  53,   7,  65, 233,  15, 216,  42,
17         108, 132, 136, 194, 117, 128, 214,  46, 220, 119,
18         101, 126, 148,  22,  86, 206,  91, 125, 234,  24,
19         162, 136,  46, 247, 245,  81, 157, 126,  73, 173,
20         120, 230, 117, 111, 145, 168, 169, 187,  23, 109,
21           0, 184,  23,  43, 108, 201,  13, 170, 249, 228,
22         107,  59,  73, 254, 116, 156, 209, 155, 149,  95,
23          24, 245, 136, 107, 192, 114,  69,  80, 199,   8
24     };
25 
26     Mat_<uchar> image(10, 10, image_data);
27 
28     Mat res;
29     cv::intensity_transform::logTransform(image, res);
30 
31     uchar expectedRes_data[] = {
32         182, 247, 247, 169, 179, 150, 241, 130, 192, 243,
33         214, 227, 189, 110, 201, 251, 241, 231, 167, 252,
34         224, 202,  90, 184,  96, 193, 251, 128, 248, 173,
35         216, 225, 226, 243, 220, 224, 247, 177, 248, 220,
36         213, 223, 230, 144, 206, 245, 208, 223, 251, 148,
37         234, 226, 177, 254, 253, 203, 233, 223, 198, 237,
38         221, 250, 220, 217, 229, 236, 236, 241, 146, 216,
39           0, 240, 146, 174, 216, 244, 121, 237, 254, 250,
40         215, 188, 198, 255, 219, 233, 246, 232, 231, 210,
41         148, 253, 226, 215, 242, 218, 196, 202, 244, 101
42     };
43 
44     Mat_<uchar> expectedRes(10, 10, expectedRes_data);
45 
46     EXPECT_LE(cvtest::norm(res, expectedRes, NORM_INF), 1);
47 }
48 
TEST(intensity_transform_gammaCorrection,accuracy1)49 TEST(intensity_transform_gammaCorrection, accuracy1)
50 {
51     uchar image_data[] = {
52          51, 211, 212,  38,  48,  25, 189,  16,  64, 197,
53         104, 137,  60,  10,  78, 234, 186, 149,  37, 236,
54         128,  80,   6,  53,   7,  65, 233,  15, 216,  42,
55         108, 132, 136, 194, 117, 128, 214,  46, 220, 119,
56         101, 126, 148,  22,  86, 206,  91, 125, 234,  24,
57         162, 136,  46, 247, 245,  81, 157, 126,  73, 173,
58         120, 230, 117, 111, 145, 168, 169, 187,  23, 109,
59           0, 184,  23,  43, 108, 201,  13, 170, 249, 228,
60         107,  59,  73, 254, 116, 156, 209, 155, 149,  95,
61          24, 245, 136, 107, 192, 114,  69,  80, 199,   8
62     };
63 
64     Mat_<uchar> image(10, 10, image_data);
65 
66     Mat res;
67     cv::intensity_transform::gammaCorrection(image, res, 1.0);
68 
69     uchar expectedRes_data[] = {
70          51, 211, 212,  38,  48,  25, 189,  16,  64, 197,
71         104, 137,  60,  10,  78, 234, 186, 149,  37, 236,
72         128,  80,   6,  53,   7,  65, 233,  15, 216,  42,
73         108, 132, 136, 194, 117, 128, 214,  46, 220, 119,
74         101, 126, 148,  22,  86, 206,  91, 125, 234,  24,
75         162, 136,  46, 247, 245,  81, 157, 126,  73, 173,
76         120, 230, 117, 111, 145, 168, 169, 187,  23, 109,
77           0, 184,  23,  43, 108, 201,  13, 170, 249, 228,
78         107,  59,  73, 254, 116, 156, 209, 155, 149,  95,
79          24, 245, 136, 107, 192, 114,  69,  80, 199,   8
80     };
81 
82     Mat_<uchar> expectedRes(10, 10, expectedRes_data);
83 
84     EXPECT_LE(cvtest::norm(res, expectedRes, NORM_INF), 1);
85 }
86 
TEST(intensity_transform_gammaCorrection,accuracy2)87 TEST(intensity_transform_gammaCorrection, accuracy2)
88 {
89     uchar image_data[] = {
90          51, 211, 212,  38,  48,  25, 189,  16,  64, 197,
91         104, 137,  60,  10,  78, 234, 186, 149,  37, 236,
92         128,  80,   6,  53,   7,  65, 233,  15, 216,  42,
93         108, 132, 136, 194, 117, 128, 214,  46, 220, 119,
94         101, 126, 148,  22,  86, 206,  91, 125, 234,  24,
95         162, 136,  46, 247, 245,  81, 157, 126,  73, 173,
96         120, 230, 117, 111, 145, 168, 169, 187,  23, 109,
97           0, 184,  23,  43, 108, 201,  13, 170, 249, 228,
98         107,  59,  73, 254, 116, 156, 209, 155, 149,  95,
99          24, 245, 136, 107, 192, 114,  69,  80, 199,   8
100     };
101 
102     Mat_<uchar> image(10, 10, image_data);
103 
104     Mat res;
105     cv::intensity_transform::gammaCorrection(image, res, (float)(0.4));
106 
107     uchar expectedRes_data[] = {
108         133, 236, 236, 119, 130, 100, 226,  84, 146, 229,
109         178, 198, 142,  69, 158, 246, 224, 205, 117, 247,
110         193, 160,  56, 136,  60, 147, 245,  82, 238, 123,
111         180, 195, 198, 228, 186, 193, 237, 128, 240, 187,
112         176, 192, 205,  95, 165, 234, 168, 191, 246,  99,
113         212, 198, 128, 251, 250, 161, 210, 192, 154, 218,
114         188, 244, 186, 182, 203, 215, 216, 225,  97, 181,
115           0, 223,  97, 125, 180, 231,  77, 216, 252, 243,
116         180, 141, 154, 254, 186, 209, 235, 208, 205, 171,
117          99, 250, 198, 180, 227, 184, 151, 160, 230, 63
118     };
119 
120     Mat_<uchar> expectedRes(10, 10, expectedRes_data);
121 
122     EXPECT_LE(cvtest::norm(res, expectedRes, NORM_INF), 1);
123 }
124 
TEST(intensity_transform_autoscaling,accuracy)125 TEST(intensity_transform_autoscaling, accuracy)
126 {
127     uchar image_data[] = {
128          32,  59, 164, 127, 151, 107, 167,  62, 195, 143,
129          54, 166, 104,  27, 152,  20,  35, 135,  12, 198,
130         107,  63,  90, 169,  67, 135, 136,  14,  94, 115,
131          34, 150, 169, 171, 130,  39, 190, 108, 103,  32,
132          57,  83, 146,  37,  81, 143, 144,  47,  87,  49,
133          32, 108,  17, 165, 127, 137, 108,  35, 179, 175,
134          40, 148, 174,  79, 146, 119, 103, 168, 167, 160,
135          66, 107, 164,  19,  85, 126,  58,  95,  15, 131,
136          88,  58, 162,  90, 147, 125,  61, 157,  60, 104,
137         128, 193,  69, 104,  94, 196,  11,  66,  18, 179
138     };
139 
140     Mat_<uchar> image(10, 10, image_data);
141 
142     Mat res;
143     cv::intensity_transform::autoscaling(image, res);
144 
145     uchar expectedRes_data[] = {
146          29,  65, 209, 158, 191, 131, 213,  70, 251, 180,
147          59, 211, 127,  22, 192,  12,  33, 169,   1, 255,
148         131,  71, 108, 215,  76, 169, 170,   4, 113, 142,
149          31, 190, 215, 218, 162,  38, 244, 132, 125,  29,
150          63,  98, 184,  35,  95, 180, 181,  49, 104,  52,
151          29, 132,   8, 210, 158, 172, 132,  33, 229, 224,
152          40, 187, 222,  93, 184, 147, 125, 214, 213, 203,
153          75, 131, 209,  11, 101, 157,  64, 115,   5, 164,
154         105,  64, 206, 108, 185, 155,  68, 199,  67, 127,
155         160, 248,  79, 127, 113, 252,   0,  75,  10, 229
156     };
157 
158     Mat_<uchar> expectedRes(10, 10, expectedRes_data);
159 
160     EXPECT_LE(cvtest::norm(res, expectedRes, NORM_INF), 1);
161 }
162 
TEST(intensity_transform_contrastStretching,accuracy)163 TEST(intensity_transform_contrastStretching, accuracy)
164 {
165     uchar image_data[] = {
166          32,  59, 164, 127, 151, 107, 167,  62, 195, 143,
167          54, 166, 104,  27, 152,  20,  35, 135,  12, 198,
168         107,  63,  90, 169,  67, 135, 136,  14,  94, 115,
169          34, 150, 169, 171, 130,  39, 190, 108, 103,  32,
170          57,  83, 146,  37,  81, 143, 144,  47,  87,  49,
171          32, 108,  17, 165, 127, 137, 108,  35, 179, 175,
172          40, 148, 174,  79, 146, 119, 103, 168, 167, 160,
173          66, 107, 164,  19,  85, 126,  58,  95,  15, 131,
174          88,  58, 162,  90, 147, 125,  61, 157,  60, 104,
175         128, 193,  69, 104,  94, 196,  11,  66,  18, 179
176     };
177 
178     Mat_<uchar> image(10, 10, image_data);
179 
180     Mat res;
181     cv::intensity_transform::contrastStretching(image, res, 70, 15, 120, 240);
182 
183     uchar expectedRes_data[] = {
184           6,  12, 244, 240, 243, 181, 245,  13, 248, 242,
185          11, 245, 168,   5, 243,   4,   7, 241,   2, 248,
186         181,  13, 105, 245,  14, 241, 241,   3, 123, 217,
187           7, 243, 245, 245, 241,   8, 247, 186, 163,   6,
188          12,  73, 242,   7,  64, 242, 242,  10,  91,  10,
189           6, 186,   3, 245, 240, 241, 186,   7, 246, 246,
190           8, 243, 246,  55, 242, 235, 163, 245, 245, 244,
191          14, 181, 244,   4,  82, 240,  12, 127,   3, 241,
192          96,  12, 244, 105, 243, 240,  13, 244,  12, 168,
193         240, 248,  14, 168, 123, 248,   2,  14,   3, 246
194     };
195 
196     Mat_<uchar> expectedRes(10, 10, expectedRes_data);
197 
198     EXPECT_LE(cvtest::norm(res, expectedRes, NORM_INF), 1);
199 }
200 
201 typedef testing::TestWithParam<std::string> intensity_transform_BIMEF;
202 
TEST_P(intensity_transform_BIMEF,accuracy)203 TEST_P(intensity_transform_BIMEF, accuracy)
204 {
205 #ifdef HAVE_EIGEN
206     const std::string directory = "intensity_transform/BIMEF/";
207     std::string filename = GetParam();
208 
209     const std::string inputFilename = cvtest::findDataFile(directory + filename + ".png");
210     Mat img = imread(inputFilename);
211     EXPECT_TRUE(!img.empty());
212     Mat imgBIMEF;
213     BIMEF(img, imgBIMEF);
214 
215     const std::string referenceFilename = cvtest::findDataFile(directory + filename + "_ref.png");
216     Mat imgRef = imread(referenceFilename);
217     EXPECT_TRUE(!imgRef.empty());
218 
219     EXPECT_EQ(imgBIMEF.rows, imgRef.rows);
220     EXPECT_EQ(imgBIMEF.cols, imgRef.cols);
221     EXPECT_EQ(imgBIMEF.type(), imgRef.type());
222     double rmse = sqrt(cv::norm(imgBIMEF, imgRef, NORM_L2SQR) / (imgRef.total()*imgRef.channels()));
223     std::cout << "BIMEF, RMSE for " << filename << ": " << rmse << std::endl;
224     const float max_rmse = 9;
225     EXPECT_LE(rmse, max_rmse);
226 #endif
227 }
228 
229 const string BIMEF_accuracy_cases[] = {
230     "P1000205_resize",
231     "P1010676_resize",
232     "P1010815_resize"
233 };
234 
235 INSTANTIATE_TEST_CASE_P(/*nothing*/, intensity_transform_BIMEF,
236     testing::ValuesIn(BIMEF_accuracy_cases)
237 );
238 
239 }} // namespace
240