ネオンベクトルを使用して画像を 3 ダウンサンプリングすることは可能ですか? そのためのアルゴリズムを紙に書こうとしていますが、それは不可能のようです。たとえば 8 バイトを取得すると、3*3 ピクセルを取得できないため、ダウンサンプリング操作を完了するのに十分なピクセルがありません。downsample by 2: Explaining ARM Neon Image Sampling によると、1 つの行から 16 バイト、次に 8 バイトをロードし、それらを 32 バイトのベクトルに割り当て、そのベクトルの 24 バイトを処理することを考えています。
更新: 回答に従ってサンプル コードを記述しましたが、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;
}
}