如何对周围像素的邻域或补丁进行操作?

How to operate on a neighborhood or patch of surrounding pixels?

此问题针对 Halide language

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

我发现的大多数 Halide 示例 "hard-code" select 邻近坐标。喜欢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 补丁的大小。我将如何 select 然后在 (x, y) 周围的任意大小的邻域上进行操作?

也许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);

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

x,y是每个patch中心像素的坐标,实际上是图像中像素的普通坐标。而xi,yi是每个patch内像素点的内坐标。

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

这样就得到了一组可以操作的像素点