5
5
6
6
namespace opencv_test { namespace {
7
7
8
- TEST (xphoto_simplecolorbalance, regression )
8
+ TEST (xphoto_simplecolorbalance, uchar_max_value )
9
9
{
10
- cv::String dir = cvtest::TS::ptr ()->get_data_path () + " cv/xphoto/simple_white_balance/" ;
11
- int nTests = 8 ;
12
- cv::Ptr<cv::xphoto::WhiteBalancer> wb = cv::xphoto::createSimpleWB ();
10
+ const uchar oldMax = 120 , newMax = 255 ;
13
11
14
- for (int i = 0 ; i < nTests; ++i)
15
- {
16
- cv::String srcName = dir + cv::format ( " sources/%02d.png" , i + 1 );
17
- cv::Mat src = cv::imread ( srcName, 1 );
18
- ASSERT_TRUE (!src.empty ());
12
+ Mat test = Mat::zeros (3 ,3 ,CV_8UC1);
13
+ test.at <uchar>(0 , 0 ) = oldMax;
14
+ test.at <uchar>(0 , 1 ) = oldMax / 2 ;
15
+ test.at <uchar>(0 , 2 ) = oldMax / 4 ;
19
16
20
- cv::String previousResultName = dir + cv::format ( " results/%02d.jpg" , i + 1 );
21
- cv::Mat previousResult = cv::imread ( previousResultName, 1 );
17
+ cv::Ptr<cv::xphoto::SimpleWB> wb = cv::xphoto::createSimpleWB ();
18
+ wb->setInputMin (0 );
19
+ wb->setInputMax (oldMax);
20
+ wb->setOutputMin (0 );
21
+ wb->setOutputMax (newMax);
22
22
23
- cv::Mat currentResult;
24
- wb->balanceWhite (src, currentResult);
23
+ wb->balanceWhite (test, test);
25
24
26
- double psnr = cv::PSNR (currentResult, previousResult);
25
+ double minDst, maxDst;
26
+ cv::minMaxIdx (test, &minDst, &maxDst);
27
27
28
- EXPECT_GE ( psnr, 30 );
29
- }
28
+ ASSERT_NEAR (maxDst, newMax, 1e-4 );
30
29
}
31
30
32
- TEST (xphoto_simplecolorbalance, max_value )
31
+ TEST (xphoto_simplecolorbalance, uchar_min_value )
33
32
{
34
- const float oldMax = 24000 ., newMax = 65536 .;
33
+ const uchar oldMin = 120 , newMin = 0 ;
34
+
35
+ Mat test = Mat::zeros (1 ,3 ,CV_8UC1);
36
+ test.at <uchar>(0 , 0 ) = oldMin;
37
+ test.at <uchar>(0 , 1 ) = (256 + oldMin) / 2 ;
38
+ test.at <uchar>(0 , 2 ) = 255 ;
39
+
40
+ cv::Ptr<cv::xphoto::SimpleWB> wb = cv::xphoto::createSimpleWB ();
41
+ wb->setInputMin (oldMin);
42
+ wb->setInputMax (255 );
43
+ wb->setOutputMin (newMin);
44
+ wb->setOutputMax (255 );
45
+
46
+ wb->balanceWhite (test, test);
47
+
48
+ double minDst, maxDst;
49
+ cv::minMaxIdx (test, &minDst, &maxDst);
50
+
51
+ ASSERT_NEAR (minDst, newMin, 1e-4 );
52
+ }
53
+
54
+ TEST (xphoto_simplecolorbalance, uchar_equal_range)
55
+ {
56
+ const int N = 4 ;
57
+ uchar data[N] = {0 , 1 , 16 , 255 };
58
+ Mat test = Mat (1 , N, CV_8UC1, data);
59
+ Mat result = Mat (1 , N, CV_8UC1, data);
60
+
61
+ cv::Ptr<cv::xphoto::SimpleWB> wb = cv::xphoto::createSimpleWB ();
62
+ wb->setInputMin (0 );
63
+ wb->setInputMax (255 );
64
+ wb->setOutputMin (0 );
65
+ wb->setOutputMax (255 );
66
+
67
+ wb->balanceWhite (test, test);
68
+
69
+ double err;
70
+ cv::minMaxIdx (cv::abs (test - result), NULL , &err);
71
+ ASSERT_LE (err, 1e-4 );
72
+ }
73
+
74
+ TEST (xphoto_simplecolorbalance, uchar_single_value)
75
+ {
76
+ const int N = 4 ;
77
+ uchar data0[N] = {51 , 51 , 51 , 51 };
78
+ uchar data1[N] = {33 , 33 , 33 , 33 };
79
+ Mat test = Mat (1 , N, CV_8UC1, data0);
80
+ Mat result = Mat (1 , N, CV_8UC1, data1);
81
+
82
+ cv::Ptr<cv::xphoto::SimpleWB> wb = cv::xphoto::createSimpleWB ();
83
+ wb->setInputMin (51 );
84
+ wb->setInputMax (51 );
85
+ wb->setOutputMin (33 );
86
+ wb->setOutputMax (200 );
87
+
88
+ wb->balanceWhite (test, test);
89
+
90
+ double err;
91
+ cv::minMaxIdx (cv::abs (test - result), NULL , &err);
92
+ ASSERT_LE (err, 1e-4 );
93
+ }
94
+
95
+ TEST (xphoto_simplecolorbalance, uchar_p)
96
+ {
97
+ const int N = 5 ;
98
+ uchar data0[N] = {10 , 55 , 102 , 188 , 233 };
99
+ uchar data1[N] = {0 , 1 , 90 , 254 , 255 };
100
+ Mat test = Mat (1 , N, CV_8UC1, data0);
101
+ Mat result = Mat (1 , N, CV_8UC1, data1);
102
+
103
+ cv::Ptr<cv::xphoto::SimpleWB> wb = cv::xphoto::createSimpleWB ();
104
+ wb->setInputMin (10 );
105
+ wb->setInputMax (233 );
106
+ wb->setOutputMin (0 );
107
+ wb->setOutputMax (255 );
108
+ wb->setP (21 );
109
+
110
+ wb->balanceWhite (test, test);
111
+
112
+ double err;
113
+ cv::minMaxIdx (cv::abs (test - result), NULL , &err);
114
+ ASSERT_LE (err, 1e-4 );
115
+ }
116
+
117
+ TEST (xphoto_simplecolorbalance, uchar_c3)
118
+ {
119
+ const int N = 15 ;
120
+ uchar data0[N] = {10 , 55 , 102 , 55 , 102 , 188 , 102 , 188 , 233 , 188 , 233 , 10 , 233 , 10 , 55 };
121
+ uchar data1[N] = {0 , 1 , 90 , 1 , 90 , 254 , 90 , 254 , 255 , 254 , 255 , 0 , 255 , 0 , 1 };
122
+ Mat test = Mat (1 , N / 3 , CV_8UC3, data0);
123
+ Mat result = Mat (1 , N / 3 , CV_8UC3, data1);
124
+
125
+ cv::Ptr<cv::xphoto::SimpleWB> wb = cv::xphoto::createSimpleWB ();
126
+ wb->setInputMin (10 );
127
+ wb->setInputMax (233 );
128
+ wb->setOutputMin (0 );
129
+ wb->setOutputMax (255 );
130
+ wb->setP (21 );
131
+
132
+ wb->balanceWhite (test, test);
133
+
134
+ double err;
135
+ cv::minMaxIdx (cv::abs (test - result), NULL , &err);
136
+ ASSERT_LE (err, 1e-4 );
137
+ }
138
+
139
+ TEST (xphoto_simplecolorbalance, float_max_value)
140
+ {
141
+ const float oldMax = 24000 .f , newMax = 65536 .f ;
35
142
36
143
Mat test = Mat::zeros (3 ,3 ,CV_32FC1);
37
144
test.at <float >(0 , 0 ) = oldMax;
@@ -55,5 +162,112 @@ namespace opencv_test { namespace {
55
162
ASSERT_NEAR (maxDst, newMax, newMax*1e-4 );
56
163
}
57
164
165
+ TEST (xphoto_simplecolorbalance, float_min_value)
166
+ {
167
+ const float oldMin = 24000 .f , newMin = 0 .f ;
168
+
169
+ Mat test = Mat::zeros (1 ,3 ,CV_32FC1);
170
+ test.at <float >(0 , 0 ) = oldMin;
171
+ test.at <float >(0 , 1 ) = (65536 .f + oldMin) / 2 ;
172
+ test.at <float >(0 , 2 ) = 65536 .f ;
173
+
174
+ cv::Ptr<cv::xphoto::SimpleWB> wb = cv::xphoto::createSimpleWB ();
175
+ wb->setInputMin (oldMin);
176
+ wb->setInputMax (65536 .f );
177
+ wb->setOutputMin (newMin);
178
+ wb->setOutputMax (65536 .f );
179
+
180
+ wb->balanceWhite (test, test);
181
+
182
+ double minDst, maxDst;
183
+ cv::minMaxIdx (test, &minDst, &maxDst);
184
+
185
+ ASSERT_NEAR (minDst, newMin, 65536 *1e-4 );
186
+ }
187
+
188
+ TEST (xphoto_simplecolorbalance, float_equal_range)
189
+ {
190
+ const int N = 5 ;
191
+ float data[N] = {0 .f , 1 .f , 16 .2f , 256 .3f , 4096 .f };
192
+ Mat test = Mat (1 , N, CV_32FC1, data);
193
+ Mat result = Mat (1 , N, CV_32FC1, data);
194
+
195
+ cv::Ptr<cv::xphoto::SimpleWB> wb = cv::xphoto::createSimpleWB ();
196
+ wb->setInputMin (0 );
197
+ wb->setInputMax (4096 );
198
+ wb->setOutputMin (0 );
199
+ wb->setOutputMax (4096 );
200
+
201
+ wb->balanceWhite (test, test);
202
+
203
+ double err;
204
+ cv::minMaxIdx (cv::abs (test - result), NULL , &err);
205
+ ASSERT_LE (err, 1e-4 );
206
+ }
207
+
208
+ TEST (xphoto_simplecolorbalance, float_single_value)
209
+ {
210
+ const int N = 4 ;
211
+ float data0[N] = {24000 .5f , 24000 .5f , 24000 .5f , 24000 .5f };
212
+ float data1[N] = {52000 .25f , 52000 .25f , 52000 .25f , 52000 .25f };
213
+ Mat test = Mat (1 , N, CV_32FC1, data0);
214
+ Mat result = Mat (1 , N, CV_32FC1, data1);
215
+
216
+ cv::Ptr<cv::xphoto::SimpleWB> wb = cv::xphoto::createSimpleWB ();
217
+ wb->setInputMin (24000 .5f );
218
+ wb->setInputMax (24000 .5f );
219
+ wb->setOutputMin (52000 .25f );
220
+ wb->setOutputMax (65536 .f );
221
+
222
+ wb->balanceWhite (test, test);
223
+
224
+ double err;
225
+ cv::minMaxIdx (cv::abs (test - result), NULL , &err);
226
+ ASSERT_LE (err, 65536 *1e-4 );
227
+ }
228
+
229
+ TEST (xphoto_simplecolorbalance, float_p)
230
+ {
231
+ const int N = 5 ;
232
+ float data0[N] = {16000 .f , 20000 .5f , 24000 .f , 36000 .5f , 48000 .f };
233
+ float data1[N] = {-16381 .952f , 0 .f , 16381 .952f , 65536 .f , 114685 .952f };
234
+ Mat test = Mat (1 , N, CV_32FC1, data0);
235
+ Mat result = Mat (1 , N, CV_32FC1, data1);
236
+
237
+ cv::Ptr<cv::xphoto::SimpleWB> wb = cv::xphoto::createSimpleWB ();
238
+ wb->setInputMin (16000 .f );
239
+ wb->setInputMax (48000 .f );
240
+ wb->setOutputMin (0 .f );
241
+ wb->setOutputMax (65536 .f );
242
+ wb->setP (21 );
243
+
244
+ wb->balanceWhite (test, test);
245
+
246
+ double err;
247
+ cv::minMaxIdx (cv::abs (test - result), NULL , &err);
248
+ ASSERT_LE (err, 65536 *1e-4 );
249
+ }
250
+
251
+ TEST (xphoto_simplecolorbalance, float_c3)
252
+ {
253
+ const int N = 15 ;
254
+ float data0[N] = {16000 .f , 20000 .5f , 24000 .f , 20000 .5f , 24000 .f , 36000 .5f , 24000 .f , 36000 .5f , 48000 .f , 36000 .5f , 48000 .f , 16000 .f , 48000 .f , 16000 .f , 20000 .5f };
255
+ float data1[N] = {-16381 .952f , 0 .f , 16381 .952f , 0 .f , 16381 .952f , 65536 .f , 16381 .952f , 65536 .f , 114685 .952f , 65536 .f , 114685 .952f , -16381 .952f , 114685 .952f , -16381 .952f , 0 .f };
256
+ Mat test = Mat (1 , N / 3 , CV_32FC3, data0);
257
+ Mat result = Mat (1 , N / 3 , CV_32FC3, data1);
258
+
259
+ cv::Ptr<cv::xphoto::SimpleWB> wb = cv::xphoto::createSimpleWB ();
260
+ wb->setInputMin (16000 .f );
261
+ wb->setInputMax (48000 .f );
262
+ wb->setOutputMin (0 .f );
263
+ wb->setOutputMax (65536 .f );
264
+ wb->setP (21 );
265
+
266
+ wb->balanceWhite (test, test);
267
+
268
+ double err;
269
+ cv::minMaxIdx (cv::abs (test - result), NULL , &err);
270
+ ASSERT_LE (err, 65536 *1e-4 );
271
+ }
58
272
59
273
}} // namespace
0 commit comments