Как изменить цветовые каналы индивидуально в Halide?

Я заинтересован в изменении отдельных цветовых каналов пикселей Halide. Например, как сделать красный канал ярче, а зеленый и синий оставить без изменений? Увеличение яркости всех цветов для всех пикселей будет выглядеть так:

Halide::Expr value = input(x, y, c);
value = value * 2.0f;
brighter(x, y, c) = value;

Но при попытке осветлить один канал описанным ниже способом выдается ошибка.

Halide::Expr value = input(x, y, c);
value(x,y,0) = value(x,y,0) * 2.0f; // brighten red
value(x,y,1) = value(x,y,2);        // keep green the same
value(x,y,2) = value(x,y,3);        // keep blue the same
brighter(x, y, c) = value;

Ошибка:

ImgPipe_Halide.cpp:88:14: error: no match for call to ‘(Halide::Expr) (Halide::Var&, Halide::Var&, int)’

Итак, как я могу считывать значения отдельных каналов из пикселей и как их изменять?


person Kantthpel    schedule 06.07.2016    source источник


Ответы (1)


Одним из способов было бы использовать функцию выбора галоида

Пример:

value = Halide::select(c == 0, input(x,y,c) * 2.0f,
                       input(x,y,c));
person Rok    schedule 06.07.2016
comment
Спасибо за ответ! Это работает при применении к входу, как вы показываете. Интересно, что это не работает при выборе из значения (фактически та же ошибка). Я предполагаю, что это означает, что функция выбора работает с функциями и изображениями Halide, но не с выражениями. - person Kantthpel; 06.07.2016
comment
Это правильное решение. Ошибка в том, что вы не можете индексировать Expr, используя свободные переменные. Вы можете индексировать функции только со свободными переменными. значение (x, y, 0) не имеет смысла - значение уже введено (x, y, c), а не введено (x, y, 0). - person Andrew Adams; 06.07.2016