2014-08-11 1 views
1

Я бы хотел использовать ARM Neon для изменения размера 8-битного серого изображения в 4 раза с 1280x960 до 320x240.Изменить размер 8-битного изображения на 4 с помощью ARM NEON

В качестве примера, у меня уже есть изменить размер в 2 раза от 640x480 до 320x240:

void divideimageby2(uint8_t * src, uint8_t * dest) { 
    //src is 640 x 480 
    //dst is 320 x 240 
    int h; 
    for (h = 0; h < 240; h++) 
     resizeline2(src + 640 * (h * 2 + 0), src + 640 * (h * 2 + 1), dt + 320 * h); 
} 

void resizeline2(uint8_t * __restrict src1, uint8_t * __restrict src2, uint8_t * __restrict dest) { 
    int w; 
    for (w = 0; w < 640; w += 16) { 
     uint16x8_t a = vpaddlq_u8(vld1q_u8(src1)); 
     uint16x8_t b = vpaddlq_u8(vld1q_u8(src2)); 
     uint16x8_t ab = vaddq_u16(a, b); 
     vst1_u8(dest, vshrn_n_u16(ab, 2)); 
     src1 += 16; 
     src2 += 16; 
     dest += 8; 
    } 
} 

Если я хочу сделать что-то подобное, какие инструкции неоновые я мог использовать в resizeline4 агрегировать 4 линии?

void divideimageby4(uint8_t * src, uint8_t * dest) { 
    //src is 1280 x 960 
    //dst is 320 x 240 
    int h; 
    for (h = 0; h < 240; h++) 
     resize_line2(src + 640 * (h * 4 + 0), src + 640 * (h * 4 + 1), src + 640 * (h * 4 + 2), src + 640 * (h * 4 + 3), dt + 320 * h); 
} 

void resizeline4(uint8_t * __restrict src1, uint8_t * __restrict src2, uint8_t * __restrict src3, uint8_t * __restrict src4, uint8_t * __restrict dest) { 
    int w; 
    for (w = 0; w < 1280; w += 16) { 
     //What to put here? 
     src1 += 16; 
     src2 += 16; 
     src3 += 16; 
     src4 += 16; 
     dest += 4; 
    } 
} 
+0

Как вы хотите это сделать? Вы сокращаете информацию. См.: [Лучший алгоритм сокращения изображений] (http://stackoverflow.com/questions/384991/what-is-the-best-image-downscaling-algorithm -quality-wise); реальный ответ - нет, поскольку существуют различные критерии, когда [сокращение информации] (http://en.wikipedia.org/wiki/Image_scaling). Вы можете комбинировать их. Например, среднее значение первого прохода с последующим би-кубиком второго байта даст почти такое же качество, как и полная би-куба, но будет намного быстрее. –

+0

Основная цель здесь - скорость. Я хочу, чтобы это было почти так же быстро, как Neon memcpy. – gregoiregentil

+0

Просто пустой экран, то есть быстрый :). Вы должны, по крайней мере, оценить различные алгоритмы масштабирования, прежде чем выделять время для ручной настройки NEON. Мое мнение состояло в том, что вы можете приблизиться к эквивалентной скорости с ** намного лучшим качеством изображения, используя два фильтра. Пропуск пикселей/строк будет быстрее и даст аналогичное качество; вы ограничены полосой на основном изображении. NEON сделает время процессора недоминирующим. Я желаю вам удачи в любом случае. –

ответ

2

Вы должны объединить vpaddl с vpadal.

нагрузки 32 * 4 матрица д регистров line1a, line1b ..... line4b

vpaddl.u8 line1a, line1a

vpaddl.u8 line1b, line1b

vpadal.u8 line1a, line2a

vpadal.u8 line1b, line2b

.

.

vpadal.u8 line1b, line4b

vpadd.u16 d0, line1alow, line1ahigh

vpadd.u16 d1, line1blow, line1bhigh

vrshrn.u16 d0, q0, # 4

vst1.8 {d0}, [pDst]!

+0

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

+0

Спасибо за ответ. Я немного смущен вашим предложением. Не могли бы вы отредактировать ответ и написать что-то, что ближе к некоторому рабочему коду? – gregoiregentil

 Смежные вопросы

  • Нет связанных вопросов^_^