Renderscript - получение соседнего пикселя

Я начинаю исследовать силу Renderscript.

Используя данные 2D-изображения, я могу преобразовать пиксель в другой пиксель. Однако как можно получить соседние пиксели из входного распределения?

Я делаю, как, например, встроенный фильтр convolve3x3, когда ему нужны соседние пиксели для работы, и он красиво зажимает пиксели на краю изображения.

Если у меня есть функция

void root(const uchar4 *v_in, uchar4 *v_out) {
   float4 f4 = rsUnpackColor8888(*v_in);
   // do something on pixel
   uchar4 u4 = rsPackColorTo8888(f4);
   *v_out = u4;
}

я действительно должен индексировать v_in как v_in[1] или v_in[k], чтобы получить другие пиксели, или есть какая-то умная функция rs*, чтобы получить смежные горизонтальные / вертикальные пиксели, обеспечивая при этом надлежащий зажим к размеру изображения, чтобы я не индексировать массив v_in из его размера?

1 ответ

Если вы хотите посмотреть на соседние пиксели (и вы используете rs_allocations), вы должны просто использовать одну глобальную rs_allocation, а не передавать ее как *v_in. Это будет выглядеть так:

rs_allocation in;

// Using the new kernel syntax where v_out becomes the return value.
uchar4 __attribute__((kernel)) doSomething(uint32_t x, uint32_t y) {
  uchar4 u4 = rsGetElementAt_uchar4(in, x, y);  // You can adjust x,y here to get neighbor values too.
  float4 f4 = rsUnpackColor8888(u4);
  ...
  return rsPackColorTo8888(f4);
}

К сожалению, нет хорошего способа получить автоматическое зажимание с помощью регулярного rs_allocation, но вы можете настроить свой код так, чтобы зажимать края вручную. Сохраните maxX, maxY как глобальные переменные, передаваемые в сценарий, а затем динамически проверяйте, находитесь ли вы в диапазоне, перед любым rsGetElementAt*(). Если вам нужно автоматическое поведение при сжатии / переносе, вы также можете проверить API rs_sampler и rsSample ().

Другие вопросы по тегам