Visual Servoing Platform version 3.5.0
vpImageMorphology.cpp
1/****************************************************************************
2 *
3 * ViSP, open source Visual Servoing Platform software.
4 * Copyright (C) 2005 - 2019 by Inria. All rights reserved.
5 *
6 * This software is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 * See the file LICENSE.txt at the root directory of this source
11 * distribution for additional information about the GNU GPL.
12 *
13 * For using ViSP with software that can not be combined with the GNU
14 * GPL, please contact Inria about acquiring a ViSP Professional
15 * Edition License.
16 *
17 * See http://visp.inria.fr for more information.
18 *
19 * This software was developed at:
20 * Inria Rennes - Bretagne Atlantique
21 * Campus Universitaire de Beaulieu
22 * 35042 Rennes Cedex
23 * France
24 *
25 * If you have questions regarding the use of this file, please contact
26 * Inria at visp@inria.fr
27 *
28 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
29 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
30 *
31 * Description:
32 * Image morphology.
33 *
34 * Authors:
35 * Souriya Trinh
36 *
37 *****************************************************************************/
38
39#include <visp3/core/vpImageMorphology.h>
40
41#include <Simd/SimdLib.hpp>
42
67{
68 if (I.getSize() == 0) {
69 std::cerr << "Input image is empty!" << std::endl;
70 return;
71 }
72
73 const unsigned char null_value = 255;
74
75 vpImage<unsigned char> J(I.getHeight() + 2, I.getWidth() + 2);
76 // Copy I to J and add border
77 for (unsigned int i = 0; i < J.getHeight(); i++) {
78 if (i == 0 || i == J.getHeight() - 1) {
79 for (unsigned int j = 0; j < J.getWidth(); j++) {
80 J[i][j] = null_value;
81 }
82 } else {
83 J[i][0] = null_value;
84 memcpy(J[i] + 1, I[i - 1], sizeof(unsigned char) * I.getWidth());
85 J[i][J.getWidth() - 1] = null_value;
86 }
87 }
88
89 SimdImageErosion(I.bitmap, J.bitmap, I.getWidth(), I.getHeight(),
90 connexity == CONNEXITY_4 ? SimdImageConnexity4 : SimdImageConnexity8);
91}
92
117{
118 if (I.getSize() == 0) {
119 std::cerr << "Input image is empty!" << std::endl;
120 return;
121 }
122
123 const unsigned char null_value = 0;
124
125 vpImage<unsigned char> J(I.getHeight() + 2, I.getWidth() + 2);
126 // Copy I to J and add border
127 for (unsigned int i = 0; i < J.getHeight(); i++) {
128 if (i == 0 || i == J.getHeight() - 1) {
129 for (unsigned int j = 0; j < J.getWidth(); j++) {
130 J[i][j] = null_value;
131 }
132 } else {
133 J[i][0] = null_value;
134 memcpy(J[i] + 1, I[i - 1], sizeof(unsigned char) * I.getWidth());
135 J[i][J.getWidth() - 1] = null_value;
136 }
137 }
138
139 SimdImageDilatation(I.bitmap, J.bitmap, I.getWidth(), I.getHeight(),
140 connexity == CONNEXITY_4 ? SimdImageConnexity4 : SimdImageConnexity8);
141}
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)
unsigned int getWidth() const
Definition: vpImage.h:246
unsigned int getSize() const
Definition: vpImage.h:227
Type * bitmap
points toward the bitmap
Definition: vpImage.h:143
unsigned int getHeight() const
Definition: vpImage.h:188