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
52TEST_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);
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);
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);
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);
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")
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));
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")
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));
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));
206TEST_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);
222 CHECK((I_morpho_ref == I_morpho));
224 SECTION(
"8-connexity")
230 common_tools::imageDilatationRef(I_morpho_ref, 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 };
264 CHECK((I_dilatation_ref == I_morpho));
270 SECTION(
"4-connexity")
276 common_tools::imageErosionRef(I_morpho_ref, connexity);
279 CHECK((I_morpho_ref == I_morpho));
282 SECTION(
"8-connexity")
288 common_tools::imageErosionRef(I_morpho_ref, 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 };
322 CHECK((I_erosion_ref == I_morpho));
326 SECTION(
"Matlab reference")
328 SECTION(
"4-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));
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")
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));
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));
422int 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;
432int 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)
Definition of the vpImage class member functions.