使用Halide时无法将图像保存为png格式。

问题描述 投票:0回答:1

我尝试在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;
    }

我得到的错误是 "图像不能以这种格式保存"。当我删除 "3.0f "时,该错误不会发生。所以,除法可能会导致一些像素值是无效的格式。因此,我无法将其保存为.png格式。请注意:公式应该是(in(x-1, y,c)+in(x, y,c)+in(x+1, y,c))3.0f;......但是,这给我的错误是 "访问出输入缓冲区的边界"......。我正试图先解决除法错误,所以暂时修改了公式......这帮助我发现了这个错误。

png halide
1个回答
0
投票

加上除数 3.0f 改变推断的类型 out (和 blurx)从 uint8_tfloat. 我认为问题在于 save_image helper不允许将浮点缓冲区保存为PNG。要回到 uint8_t 试着把整个表达式包装起来,定义 out 在...中 cast<uint8_t>(...).

(注意:你可能还想把输入值至少上报到 uint16_t 以避免当你把它们3个加在一起时迅速溢出)。)


0
投票

我做了以下修改,现在可以用了。

#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;
    }
© www.soinside.com 2019 - 2024. All rights reserved.