Невозможно сохранить изображение в формате png при использовании 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;
    }

Я получаю сообщение об ошибке "Изображение не может быть сохранено в этом формате". Ошибка не возникает, когда я удаляю «/ 3.0f». Таким образом, разделение может привести к тому, что некоторые значения пикселей будут иметь недопустимый формат. Следовательно, я не могу сохранить его в формате .png. Как я могу это решить? Обратите внимание: формула должна была быть (in(x-1, y,c) + in(x, y,c) + in(x+1, y,c)) / 3.0f; .... но это дает мне ошибку "доступ за пределами входного буфера".... Сначала я пытаюсь устранить ошибку деления, поэтому на данный момент я изменил формулу.. которая помогла мне поймать эта ошибка.


person Community    schedule 22.04.2020    source источник


Ответы (2)


Добавление деления на 3.0f изменяет предполагаемый тип outblurx) с uint8_t на float. Я считаю, что проблема в том, что помощник save_image не позволяет сохранять буферы с плавающей запятой в виде PNG. Чтобы вернуться к uint8_t, попробуйте обернуть все выражение, определяющее out, в cast<uint8_t>(...).

(Примечание: вы также, вероятно, захотите увеличить входные значения как минимум на uint16_t, чтобы избежать быстрого переполнения, когда вы складываете 3 из них вместе.)

person jrk    schedule 23.04.2020
comment
Благодарю вас. Я попробую это. - person ; 27.04.2020

Я сделал следующие изменения, и теперь он работает:

#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;
    }
person Community    schedule 27.04.2020