Как скопировать растровые пиксели с помощью 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 строки.

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