如何在邻域或周围像素点上进行操作?

时间:2020-01-15 21:47:50

标签: halide

这个问题是关于Halide language的。

对特定的(x,y)说,我想对(x,y)周围的KxK补丁进行操作。例如。求和,求平方,等等,以获得(x,y)的新值。

大多数Halide示例中,我发现“硬代码”选择了相邻坐标。像this example中一样,还有主页上的模糊算法示例:

Func blur_x, blur_y; Var x, y;

// hard codes selecting x-1:x+1 and y-1:y+1
blur_x(x, y) = (input(x-1, y) + input(x, y) + input(x+1, y))/3;
blur_y(x, y) = (blur_x(x, y-1) + blur_x(x, y) + blur_x(x, y+1))/3;

但是,假设我想参数化KxK补丁的大小。我将如何选择然后在(x,y)附近的任意大小的邻域上进行运算?

2 个答案:

答案 0 :(得分:0)

也许this是一个答案。

// First add the boundary condition.
Func clamped = BoundaryConditions::repeat_edge(input);

// Define a 5x5 box that starts at (-2, -2)
RDom r(-2, 5, -2, 5);

// Compute the 5x5 sum around each pixel.
Func local_sum;
local_sum(x, y) = 0;  // Compute the sum as a 32-bit integer
local_sum(x, y) += clamped(x + r.x, y + r.y);

答案 1 :(得分:0)

关于您在评论中的问题,我认为您需要的是一个具有4个变量的Func:output(x,y,xi,yi)

x,y是每个色块中心的像素坐标,实际上是图像中像素的普通坐标。 xi,yi是每个色块内像素的内部坐标。

output(x,y,xi,yi)=输入(x + xi,y + yi)

通过这种方式,您可以获得一组可以操作的像素。