使用 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.0f
将 out
(和 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;
}
我在 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.0f
将 out
(和 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;
}