Есть ли способ выполнить двумерные свертки с шагами, используя библиотеку Accelerate в Swift? - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь выполнить определенный процесс понижающей дискретизации.Это описывается следующим псевдокодом.

//Let V be an input image with dimension of M by N (row by column)
//Let U be the destination image of size floor((M+1)/2) by floor((N+1)/2)
//The floor function is to emphasize the rounding for the even dimensions 
//U and V are part of a wrapper class of Pixel_FFFF vImageBuffer

for i in 0 ..< U.size.rows {
    for j in 0 ..< U.size.columns {
        U[i,j] = V[(i * 2), (j * 2)]
    }
}

Процесс в основном принимает значения пикселей во всех других местоположениях, охватывающих оба измерения.Полученное изображение будет составлять примерно половину исходного изображения.

При однократном вызове процесс относительно быстро выполняется сам по себе.Однако это становится узким местом, когда код вызывается много раз внутри большего алгоритма.Поэтому я стараюсь его оптимизировать.Поскольку я использую Accelerate в своем приложении, я хотел бы иметь возможность адаптировать этот процесс в похожем духе.

Попытки Во-первых, этот процесс может быть легко выполнен путем двумерной свертки с использованием ядра 1x1 [1] с шагом [2,2].Следовательно, я рассмотрел функцию vImageConvolve_ARGBFFFF.Однако я не смог найти способ указать шаг.Эта функция будет лучшим решением, поскольку она заботится о структуре изображения Pixel_FFFF.

Во-вторых, я замечаю, что это просто перенос данных из одного массива в другой.Итак, я подумал, что функция vDSP_vgathr является хорошим решением для этого.Однако я попал в стену, поскольку результирующий вектор векторизации vImageBuffer был бы структурой чередующихся битов A,R,G,B,A,R,G,B,..., каждый член которой составляет 4 байта.Функция vDSP_vgathr передает каждые 4 байта в массив назначения, используя указанный вектор индексации.Я мог бы использовать формулу линейного индексирования, чтобы сделать такой вектор.Но, учитывая как четные, так и нечетные измерения, генерирование вектора индексации будет столь же неэффективным, как и исходное решение.Это потребует петель.

Кроме того, ни одна из vDSP 2D-функций свертки не подходит для решения.

Есть ли в Accelerate какие-либо другие функции, которые я мог упустить из виду?Я видел, что в сверточных функциях vDSP 1D есть опция шага .Может быть, кто-то знает эффективный способ перевода процесса двумерной свертки с шагами в процесс одномерной свертки?

...