使用双三次方法的 C++ 图像插值

标签 c++ image-processing bicubic

我只是想通过 BiCubic 插值来平滑图像。我得到了一些用于插值 RGB 图像的代码。我已更改代码以适用于灰度图像。但结果我只得到了全黑的图像。考虑的输入和输出图像大小相同。代码贴在下面。请帮我。提前致谢。

 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,大括号应位于 d 之上 - 否则我不考虑该方法是否正确。

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
    }
}

关于使用双三次方法的 C++ 图像插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36469357/

相关文章:

c++ - 简单继承案例中的模板参数推导/替换失败

c++ - 在新的 C++ 库中处理多种字符串类型

r - 如何从R中的灰度图像获取像素矩阵?

image-processing - 以下用于图像调整大小的 c++ 双三次插值代码有什么问题

android - 如何在 Android 中使用双三次插值在 Canvas 上绘制和缩放位图?

c++ - 双三次插值结果与 FFMPEG 不同

c++ - 设计用于处理对象的管道

c++ - Windows应用程序中的键盘类实现

image - 计算彩色图像的对比度(RGB)

c++ - Point Grey Research Triclops 只读取 1 帧