卤化物:较大图像的去马赛克算法错误.似乎适用于 16x16 图像



我正在尝试为拜耳过滤器实现去马赛克算法,如本pdf:http://www.arl.army.mil/arlreports/2010/ARL-TR-5061.pdf 的第2.8节(第8页(所示。我一直在尝试通过 RDom 实现功能。当我使用 16x16 图像时,跟踪实际上会完成,但是当我使用 768x1280 等较大的图像时,跟踪会卡在:

Store green.0(767, 1279);

以下是我的代码的简化版本:

#include "Halide.h"
#include<stdio.h>
#include<stdlib.h>
#include "halide_image_io.h"
using namespace Halide;

int main(int argc, char **argv) {
Buffer<uint8_t> input = Tools::load_image(argv[1]);
RDom r(2, input.width() - 4, 2, input.height() - 4);
r.where((r.x % 2 == 0 && r.y % 2 == 0) || (r.x % 2 == 1 && r.y % 2 == 1));
Var x("x"), y("y");
Func g_n, w_n, g_n_est, green("green");
g_n(x, y) = cast<float> (0);
w_n(x, y) = cast<float> (0);
g_n_est(x, y) = cast<float> (0);
green(x, y) = cast<uint8_t> (0);

printf("width: %dn", input.width());
printf("height: %dn", input.height());
printf("channels: %dn", input.channels());
g_n(r.x, r.y) = abs(cast<float>(input(r.x, r.y + 1) - input(r.x, r.y - 1))) + abs(cast<float>(input(r.x, r.y) - input(r.x, r.y - 2)));
w_n(r.x, r.y) = cast<float>(1 / (1 + g_n(r.x, r.y)));
g_n_est(r.x, r.y) = cast<float>(input(r.x, r.y - 1) + (input(r.x, r.y) - input(r.x, r.y - 2))) / 2;
green(r.x, r.y) = cast<uint8_t>(w_n(r.x, r.y) * g_n_est(r.x, r.y));
green.trace_stores();

Buffer<uint8_t> temp = green.realize(input.width(), input.height());
Tools::save_image(temp, "result.png");
}

这是卤化物中的错误吗?在此实例中,代码完成执行并保存 16x16 输入的输出图像,但卡在跟踪中以获取较大的图像。

这只是一个非常非常低效的时间表。每个阶段在实现时都会在其更新定义中计算O(n(像素(现在RDom r很大(,但每个阶段也会内联到下一个阶段中。结果,green中的每个点都在递归计算g_n_estw_n的整个图像,然后对于它们的每个像素,它递归计算g_n的整个图像。

你所看到的green.0(767, 1023)停滞实际上就在它完成计算完最后一个像素的green(x,y) = 0的纯定义之后,此时由于它正在做的O(n^3(工作,它开始永远需要很长时间才能实际计算所有更新阶段。

在这种情况下,积极启用更多跟踪将使问题更加清晰。您可以在配置编译:https://github.com/halide/Halide/wiki/Debugging-Tips#tracing 时全局打开实现跟踪或单个存储。

对于此代码,将早期阶段调度为compute_root可能是您想要的,尽管您可能实际上希望g_n_estw_n定义是简单的纯函数(根本没有RDom(,可以融合到green中,以块的形式调度等。

最新更新