Как действовать на окрестности или патч окружающих пикселей? - PullRequest
0 голосов
/ 16 января 2020

Этот вопрос относится к Галидному языку .

Скажем, для конкретного (x, y) я хочу работать над патчем KxK вокруг (x, y). Например, суммируйте их, возведите в квадрат и т. Д. c., Чтобы получить новое значение для (x, y).

В большинстве примеров галидов, которые я нашел, «жесткий код» выбирает соседний координаты. Как и в этом примере , а также в примере алгоритма размытия на домашней странице:

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. Как бы я выбрал и затем работал в окрестности произвольного размера вокруг (х, у)?

Ответы [ 2 ]

0 голосов
/ 16 января 2020

Что касается ваших вопросов в комментариях, я думаю, что вам нужно Fun c с 4 переменными: output (x, y, xi, yi)

x, y - координата пикселя. в центре каждого патча, который фактически является обычной координатой пикселя в изображении. И xi, yi - это внутренняя координата пикселей в каждом патче.

output (x, y, xi, yi) = input (x + xi, y + yi)

В этом Кстати, вы получаете группу пикселей, с которыми вы можете работать.

0 голосов
/ 16 января 2020

Может быть это ответ.

// 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);
...