38 #ifndef PCL_2D_CONVOLUTION_IMPL_HPP
39 #define PCL_2D_CONVOLUTION_IMPL_HPP
42 template <
typename Po
intT>
51 int iw =
static_cast<int>(input_->width), ih =
static_cast<int>(input_->height),
52 kw =
static_cast<int>(kernel_.width), kh =
static_cast<int>(kernel_.height);
53 switch (boundary_options_) {
55 case BOUNDARY_OPTION_CLAMP: {
56 for (
int i = 0; i < ih; i++) {
57 for (
int j = 0; j < iw; j++) {
59 for (
int k = 0; k < kh; k++) {
60 for (
int l = 0; l < kw; l++) {
61 int ikkh = i + k - kh / 2, jlkw = j + l - kw / 2;
77 kernel_(l, k).intensity * (*input_)(input_col, input_row).intensity;
80 output(j, i).intensity = intensity;
86 case BOUNDARY_OPTION_MIRROR: {
87 for (
int i = 0; i < ih; i++) {
88 for (
int j = 0; j < iw; j++) {
90 for (
int k = 0; k < kh; k++) {
91 for (
int l = 0; l < kw; l++) {
92 int ikkh = i + k - kh / 2, jlkw = j + l - kw / 2;
94 input_row = -ikkh - 1;
96 input_row = 2 * ih - 1 - ikkh;
101 input_col = -jlkw - 1;
103 input_col = 2 * iw - 1 - jlkw;
108 kernel_(l, k).intensity * ((*input_)(input_col, input_row).intensity);
111 output(j, i).intensity = intensity;
117 case BOUNDARY_OPTION_ZERO_PADDING: {
118 for (
int i = 0; i < ih; i++) {
119 for (
int j = 0; j < iw; j++) {
121 for (
int k = 0; k < kh; k++) {
122 for (
int l = 0; l < kw; l++) {
123 int ikkh = i + k - kh / 2, jlkw = j + l - kw / 2;
124 if (ikkh < 0 || ikkh >= ih || jlkw < 0 || jlkw >= iw)
126 intensity += kernel_(l, k).intensity * ((*input_)(jlkw, ikkh).intensity);
129 output(j, i).intensity = intensity;