34 #include <visp3/core/vpConfig.h>
35 #include <visp3/core/vpImageFilter.h>
39 #ifndef DOXYGEN_SHOULD_SKIP_THIS
40 double vpImageFilter::filterXR(
const vpImage<vpRGBa> &I,
unsigned int r,
unsigned int c,
const double *filter,
unsigned int size)
42 const unsigned int stop = (size - 1) / 2;
44 for (
unsigned int i = 1; i <= stop; ++i) {
45 result +=
filter[i] *
static_cast<double>(I[r][c + i].R + I[r][c - i].R);
47 return result + (
filter[0] *
static_cast<double>(I[r][c].R));
50 double vpImageFilter::filterXG(
const vpImage<vpRGBa> &I,
unsigned int r,
unsigned int c,
const double *filter,
unsigned int size)
52 const unsigned int stop = (size - 1) / 2;
55 for (
unsigned int i = 1; i <= stop; ++i) {
56 result +=
filter[i] *
static_cast<double>(I[r][c + i].G + I[r][c - i].G);
58 return result + (
filter[0] *
static_cast<double>(I[r][c].G));
61 double vpImageFilter::filterXB(
const vpImage<vpRGBa> &I,
unsigned int r,
unsigned int c,
const double *filter,
unsigned int size)
63 const unsigned int stop = (size - 1) / 2;
66 for (
unsigned int i = 1; i <= stop; ++i) {
67 result +=
filter[i] *
static_cast<double>(I[r][c + i].B + I[r][c - i].B);
69 return result + (
filter[0] *
static_cast<double>(I[r][c].B));
72 double vpImageFilter::filterXLeftBorderR(
const vpImage<vpRGBa> &I,
unsigned int r,
unsigned int c,
73 const double *filter,
unsigned int size)
75 const unsigned int stop = (size - 1) / 2;
78 for (
unsigned int i = 1; i <= stop; ++i) {
80 result +=
filter[i] *
static_cast<double>(I[r][c + i].R + I[r][c - i].R);
83 result +=
filter[i] *
static_cast<double>(I[r][c + i].R + I[r][i - c].R);
86 return result + (
filter[0] *
static_cast<double>(I[r][c].R));
89 double vpImageFilter::filterXLeftBorderG(
const vpImage<vpRGBa> &I,
unsigned int r,
unsigned int c,
90 const double *filter,
unsigned int size)
92 const unsigned int stop = (size - 1) / 2;
95 for (
unsigned int i = 1; i <= stop; ++i) {
97 result +=
filter[i] *
static_cast<double>(I[r][c + i].G + I[r][c - i].G);
100 result +=
filter[i] *
static_cast<double>(I[r][c + i].G + I[r][i - c].G);
103 return result + (
filter[0] *
static_cast<double>(I[r][c].G));
106 double vpImageFilter::filterXLeftBorderB(
const vpImage<vpRGBa> &I,
unsigned int r,
unsigned int c,
107 const double *filter,
unsigned int size)
109 const unsigned int stop = (size - 1) / 2;
112 for (
unsigned int i = 1; i <= stop; ++i) {
114 result +=
filter[i] *
static_cast<double>(I[r][c + i].B + I[r][c - i].B);
117 result +=
filter[i] *
static_cast<double>(I[r][c + i].B + I[r][i - c].B);
120 return result + (
filter[0] *
static_cast<double>(I[r][c].B));
123 double vpImageFilter::filterXRightBorderR(
const vpImage<vpRGBa> &I,
unsigned int r,
unsigned int c,
124 const double *filter,
unsigned int size)
126 const unsigned int val_2 = 2;
127 const unsigned int stop = (size - 1) / 2;
128 const unsigned int width = I.
getWidth();
131 for (
unsigned int i = 1; i <= stop; ++i) {
132 if ((c + i) < width) {
133 result +=
filter[i] *
static_cast<double>(I[r][c + i].R + I[r][c - i].R);
136 result +=
filter[i] *
static_cast<double>(I[r][((val_2 * width) - c) - i - 1].R + I[r][c - i].R);
139 return result + (
filter[0] *
static_cast<double>(I[r][c].R));
142 double vpImageFilter::filterXRightBorderG(
const vpImage<vpRGBa> &I,
unsigned int r,
unsigned int c,
143 const double *filter,
unsigned int size)
145 const unsigned int val_2 = 2;
146 const unsigned int stop = (size - 1) / 2;
147 const unsigned int width = I.
getWidth();
150 for (
unsigned int i = 1; i <= stop; ++i) {
151 if ((c + i) < width) {
152 result +=
filter[i] *
static_cast<double>(I[r][c + i].G + I[r][c - i].G);
155 result +=
filter[i] *
static_cast<double>(I[r][((val_2 * width) - c) - i - 1].G + I[r][c - i].G);
158 return result + (
filter[0] *
static_cast<double>(I[r][c].G));
161 double vpImageFilter::filterXRightBorderB(
const vpImage<vpRGBa> &I,
unsigned int r,
unsigned int c,
162 const double *filter,
unsigned int size)
164 const unsigned int val_2 = 2;
165 const unsigned int stop = (size - 1) / 2;
166 const unsigned int width = I.
getWidth();
169 for (
unsigned int i = 1; i <= stop; ++i) {
170 if ((c + i) < width) {
171 result +=
filter[i] *
static_cast<double>(I[r][c + i].B + I[r][c - i].B);
174 result +=
filter[i] *
static_cast<double>(I[r][(val_2 * width) - c - i - 1].B + I[r][c - i].B);
177 return result + (
filter[0] *
static_cast<double>(I[r][c].B));
180 double vpImageFilter::filterYR(
const vpImage<vpRGBa> &I,
unsigned int r,
unsigned int c,
const double *filter,
unsigned int size)
182 const unsigned int stop = (size - 1) / 2;
185 for (
unsigned int i = 1; i <= stop; ++i) {
186 result +=
filter[i] *
static_cast<double>(I[r + i][c].R + I[r - i][c].R);
188 return result + (
filter[0] *
static_cast<double>(I[r][c].R));
191 double vpImageFilter::filterYG(
const vpImage<vpRGBa> &I,
unsigned int r,
unsigned int c,
const double *filter,
unsigned int size)
193 const unsigned int stop = (size - 1) / 2;
196 for (
unsigned int i = 1; i <= stop; ++i) {
197 result +=
filter[i] *
static_cast<double>(I[r + i][c].G + I[r - i][c].G);
199 return result + (
filter[0] *
static_cast<double>(I[r][c].G));
202 double vpImageFilter::filterYB(
const vpImage<vpRGBa> &I,
unsigned int r,
unsigned int c,
const double *filter,
unsigned int size)
204 const unsigned int stop = (size - 1) / 2;
207 for (
unsigned int i = 1; i <= stop; ++i) {
208 result +=
filter[i] *
static_cast<double>(I[r + i][c].B + I[r - i][c].B);
210 return result + (
filter[0] *
static_cast<double>(I[r][c].B));
213 double vpImageFilter::filterYTopBorderR(
const vpImage<vpRGBa> &I,
unsigned int r,
unsigned int c,
const double *filter,
unsigned int size)
215 const unsigned int stop = (size - 1) / 2;
218 for (
unsigned int i = 1; i <= stop; ++i) {
220 result +=
filter[i] *
static_cast<double>(I[r + i][c].R + I[r - i][c].R);
223 result +=
filter[i] *
static_cast<double>(I[r + i][c].R + I[i - r][c].R);
226 return result + (
filter[0] *
static_cast<double>(I[r][c].R));
229 double vpImageFilter::filterYTopBorderG(
const vpImage<vpRGBa> &I,
unsigned int r,
unsigned int c,
const double *filter,
unsigned int size)
231 const unsigned int stop = (size - 1) / 2;
234 for (
unsigned int i = 1; i <= stop; ++i) {
236 result +=
filter[i] *
static_cast<double>(I[r + i][c].G + I[r - i][c].G);
239 result +=
filter[i] *
static_cast<double>(I[r + i][c].G + I[i - r][c].G);
242 return result + (
filter[0] *
static_cast<double>(I[r][c].G));
245 double vpImageFilter::filterYTopBorderB(
const vpImage<vpRGBa> &I,
unsigned int r,
unsigned int c,
const double *filter,
unsigned int size)
247 const unsigned int stop = (size - 1) / 2;
250 for (
unsigned int i = 1; i <= stop; ++i) {
252 result +=
filter[i] *
static_cast<double>(I[r + i][c].B + I[r - i][c].B);
255 result +=
filter[i] *
static_cast<double>(I[r + i][c].B + I[i - r][c].B);
258 return result + (
filter[0] *
static_cast<double>(I[r][c].B));
261 double vpImageFilter::filterYBottomBorderR(
const vpImage<vpRGBa> &I,
unsigned int r,
unsigned int c,
262 const double *filter,
unsigned int size)
264 const unsigned int val_2 = 2;
265 const unsigned int height = I.
getHeight();
266 const unsigned int stop = (size - 1) / 2;
269 for (
unsigned int i = 1; i <= stop; ++i) {
270 if ((r + i) < height) {
271 result +=
filter[i] *
static_cast<double>(I[r + i][c].R + I[r - i][c].R);
274 result +=
filter[i] *
static_cast<double>(I[((val_2 * height) - r) - i - 1][c].R + I[r - i][c].R);
277 return result + (
filter[0] *
static_cast<double>(I[r][c].R));
280 double vpImageFilter::filterYBottomBorderG(
const vpImage<vpRGBa> &I,
unsigned int r,
unsigned int c,
281 const double *filter,
unsigned int size)
283 const unsigned int val_2 = 2;
284 const unsigned int height = I.
getHeight();
285 const unsigned int stop = (size - 1) / 2;
288 for (
unsigned int i = 1; i <= stop; ++i) {
289 if ((r + i) < height) {
290 result +=
filter[i] *
static_cast<double>(I[r + i][c].G + I[r - i][c].G);
293 result +=
filter[i] *
static_cast<double>(I[((val_2 * height) - r) - i - 1][c].G + I[r - i][c].G);
296 return result + (
filter[0] *
static_cast<double>(I[r][c].G));
299 double vpImageFilter::filterYBottomBorderB(
const vpImage<vpRGBa> &I,
unsigned int r,
unsigned int c,
300 const double *filter,
unsigned int size)
302 const unsigned int val_2 = 2;
303 const unsigned int height = I.
getHeight();
304 const unsigned int stop = (size - 1) / 2;
307 for (
unsigned int i = 1; i <= stop; ++i) {
308 if ((r + i) < height) {
309 result +=
filter[i] *
static_cast<double>(I[r + i][c].B + I[r - i][c].B);
312 result +=
filter[i] *
static_cast<double>(I[((val_2 * height) - r) - i - 1][c].B + I[r - i][c].B);
315 return result + (
filter[0] *
static_cast<double>(I[r][c].B));
static void filter(const vpImage< ImageType > &I, vpImage< FilterType > &If, const vpArray2D< FilterType > &M, bool convolve=false, const vpImage< bool > *p_mask=nullptr)
unsigned int getWidth() const
unsigned int getHeight() const