我尝试创建一个函数来生成框模糊的表达式,其矩阵的大小可以是 3,5 或 7,虽然程序确实调用了该函数,但它总是返回一个静态数字,我将其作为 Expr 对象的定义。所以基本上它就像它不做for循环一样。任何提示将不胜感激,因为我对卤化物和一般图像处理非常陌生。
创建 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 开始的函数,我创建的函数将引发异常。所以现在我的问题是:我可以在图片周围做一个边框,这样结果就可以保留它的尺寸,而程序不会抛出异常?结果似乎一点也不模糊。