Есть ли способ выполнить двумерные свертки с шагами, используя библиотеку ускорений в Swift?

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

//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 сверточные функции. Может быть, кто-то знает эффективный способ перевода процесса двумерной свертки с шагами в процесс одномерной свертки?

0 ответов

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