【问题标题】:Programming a dynamic box blur编程动态框模糊
【发布时间】:2016-05-18 10:34:49
【问题描述】:

我尝试创建一个函数来生成框模糊的表达式,其矩阵的大小可以是 3,5 或 7,当程序确实调用该函数时,它总是返回一个静态数字,我将其作为 Expr 对象的定义.所以基本上它就像它不做for循环一样。任何提示都将不胜感激,因为我对 Halide 和一般图像处理非常陌生。

创建 Expr 的函数:

Halide::Expr calculateBlur(Halide::Image<uint8_t> input, Halide::Var x, Halide::Var y, Halide::Var c, float* matrix, int size) {
    Halide::Expr endResult = Halide::cast<float>(120.0f);
    float endRes = 0.0f;
    int xPointer = 0;
    int yPointer = 0;
    int squareRootofSize = sqrt(size);
    for (int i = 0; i < size; i++) {    
        endResult = Halide::operator+(endResult, Halide::cast<float>((x - ((squareRootofSize / 2)) + xPointer, y - ((squareRootofSize / 2)) + yPointer, c) * (1/size)));                    
        xPointer++;
        if ((i + 1) % squareRootofSize == 0) {              
            yPointer++;
            xPointer = 0;
        }
    }
    endResult = Halide::cast<uint8_t>(endResult);
    return endResult;
}

模糊功能:

void blur2(Halide::Image<uint8_t> input, float* matrix, int size) {
    Halide::Var x, y, c;
    myBlurFunction(x, y, c) = calculateBlur(input, x, y, c, matrix, size);/
    for (int i = 0; i < size / 2; i++) { //creates a border
        myBlurFunction(x, 0+i, c) = Halide::cast<uint8_t>(0);
        myBlurFunction(0 + i, y, c) = Halide::cast<uint8_t>(0);
        myBlurFunction(input.width() - 1 - i, y, c) = Halide::cast<uint8_t>(0);
        myBlurFunction(x, input.height() - 1 - i, c) = Halide::cast<uint8_t>(0);
    }
    Halide::Image<uint8_t> output;
    output = myBlurFunction.realize(input.width(), input.height(), input.channels());
    Halide::Tools::save_image(output, "C:\\Users\\Admin\\Desktop\\rgb\\boxBlurColor.png");`
}

另外,我确实有一些用于测试的打印件,calculateBlur 函数中的文本只出现一次。我还使用了 trace_stores() 来确认所有输出值都设置为 0.0f。

更新: 我替换了calculateBlur中的行

endResult = Halide::operator+(endResult, Halide::cast<float>((x - ((squareRootofSize / 2)) + xPointer, y - ((squareRootofSize / 2)) + yPointer, c) * (1/size)));

endResult = Halide::operator+(endResult, input((x - ((squareRootofSize / 2)) + xPointer, y - ((squareRootofSize / 2)) + yPointer, c)) * (1/size));

现在我收到以下错误:“无法构造对具有 3 个维度的图像“i0”的 1 参数引用。”

更新2:

在calculateBlur中进一步修改该行后

endResult = Halide::operator+(endResult, input((x - ((squareRootofSize / 2)) + xPointer, y - ((squareRootofSize / 2)) + yPointer, c)) * (1/size));

Halide::operator+=(endResult, (input((x - ((squareRootofSize / 2)) + xPointer), (y - ((squareRootofSize / 2)) + yPointer), c) * (1/squareRootofSize)));

我收到以下错误:“输入缓冲区 i0 在 -2 处访问,它在维度 0 中的 min(0) 之前”我不明白为什么会出现它,因为我确实重新定义了边界函数和角落

更新3:

我意识到错误不断弹出,因为如果我实现从 0,0 开始的函数,我创建的函数将抛出异常。所以现在我的问题是:我可以在图片周围做一个边框,这样结果就可以保留它的尺寸,而程序不会抛出异常?结果似乎一点也不模糊。

【问题讨论】:

    标签: halide


    【解决方案1】:

    关于最后一个问题,请查看boundary conditions 首先,在 Halide 编译时,循环计数是已知的,因此它可以优化循环(我怀疑,我想强调我不知道这一点)。

    【讨论】:

    • 好吧,我确实更新了特定坐标(所以对于角)和边界的定义,但问题仍然存在,因为当调用函数时,我假设因为我添加了input(x-1,y,c) 在某一时刻,程序看到我正在访问 x = -1 处的值,尽管有更新定义,它还是抛出了异常
    • 嗯,更新是更新而不是替代纯粹的防御。见lesson 9
    • 非常感谢...我检查了边界条件教程,它确实解决了我的问题(我之前没有达到这一点):)
    猜你喜欢
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 2021-02-26
    • 1970-01-01
    • 2020-03-17
    • 2015-12-17
    相关资源
    最近更新 更多