4

私自身の教育的演習として、画像の束を平均化できるアプリケーションを作成しています。これは、ノイズを減らすために天体写真でよく使用されます。

私が使用しているライブラリは Magick++ で、実際にアプリケーションを作成することに成功しています。しかし、残念なことに、その速度は遅いです。これは私が使用しているコードです:

for(row=0;row<rows;row++)
{
    for(column=0;column<columns;column++)
    {
        red.clear(); blue.clear(); green.clear();
        for(i=1;i<10;i++)
        {
            ColorRGB rgb(image[i].pixelColor(column,row));
            red.push_back(rgb.red());
            green.push_back(rgb.green());
            blue.push_back(rgb.blue());
        }
        redVal = avg(red);
        greenVal = avg(green);
        blueVal = avg(blue);
        redVal = redVal*MaxRGB; greenVal = greenVal*MaxRGB; blueVal = blueVal*MaxRGB;
        Color newRGB(redVal,greenVal,blueVal);
        stackedImage.pixelColor(column,row,newRGB);
    }
}

このコードは、各ピクセルを通過し、各チャネルのピクセル強度をdoubleベクトルに追加することで、10 個の画像を平均化します。次に、関数avgはベクトルをパラメーターとして取り、結果を平均化します。この平均は、結果の画像であるstackedImageの対応するピクセルで使用されます。それは問題なく動作しますが、前述したように、速度には満足していません。Core i5 マシンで 2 分 30 秒かかります。画像は 8 メガピクセルの 16 ビット TIFF です。大量のデータであることは理解していますが、他のアプリケーションでより高速に処理されるのを見てきました。

私のループは遅いですか、それとも pixelColor(x,y)は画像内のピクセルにアクセスするのが遅いですか? もっと速い方法はありますか?

4

3 に答える 3

4

なぜベクトル/配列を使用するのですか?

なぜだめですか

double red=0.0, blue=0.0, green=0.0;
for(i=1;i<10;i++)
{
   ColorRGB rgb(image[i].pixelColor(column,row));
   red+=rgb.red();
   blue+=rgb.blue();
   green+=rgb.green();
}
red/=10;
blue/=10;
green/=10;

これにより、1 ピクセルあたりのベクター オブジェクトに対する 36 回の関数呼び出しが回避されます。

また、元のオブジェクトPixelCacheの代わりにイメージ全体のを使用すると、パフォーマンスがさらに向上する場合があります。Image のオンライン Magick++ ドキュメントImageの「Low-Level Image Pixel Access」セクションを参照してください。

次に、内側のループは次のようになります

PixelPacket* pix = cache[i]+row*columns+column;
red+= pix->red;
blue+= pix->blue;
green+= pix->green;

これで、PixelColor への 10 個の呼び出し、10 個の ColorRGB コンストラクター、およびピクセルあたり 30 個のアクセサー関数も削除されました。

注、これはすべて理論です。私はそれをテストしていません

于 2011-03-16T18:04:39.887 に答える
1

コメント:

  • redblueおよびにベクトルを使用するのはなぜgreenですか? 使用push_backすると、再割り当て、およびボトルネック処理を実行できるためです。代わりに、10 色の 3 つの配列を 1 回だけ割り当てることができます。
  • rgb不要な構築や破棄のスタックを軽減するために、ループの外側で宣言できませんでしたか?
  • Magick++ には画像を平均化する方法がありませんか?
于 2011-03-16T16:13:23.243 に答える