Я хотел бы знать, возможно ли с помощью неоновых векторов уменьшить изображение на 3? Я пытаюсь написать алгоритм для этого на бумаге, но, похоже, это невозможно. Поскольку, когда вы получаете, например, 8 байт, вы не можете получить 3 * 3 пикселя, для завершения операции понижающей дискретизации не будет достаточно пикселей. В соответствии с уменьшением размера на 2: Explaining ARM Neon Image Sampling Я думаю о загрузке 16bytes, затем 8bytes из одной строки, затем назначить их 32-байтовому вектору, а затем обработать его 24 байтами этого вектора?алгоритм для downsample изображение 3 с помощью Neon
Update: Я написал пример код в соответствии с ответом, но я получаю ошибку сегментации в vst1_u8 ...
inline void downsample3dOnePass(uint8_t* src, uint8_t *dst, int srcWidth)
{
// make sure rows/cols dividable by 8
int rows = ((srcWidth>>3)<<3);
// 8 pixels per row
rows=rows>>3;
for (int r = 0; r < rows; r++)
{
// load 24 pixels (grayscale)
uint8x8x3_t pixels = vld3_u8(src);
// first sum = d0 + d1
uint8x8_t firstSum = vadd_u8 (pixels.val[0], pixels.val[1]);
// second sum = d1+d2;
uint8x8_t secondSum = vadd_u8 (firstSum, pixels.val[2]);
// total sum = d0+d1+d2
uint8x8_t totalSum = vadd_u8(secondSum, firstSum);
// average = d0+d1+d2/8 ~9 for test
uint8x8_t totalAverage = vshr_n_u8(totalSum,3);
// store 8 bytes
vst1_u8(dst, totalAverage);
// move to next 3 rows
src+=24;
// move to next row
dst+=8;
}
}
Я не знаю, что вы просите. Код в указанной ссылке обрабатывает 8 * пикселей * для каждой строки, а не 8 байтов. –
@CareyGregory Я принимаю изображение в сером масштабе –