以下代码改编自卤化物教程。
Func blurX(Func continuation)
{ Var x("x"), y("y"), c("c");
Func input_16("input_16");
input_16(x, y, c) = cast<uint16_t>(continuation(x, y, c));
Func blur_x("blur_x");
blur_x(x, y, c) = (input_16(x-1, y, c) +
2 * input_16(x, y, c) +
input_16(x+1, y, c)) / 4;
Func output("outputBlurX");
output(x, y, c) = cast<uint8_t>(blur_x(x, y, c));
return output;
}
int main()
{ Var x("x"), y("y"), c("c");
Image<uint8_t> input = load_image("input.png");
Func clamped("clamped");
clamped = BoundaryConditions::repeat_edge(input);
Func img1Fun("img1Fun");
Func img2Fun = blurX(clamped);
Func outputFun("outputFun");
/* carry on */
}
我有三个问题:
铸造 铸造是将
cast<uint16_t>(clamped(x, y, c))
每个 (x,y) 位置的 8 位 RG 和 B 值转换为 16 位整数,即铸造返回的是可以索引的 RGB 图像,例如 img1Fun(x, y, 0) 以访问其 R 值? 或者这是否将图像中的每个 RGB 像素投射到每个 (x,y) 位置的 RGB 像素的 [0..1] 之间的亮度值,即r*0.3 + g*0.59 + b*0.11
?重载 RGB 模糊
(x,y,c)
是对所有索引重载的算术运算吗?例如
(input_16(x-1, y, c) + 2 * input_16(x, y, c) + input_16(x+1, y, c)) / 4;
这是一个重载:
(input_16(x-1, y, 0) + 2 * input_16(x, y, 0) + input_16(x+1, y, 0)) / 4;
(input_16(x-1, y, 1) + 2 * input_16(x, y, 1) + input_16(x+1, y, 1)) / 4;
(input_16(x-1, y, 2) + 2 * input_16(x, y, 2) + input_16(x+1, y, 2)) / 4;
- 并行化我怎么能并行化
blurX
?基于此处brighten.cpp
CVPR'15 的示例,我可以使用在 X 方向上逐行矢量化,在 Y 方向上跨线程并行化.. 像这样?blur_x.vectorize(x, 4).parallel(y);
Func blurX(Func continuation)
{ Var x("x"), y("y"), c("c");
Func input_16("input_16");
input_16(x, y, c) = cast<uint16_t>(continuation(x, y, c));
Func blur_x("blur_x");
blur_x(x, y, c) = (input_16(x-1, y, c) +
2 * input_16(x, y, c) +
input_16(x+1, y, c)) / 4;
blur_x.vectorize(x, 4).parallel(y);
Func output("outputBlurX");
output(x, y, c) = cast<uint8_t>(blur_x(x, y, c));
return output;
}