使用 Halide 时无法以 png 格式保存图像

Not able to save image in png format while using Halide

我在 Windows 机器上使用 Visual Studio 尝试 运行 以下程序:

#include <Halide.h>
#include "halide_image_io.h"
#include "png.h"

using namespace Halide;
using namespace Halide::Tools;

int main(int argc, char** argv)
{
    Buffer<uint8_t> in = load_image("images/rgb.png");
    Func blurx, out;
    Var  x, y,c, xi, yi;
    printf("width : %d, height: %d and channels: %d",in.width(),in.height(),in.channels());
    //width = 768, height = 1280
    blurx(x, y,c) = (in(x, y,c) + in(x, y,c) + in(x, y,c)) / 3.0f;
    out(x, y,c) = (blurx(x, y,c) + blurx(x, y,c) + blurx(x, y,c)) / 3.0f;
    out.tile(x, y, xi, yi, 256, 32).vectorize(xi, 8).parallel(y);
    Buffer<uint8_t> result = out.realize(in.width(), in.height(),in.channels());
    save_image(result, "output/output.png");
    return 0;
    }

我收到错误 "Image cannot be saved in this format"。当我删除“/3.0f”时,不会发生错误。因此,除法可能会导致某些像素值成为无效格式。因此,我无法将其保存为 .png 格式。我该如何解决这个问题? 请注意:公式应该是 (in(x-1, y,c) + in(x, y,c) + in(x+1, y,c)) / 3.0f; ....但是,这给了我错误"access out of boundaries of input buffer"。我试图首先解决除法错误,所以暂时,我修改了公式..这帮助我捕获了这个错误。

除以 3.0fout(和 blurx)的推断类型从 uint8_t 更改为 float。我认为问题在于 save_image 助手不允许将浮点缓冲区保存为 PNG。要返回 uint8_t,请尝试将定义 out 的整个表达式包装在 cast<uint8_t>(...).

(注意:您可能还希望向上转换输入值至少 uint16_t 以避免在将其中 3 个相加时快速溢出。)

我进行了以下更改,现在可以使用了:

#include <Halide.h>
#include "halide_image_io.h"
#include "png.h"

using namespace Halide;
using namespace Halide::Tools;

int main(int argc, char** argv)
{
    Buffer<uint8_t> in = load_image("images/rgb.png");
    Func blurx, out;
    Var  x, y,c, xi, yi;
    Func in_bounded = BoundaryConditions::repeat_edge(in);
    Func input_16;
    input_16(x, y) = cast<uint16_t>(in_bounded(x, y));

    blurx(x, y,c) = (input_16(x, y,c) + input_16(x, y,c) + input_16(x, y,c)) / 3;
    out(x, y,c) =  cast<uint8_t>(blurx(x, y,c) + blurx(x, y,c) + blurx(x, y,c)) / 3);
    out.tile(x, y, xi, yi, 256, 32).vectorize(xi, 8).parallel(y);
    Buffer<uint8_t> result = out.realize(in.width(), in.height(),in.channels());
    save_image(result, "output/output.png");
    return 0;
    }