如何对周围像素的邻域或补丁进行操作?
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)
这样就得到了一组可以操作的像素点
此问题针对 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)
这样就得到了一组可以操作的像素点