| 18 | 16, 4, 1, 4, 6, 4, 1}; |
| 19 | |
| 20 | array pyramid(const array& img, const int level, const bool sampling) { |
| 21 | array pyr = img.copy(); |
| 22 | array kernel(5, 5, pyramid_kernel); |
| 23 | kernel = kernel / 256.f; |
| 24 | if (sampling) { // Downsample |
| 25 | for (int i = 0; i < level; i++) { |
| 26 | for (int j = 0; j < pyr.dims(2); j++) |
| 27 | pyr(span, span, j) = convolve(pyr(span, span, j), kernel); |
| 28 | pyr = pyr(seq(0, pyr.dims(0) - 1, 2), seq(0, pyr.dims(1) - 1, 2), |
| 29 | span); |
| 30 | } |
| 31 | } else { // Up sample |
| 32 | for (int i = 0; i < level; i++) { |
| 33 | array tmp = |
| 34 | constant(0, pyr.dims(0) * 2, pyr.dims(1) * 2, pyr.dims(2)); |
| 35 | tmp(seq(0, 2 * pyr.dims(0) - 1, 2), seq(0, 2 * pyr.dims(1) - 1, 2), |
| 36 | span) = pyr; |
| 37 | for (int j = 0; j < pyr.dims(2); j++) |
| 38 | tmp(span, span, j) = convolve(tmp(span, span, j), kernel * 4.f); |
| 39 | pyr = tmp; |
| 40 | } |
| 41 | } |
| 42 | return pyr; |
| 43 | } |
| 44 | |
| 45 | void pyramids_demo() { |
| 46 | af::Window wnd_rgb("Image Pyramids - RGB Images"); |