40 #include <visp3/core/vpConfig.h>
42 #if defined(VISP_HAVE_CATCH2)
45 #include <catch_amalgamated.hpp>
46 #include <visp3/core/vpImageFilter.h>
47 #include <visp3/core/vpImageMorphology.h>
49 #ifdef ENABLE_VISP_NAMESPACE
52 TEST_CASE(
"Binary image morphology",
"[image_morphology]")
54 unsigned char image_data[8 * 16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
55 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0,
56 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0,
57 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1,
58 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1,
59 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
60 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1,
61 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 };
67 SECTION(
"4-connexity")
74 common_tools::imageDilatationRef(I_morpho_ref, connexity);
76 vpImageMorphology::dilatation<unsigned char>(I_morpho, connexity);
78 CHECK((I_morpho_ref == I_morpho_tpl));
79 CHECK((I_morpho_ref == I_morpho));
81 SECTION(
"8-connexity")
88 common_tools::imageDilatationRef(I_morpho_ref, connexity);
90 vpImageMorphology::dilatation<unsigned char>(I_morpho, connexity);
92 CHECK((I_morpho_ref == I_morpho_tpl));
93 CHECK((I_morpho_ref == I_morpho));
99 SECTION(
"4-connexity")
106 common_tools::imageErosionRef(I_morpho_ref, connexity);
108 vpImageMorphology::erosion<unsigned char>(I_morpho, connexity);
110 CHECK((I_morpho_ref == I_morpho_tpl));
111 CHECK((I_morpho_ref == I_morpho));
114 SECTION(
"8-connexity")
121 common_tools::imageErosionRef(I_morpho_ref, connexity);
123 vpImageMorphology::erosion<unsigned char>(I_morpho, connexity);
125 CHECK((I_morpho_ref == I_morpho_tpl));
126 CHECK((I_morpho_ref == I_morpho));
129 SECTION(
"8-connexity-size5")
132 I_dilatation_ref[0][0] = 0;
133 I_dilatation_ref[0][1] = 0;
134 I_dilatation_ref[0][2] = 0;
135 I_dilatation_ref[6][12] = 0;
136 I_dilatation_ref[7][12] = 0;
145 CHECK((I_dilatation_ref == I_dilatation));
146 CHECK((I_erosion_ref == I_erosion));
150 SECTION(
"Matlab reference")
152 SECTION(
"4-connexity")
156 vpImageMorphology::dilatation<unsigned char>(I_dilatation, connexity);
158 unsigned char image_data_dilatation[8 * 16] = {
159 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0,
160 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1,
161 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1,
162 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1 };
164 CHECK((I_dilatation_ref == I_dilatation));
167 vpImageMorphology::erosion<unsigned char>(I_erosion, connexity);
169 unsigned char image_data_erosion[8 * 16] = {
170 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0,
171 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1,
172 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
173 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 };
175 CHECK((I_erosion_ref == I_erosion));
178 SECTION(
"8-connexity")
182 vpImageMorphology::dilatation<unsigned char>(I_dilatation, connexity);
184 unsigned char image_data_dilatation[8 * 16] = {
185 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1,
186 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
187 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1,
188 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1 };
190 CHECK((I_dilatation_ref == I_dilatation));
193 vpImageMorphology::erosion<unsigned char>(I_erosion, connexity);
195 unsigned char image_data_erosion[8 * 16] = {
196 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0,
197 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1,
198 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1,
199 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1 };
201 CHECK((I_erosion_ref == I_erosion));
206 TEST_CASE(
"Gray image morphology",
"[image_morphology]")
209 common_tools::magicSquare(I, 17);
211 SECTION(
"Dilatation")
213 SECTION(
"4-connexity")
219 common_tools::imageDilatationRef(I_morpho_ref, connexity);
220 vpImageMorphology::dilatation<unsigned char>(I_morpho, connexity);
222 CHECK((I_morpho_ref == I_morpho));
224 SECTION(
"8-connexity")
230 common_tools::imageDilatationRef(I_morpho_ref, connexity);
231 vpImageMorphology::dilatation<unsigned char>(I_morpho, connexity);
233 CHECK((I_morpho_ref == I_morpho));
236 SECTION(
"8-connexity-size5")
240 unsigned char count = 1;
241 for (
int r = 0; r < 12; r++) {
242 for (
int c = 0; c < 12; c++) {
243 I_morpho[r][c] = count;
247 unsigned char image_data_dilatation[12 * 12] = {
248 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 36, 36,
249 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 48, 48,
250 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 60, 60,
251 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 72, 72,
252 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 84, 84,
253 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 96, 96,
254 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 108, 108,
255 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 120, 120,
256 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 132, 132,
257 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 144, 144,
258 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 144, 144,
259 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 144, 144 };
262 vpImageMorphology::dilatation<unsigned char>(I_morpho, size);
264 CHECK((I_dilatation_ref == I_morpho));
270 SECTION(
"4-connexity")
276 common_tools::imageErosionRef(I_morpho_ref, connexity);
277 vpImageMorphology::erosion<unsigned char>(I_morpho, connexity);
279 CHECK((I_morpho_ref == I_morpho));
282 SECTION(
"8-connexity")
288 common_tools::imageErosionRef(I_morpho_ref, connexity);
289 vpImageMorphology::erosion<unsigned char>(I_morpho, connexity);
291 CHECK((I_morpho_ref == I_morpho));
294 SECTION(
"8-connexity-size5")
298 unsigned char count = 1;
299 for (
int r = 0; r < 12; r++) {
300 for (
int c = 0; c < 12; c++) {
301 I_morpho[r][c] = count;
305 unsigned char image_data_erosion[12 * 12] = {
306 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
307 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
308 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
309 13, 13, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
310 25, 25, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
311 37, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
312 49, 49, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58,
313 61, 61, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
314 73, 73, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82,
315 85, 85, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94,
316 97, 97, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106,
317 109, 109, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118 };
320 vpImageMorphology::erosion<unsigned char>(I_morpho, size);
322 CHECK((I_erosion_ref == I_morpho));
326 SECTION(
"Matlab reference")
328 SECTION(
"4-connexity")
332 vpImageMorphology::dilatation<unsigned char>(I_dilatation, connexity);
334 unsigned char image_data_dilatation[17 * 17] = {
335 174, 193, 212, 231, 250, 255, 255, 255, 255, 39, 58, 77, 96, 115, 134, 153, 154, 192, 211, 230, 249,
336 255, 255, 255, 255, 38, 57, 76, 95, 114, 133, 152, 170, 172, 210, 229, 248, 255, 255, 255, 255, 37,
337 56, 75, 94, 113, 132, 151, 170, 172, 190, 228, 247, 255, 255, 255, 255, 36, 55, 74, 93, 112, 131,
338 150, 169, 187, 190, 208, 246, 255, 255, 255, 255, 51, 54, 73, 92, 111, 130, 149, 168, 187, 189, 208,
339 226, 255, 255, 255, 255, 51, 53, 72, 91, 110, 129, 148, 167, 186, 204, 207, 226, 244, 255, 255, 255,
340 50, 68, 71, 90, 109, 128, 147, 166, 185, 204, 206, 225, 244, 255, 255, 255, 49, 68, 70, 89, 108,
341 127, 146, 165, 184, 203, 221, 224, 243, 255, 255, 255, 48, 67, 85, 88, 107, 126, 145, 164, 183, 202,
342 221, 223, 242, 255, 255, 255, 47, 66, 85, 87, 106, 125, 144, 163, 182, 201, 220, 238, 241, 255, 255,
343 255, 255, 65, 84, 102, 105, 124, 143, 162, 181, 200, 219, 238, 240, 255, 255, 255, 255, 45, 83, 102,
344 104, 123, 142, 161, 180, 199, 218, 237, 255, 255, 255, 255, 255, 45, 63, 101, 119, 122, 141, 160, 179,
345 198, 217, 236, 255, 255, 255, 255, 255, 44, 63, 81, 119, 121, 140, 159, 178, 197, 216, 235, 254, 255,
346 255, 255, 255, 43, 62, 81, 99, 136, 139, 158, 177, 196, 215, 234, 253, 255, 255, 255, 255, 42, 61,
347 80, 99, 117, 138, 157, 176, 195, 214, 233, 252, 255, 255, 255, 255, 41, 60, 79, 98, 117, 135, 156,
348 175, 194, 213, 232, 251, 255, 255, 255, 255, 40, 59, 78, 97, 116, 135, 135 };
350 CHECK((I_dilatation_ref == I_dilatation));
353 vpImageMorphology::erosion<unsigned char>(I_erosion, connexity);
355 unsigned char image_data_erosion[17 * 17] = {
356 174, 174, 193, 212, 231, 250, 255, 255, 38, 39, 39, 58, 77, 96, 115, 134, 153, 174, 192, 211, 230,
357 249, 255, 255, 37, 38, 38, 57, 76, 95, 114, 133, 152, 154, 192, 210, 229, 248, 255, 255, 36, 37,
358 37, 56, 75, 94, 113, 132, 151, 170, 172, 210, 228, 247, 255, 255, 36, 36, 36, 55, 74, 93, 112,
359 131, 150, 169, 172, 190, 228, 246, 255, 255, 51, 51, 36, 54, 73, 92, 111, 130, 149, 168, 187, 189,
360 208, 246, 255, 255, 50, 51, 51, 53, 72, 91, 110, 129, 148, 167, 186, 189, 207, 226, 255, 255, 49,
361 50, 50, 53, 71, 90, 109, 128, 147, 166, 185, 204, 206, 225, 244, 255, 48, 49, 49, 68, 70, 89,
362 108, 127, 146, 165, 184, 203, 206, 224, 243, 255, 47, 48, 48, 67, 70, 88, 107, 126, 145, 164, 183,
363 202, 221, 223, 242, 255, 255, 47, 47, 66, 85, 87, 106, 125, 144, 163, 182, 201, 220, 223, 241, 255,
364 255, 45, 47, 65, 84, 87, 105, 124, 143, 162, 181, 200, 219, 238, 240, 255, 255, 45, 45, 65, 83,
365 102, 104, 123, 142, 161, 180, 199, 218, 237, 240, 255, 255, 44, 45, 45, 83, 101, 104, 122, 141, 160,
366 179, 198, 217, 236, 255, 255, 255, 43, 44, 44, 63, 101, 119, 121, 140, 159, 178, 197, 216, 235, 254,
367 255, 255, 42, 43, 43, 62, 81, 119, 121, 139, 158, 177, 196, 215, 234, 253, 255, 255, 41, 42, 42,
368 61, 80, 99, 136, 138, 157, 176, 195, 214, 233, 252, 255, 255, 40, 41, 41, 60, 79, 98, 117, 138,
369 156, 175, 194, 213, 232, 251, 255, 255, 40, 40, 40, 59, 78, 97, 116, 135 };
371 CHECK((I_erosion_ref == I_erosion));
374 SECTION(
"8-connexity")
378 vpImageMorphology::dilatation<unsigned char>(I_dilatation, connexity);
380 unsigned char image_data_dilatation[17 * 17] = {
381 192, 211, 230, 249, 255, 255, 255, 255, 255, 57, 76, 95, 114, 133, 152, 154, 154, 210, 229, 248, 255,
382 255, 255, 255, 255, 255, 75, 94, 113, 132, 151, 170, 172, 172, 228, 247, 255, 255, 255, 255, 255, 255,
383 74, 93, 112, 131, 150, 169, 171, 190, 190, 246, 255, 255, 255, 255, 255, 255, 73, 92, 111, 130, 149,
384 168, 187, 189, 208, 208, 255, 255, 255, 255, 255, 255, 72, 91, 110, 129, 148, 167, 186, 188, 207, 226,
385 226, 255, 255, 255, 255, 255, 71, 90, 109, 128, 147, 166, 185, 204, 206, 225, 244, 244, 255, 255, 255,
386 255, 70, 89, 108, 127, 146, 165, 184, 203, 205, 224, 243, 255, 255, 255, 255, 255, 69, 88, 107, 126,
387 145, 164, 183, 202, 221, 223, 242, 255, 255, 255, 255, 255, 85, 87, 106, 125, 144, 163, 182, 201, 220,
388 222, 241, 255, 255, 255, 255, 65, 84, 86, 105, 124, 143, 162, 181, 200, 219, 238, 240, 255, 255, 255,
389 255, 255, 83, 102, 104, 123, 142, 161, 180, 199, 218, 237, 239, 255, 255, 255, 255, 255, 255, 101, 103,
390 122, 141, 160, 179, 198, 217, 236, 255, 255, 255, 255, 255, 255, 255, 63, 119, 121, 140, 159, 178, 197,
391 216, 235, 254, 255, 255, 255, 255, 255, 255, 81, 81, 120, 139, 158, 177, 196, 215, 234, 253, 255, 255,
392 255, 255, 255, 255, 80, 99, 99, 138, 157, 176, 195, 214, 233, 252, 255, 255, 255, 255, 255, 255, 79,
393 98, 117, 117, 156, 175, 194, 213, 232, 251, 255, 255, 255, 255, 255, 255, 78, 97, 116, 135, 135, 156,
394 175, 194, 213, 232, 251, 255, 255, 255, 255, 255, 59, 78, 97, 116, 135, 135 };
396 CHECK((I_dilatation_ref == I_dilatation));
399 vpImageMorphology::erosion<unsigned char>(I_erosion, connexity);
401 unsigned char image_data_erosion[17 * 17] = {
402 192, 192, 211, 230, 249, 255, 255, 255, 57, 57, 57, 76, 95, 114, 133, 152, 154, 192, 192, 211, 230,
403 249, 255, 255, 74, 57, 57, 57, 76, 95, 114, 133, 152, 154, 210, 210, 229, 248, 255, 255, 73, 73,
404 73, 74, 75, 94, 113, 132, 151, 170, 172, 228, 228, 247, 255, 255, 72, 72, 72, 73, 74, 93, 112,
405 131, 150, 169, 171, 190, 246, 246, 255, 255, 71, 71, 71, 72, 73, 92, 111, 130, 149, 168, 187, 189,
406 208, 255, 255, 255, 70, 70, 70, 71, 72, 91, 110, 129, 148, 167, 186, 188, 207, 226, 255, 255, 69,
407 69, 69, 70, 71, 90, 109, 128, 147, 166, 185, 204, 206, 225, 244, 255, 85, 69, 69, 69, 70, 89,
408 108, 127, 146, 165, 184, 203, 205, 224, 243, 255, 65, 65, 69, 69, 69, 88, 107, 126, 145, 164, 183,
409 202, 221, 223, 242, 255, 255, 65, 65, 84, 85, 87, 106, 125, 144, 163, 182, 201, 220, 222, 241, 255,
410 255, 255, 65, 65, 84, 86, 105, 124, 143, 162, 181, 200, 219, 238, 240, 255, 255, 63, 63, 83, 83,
411 102, 104, 123, 142, 161, 180, 199, 218, 237, 239, 255, 255, 81, 63, 63, 101, 101, 103, 122, 141, 160,
412 179, 198, 217, 236, 255, 255, 255, 80, 80, 63, 63, 119, 119, 121, 140, 159, 178, 197, 216, 235, 254,
413 255, 255, 79, 79, 79, 80, 81, 120, 120, 139, 158, 177, 196, 215, 234, 253, 255, 255, 78, 78, 78,
414 79, 80, 99, 138, 138, 157, 176, 195, 214, 233, 252, 255, 255, 59, 59, 59, 78, 79, 98, 117, 156,
415 156, 175, 194, 213, 232, 251, 255, 255, 255, 59, 59, 59, 78, 97, 116, 135 };
417 CHECK((I_erosion_ref == I_erosion));
422 int main(
int argc,
char *argv[])
424 Catch::Session session;
425 session.applyCommandLine(argc, argv);
426 int numFailed = session.run();
427 std::cout << (numFailed ?
"Test failed" :
"Test succeed") << std::endl;
432 int main() {
return EXIT_SUCCESS; }
static void dilatation(vpImage< Type > &I, Type value, Type value_out, vpConnexityType connexity=CONNEXITY_4)
static void erosion(vpImage< Type > &I, Type value, Type value_out, vpConnexityType connexity=CONNEXITY_4)