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