Я бы хотел использовать 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;
}
}
Как вы хотите это сделать? Вы сокращаете информацию. См.: [Лучший алгоритм сокращения изображений] (http://stackoverflow.com/questions/384991/what-is-the-best-image-downscaling-algorithm -quality-wise); реальный ответ - нет, поскольку существуют различные критерии, когда [сокращение информации] (http://en.wikipedia.org/wiki/Image_scaling). Вы можете комбинировать их. Например, среднее значение первого прохода с последующим би-кубиком второго байта даст почти такое же качество, как и полная би-куба, но будет намного быстрее. –
Основная цель здесь - скорость. Я хочу, чтобы это было почти так же быстро, как Neon memcpy. – gregoiregentil
Просто пустой экран, то есть быстрый :). Вы должны, по крайней мере, оценить различные алгоритмы масштабирования, прежде чем выделять время для ручной настройки NEON. Мое мнение состояло в том, что вы можете приблизиться к эквивалентной скорости с ** намного лучшим качеством изображения, используя два фильтра. Пропуск пикселей/строк будет быстрее и даст аналогичное качество; вы ограничены полосой на основном изображении. NEON сделает время процессора недоминирующим. Я желаю вам удачи в любом случае. –