私自身の教育的演習として、画像の束を平均化できるアプリケーションを作成しています。これは、ノイズを減らすために天体写真でよく使用されます。
私が使用しているライブラリは 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)は画像内のピクセルにアクセスするのが遅いですか? もっと速い方法はありますか?