C++ Image interpolation with Bicubic method
我只是想通过 BiCubic 插值来平滑图像。我得到了一些用于插入 RGB 图像的代码。我已更改代码以适用于灰度图像。但结果我只得到了全黑的图像。考虑的输入和输出图像大小相同。代码粘贴在下面。请帮我。提前致谢。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | inline Uint16 saturate(float x, unsigned max_pixel) { return x > max_pixel ? max_pixel : x < 0.0f ? 0 : Uint16(x); } inline float get_subpixel(const Uint16* in, std::size_t dest_width, std::size_t dest_height, unsigned x, unsigned y) { if (x < dest_width && y < dest_height) return in[(y * dest_width) + x]; return 0; } void interpolate(unsigned dest_width, unsigned dest_height, unsigned bits_allocated, const Uint16* src, Uint16** dest) { const double tx = 1; const double ty = 1; float C[5] = { 0 }; unsigned max_bit = pow(2, bits_allocated); for (unsigned i = 0; i < dest_height; ++i) { for (unsigned j = 0; j < dest_width; ++j) { const float x = float(tx * j); const float y = float(ty * i); const float dx = tx * j - x, dx2 = dx * dx, dx3 = dx2 * dx; const float dy = ty * i - y, dy2 = dy * dy, dy3 = dy2 * dy; for (int jj = 0; jj < 4; ++jj) { const int idx = y - 1 + jj; float a0 = get_subpixel(src, dest_width, dest_height, x, idx); float d0 = get_subpixel(src, dest_width, dest_height, x - 1, idx) - a0; float d2 = get_subpixel(src, dest_width, dest_height, x + 1, idx) - a0; float d3 = get_subpixel(src, dest_width, dest_height, x + 2, idx) - a0; float a1 = -(1.0f / 3.0f) * d0 + d2 - (1.0f / 6.0f) * d3; float a2 = 0.5f * d0 + 0.5f * d2; float a3 = -(1.0f / 6.0f) * d0 - 0.5f * d2 + (1.0f / 6.0f) * d3; C[jj] = a0 + a1 * dx + a2 * dx2 + a3 * dx3; d0 = C[0] - C[1]; d2 = C[2] - C[1]; d3 = C[3] - C[1]; a0 = C[1]; a1 = -(1.0f / 3.0f) * d0 + d2 - (1.0f / 6.0f) * d3; a2 = 0.5f * d0 + 0.5f * d2; a3 = -(1.0f / 6.0f) * d0 - 0.5f * d2 + (1.0f / 6.0f) * d3; (*dest)[i * dest_width + j] = saturate(a0 + a1 * dy + a2 * dy2 + a3 * dy3, max_bit); } } } } |
你怎么会有这个?直到 jj 循环结束才计算 c\\'s 大括号应该在 d\\'s 之上-否则我不考虑该方法是否正确。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | for (int jj = 0; jj < 4; ++jj) { const int idx = y - 1 + jj; float a0 = get_subpixel(src, dest_width, dest_height, x, idx); float d0 = get_subpixel(src, dest_width, dest_height, x - 1, idx) - a0; float d2 = get_subpixel(src, dest_width, dest_height, x + 1, idx) - a0; float d3 = get_subpixel(src, dest_width, dest_height, x + 2, idx) - a0; float a1 = -(1.0f / 3.0f) * d0 + d2 - (1.0f / 6.0f) * d3; float a2 = 0.5f * d0 + 0.5f * d2; float a3 = -(1.0f / 6.0f) * d0 - 0.5f * d2 + (1.0f / 6.0f) * d3; C[jj] = a0 + a1 * dx + a2 * dx2 + a3 * dx3; // } // end jj d0 = C[0] - C[1]; d2 = C[2] - C[1]; d3 = C[3] - C[1]; a0 = C[1]; a1 = -(1.0f / 3.0f) * d0 + d2 - (1.0f / 6.0f) * d3; a2 = 0.5f * d0 + 0.5f * d2; a3 = -(1.0f / 6.0f) * d0 - 0.5f * d2 + (1.0f / 6.0f) * d3; (*dest)[i * dest_height + j] = saturate(a0 + a1 * dy + a2 * dy2 + a3 * dy3, max_bit); } // end jj move his above } } |
我想分享很棒的链接
三次样条