複数のフル解像度画像のガウス ピラミッドとラプラシアン ピラミッドを計算する必要がある Android アプリを作成しようとしています。これを NDK を使用して C++ で作成しました。コードの最も重要な部分は、画像にガウス フィルターを適用することです。このフィルターを適用しています。水平方向と垂直方向。
フィルターは (0.0625, 0.25, 0.375, 0.25, 0.0625) です。整数を扱っているので、(1, 4, 6, 4, 1)/16 を計算しています。
dst[index] = ( src[index-2] + src[index-1]*4 + src[index]*6+src[index+1]*4+src[index+2])/16;
私はいくつかの簡単な最適化を行いましたが、まだ予想よりも遅く動作しており、他に不足している最適化オプションがあるかどうか疑問に思っていました.
PS: インライン アーム アセンブリを使用してこのフィルター パーツを作成しようとしましたが、結果が 2 倍遅くなりました。
//horizontal filter
for(unsigned y = 0; y < height; y++) {
for(unsigned x = 2; x < width-2; x++) {
int index = y*width+x;
dst[index].r = (src[index-2].r+ src[index+2].r + (src[index-1].r + src[index+1].r)*4 + src[index].r*6)>>4;
dst[index].g = (src[index-2].g+ src[index+2].g + (src[index-1].g + src[index+1].g)*4 + src[index].g*6)>>4;
dst[index].b = (src[index-2].b+ src[index+2].b + (src[index-1].b + src[index+1].b)*4 + src[index].b*6)>>4;
}
}
//vertical filter
for(unsigned y = 2; y < height-2; y++) {
for(unsigned x = 0; x < width; x++) {
int index = y*width+x;
dst[index].r = (src[index-2*width].r + src[index+2*width].r + (src[index-width].r + src[index+width].r)*4 + src[index].r*6)>>4;
dst[index].g = (src[index-2*width].g + src[index+2*width].g + (src[index-width].g + src[index+width].g)*4 + src[index].g*6)>>4;
dst[index].b = (src[index-2*width].b + src[index+2*width].b + (src[index-width].b + src[index+width].b)*4 + src[index].b*6)>>4;
}
}