编程动态框模糊

时间:2016-05-18 10:34:50

标签: halide

我尝试制作函数,为矩阵的大小可以是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“的单参数引用。”

UPDATE2:

进一步修改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中的最小值(0)之前”,我不明白它为什么会出现,因为我重新定义了边界和角落

UPDATE3:

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

1 个答案:

答案 0 :(得分:1)

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