Как скопировать растровые пиксели с помощью Intel IPP?
Допустим, есть матрица 7x5 (16-битное изображение) со следующими значениями, и я хочу скопировать каждое третье значение в новую матрицу 3x2 с помощью IPP.
Я попробовал функцию ippiCopySubpix_16u_C1R
но он копирует только левый угол моей исходной матрицы. Какая возможность у меня есть? вот мой тестовый код:
Ipp16u x[7*5], y[3*2];
IppiSize roiOrig = {7,5}; IppiSize roiDst = {3,2};
auto * ptr = x; // fill the matrix
for (int i = 0; i < 7*5; i++)
{
*ptr++ = i;
}
ippiCopySubpix_16u_C1R(x, 7*2, y, 3*2, roiDst, 3, 3);
// result is [0 1 2 7 8 9]
1 ответ
Я не думаю, что ippiCopySubpix_16u_C1R - правильная функция для работы.
См. http://technion.ac.il/doc/intel/ipp/ipp_manual/IPPI/ippi_ch4/functn_CopySubpix.htm
Эта функция вычисляет значение пикселя целевого изображения с помощью линейной интерполяции (см. Линейная интерполяция в Приложении B) в соответствии со следующей формулой:
где i = 0, ... roiSize.height - 1, j = 0, ... roiSize.width - 1 .
Как вы можете видеть, dx и dy - это не количество пропускаемых пикселей, а значения смещения в подпикселях.
Я думаю, что функция, которую вы ищете, это: ippiCopy_16u_C3C1R
См. https://software.intel.com/en-us/node/503752
Функция пропускает каждый третий исходный пиксель по горизонтали.
Для вертикального пропуска установите srcStep
размером (в байтах) 3 строки.