1

私は以下のCコードをより迅速に処理する方法を探しています。私は640x480の画像を持っていて、画像の他のすべての行と列を取り除くことで、2倍にぼかしたいと思っています。私は以下のコードを添付しました。コードを最適化する方法はありますか?イメージデシメーション(C++)のより高速(最適化)ソリューション

#define INPUT_NUM_ROW 480 
#define INPUT_NUM_COL 640 
#define OUTPUT_NUM_ROW 240 
#define OUTPUT_NUM_COL 320 

unsigned char inputBuf[INPUT_NUM_ROW* INPUT_NUM_COL]; 
unsigned char outputBuf[OUTPUT_NUM_ROW* OUTPUT_NUM_COL]; 

void imageDecimate(unsigned char *outputImage , unsigned char *inputImage) 
{ 
/* Fill in your code here */ 
for (int p = 0; p< OUTPUT_NUM_ROW; p++) { 
    for (int q = 0; q < OUTPUT_NUM_COL; q++) { 
     outputImage[p*OUTPUT_NUM_COL + q] = inputImage[(p*INPUT_NUM_COL+q)*2]; 
     // cout << "The pixel at " << p*OUTPUT_NUM_COL+q << " is " << outputImage[p*OUTPUT_NUM_COL+q] << endl; 
    } 
    } 
} 
+0

ほとんどのイメージには、更新が必要な多くのヘッダーフィールドがあります。投稿されたコードは、実際のデータ/ピクセルフィールドのみを処理しています。ほとんどのピクセルフィールドは、(ヘッダー情報に応じて)3または4バイトの長さです。画像を圧縮するときは、行の1/2と列の1/2を任意に削除しないでください。はるかに良いアプローチは、行のペアの平均です。次に、(別のループで)平均列のペアを作成し、各列(ピクセル)が3または4バイトで構成されていることを覚えておいてください。また、(ほとんどの画像で)行のバイト数は4の倍数になることに注意してください。 – user3629249

+0

画像に含まれているヘッダーフィールドと、ピクセルの平均化が正しく行われているため、エイリアシングが目立たなくなります。しかし、私はより多くのコード最適化を探していました。 –

答えて

1

のではなく、内側のループで毎回数学をやって、あなたがこれを行うことができます:

int outputIndex; 
int inputIndex; 
for (int p = 0; p< OUTPUT_NUM_ROW; p++) { 
    inputIndex = p * INPUT_NUM_COL * 2; 
    outputIndex = p * OUTPUT_NUM_COL; 
    for (int q = 0; q < OUTPUT_NUM_COL; q++) { 
     outputImage[outputIndex] = inputImage[inputIndex]; 
     inputIndex += 2; 
     outputIndex++; 
     // cout << "The pixel at " << p*OUTPUT_NUM_COL+q << " is " << outputImage[p*OUTPUT_NUM_COL+q] << endl; 
    } 
    } 
} 

をあなたもコピーの割り当てとインクリメントインラインを行うことができ、あなたはまた、唯一のinputIndexを割り当てることができます最初にoutputIndexを使用していますが、内部ループから計算を移動するほどパフォーマンスが向上するわけではありません。私は、一括コピー機能は、このような柔軟性を増やすものではないと考えていますが、それらが実行し、ターゲットプラットフォームのすべてで利用可能なハードウェアアクセラレーションを使用すると、それがより良い選択になります。

また、このような配列アクセスは、使用できる最も最適化されたポインタ算術にコンパイルされると仮定しています。

+0

これを考えるべきでしょう!ありがとう。 +1 –

+0

これは各ピクセルの実際のサイズを考慮せず、画像を垂直方向に縮小せず、各行に対して4倍の倍数の要件を処理しません。 – user3629249

+0

@ user3629249 - inputIndexとoutputIndexの計算の差が2の場合、垂直方向のデシメーションが実行されます。 1行あたりの合計バイト数が4バイトの倍数である必要があることを意味する場合、480と240の両方の定数は、そのようになることを保証します。代わりに、1ピクセルあたりのビット深度について話している場合、これはピクセルあたり32ビットのイメージであり、ピクセルあたり4バイトが必要であるとは言われていませんでした。私は、それがピクセル当たり8ビットの画像であるということだけを仮定することができた。 –

関連する問題