質問

私自身のための教育的な運動として、私は平均的な画像を平均的にできるアプリケーションを書いています。これは、騒音を減らすために天体写真でよく使用されます。

私が使用しているライブラリは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);
    }
}

コードは、各ピクセルを通過し、各チャネルのピクセル強度を次のように追加することにより、平均10画像を記録します。 ダブル ベクター。関数 平均 次に、ベクトルをパラメーターとして取得し、結果を平均します。この平均は、対応するピクセルで使用されます stackedimage - これが結果の画像です。うまくいきますが、私が述べたように、私はスピードに満足していません。 Core i5マシンでは2分30秒かかります。画像は8メガピクセルと16ビットティフです。私はそれが多くのデータであることを理解していますが、他のアプリケーションではより速くそれが行われるのを見てきました。

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

役に立ちましたか?

解決

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

なぜだめですか

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;

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

そして、あなたはより良いパフォーマンスを得ることができます PixelCache オリジナルの代わりに画像全体の Image オブジェクト。の「低レベルの画像ピクセルアクセス」セクションを参照してください 画像のオンラインMagick ++ドキュメント

その後、内側のループがなります

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

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

注意してください、これはすべて理論です。私はそれのいずれかをテストしていません

他のヒント

コメント:

  • なぜベクターを使用するのですか red, bluegreen?使用しているから push_back リアルコンテストとボトルネック処理を実行できます。代わりに、10色の3つの配列を1回だけ割り当てることができます。
  • 宣言できませんでした rgb 不必要な構造と破壊の積み重ねを緩和するために、ループの外側?
  • Magick ++は画像を平均化する方法を持っていませんか?

他の誰かが騒音を減らすために平均的な画像を望んでいて、あまり多くのことを感じない場合に備えて 「教育演習」 ;-)

ImageMagickは、次のような一連の画像の平均を行うことができます:

convert image1.tif image2.tif ... image32.tif -evaluate-sequence mean result.tif

単語を変更することで、中央値フィルタリングなどを行うこともできます mean 上記のコマンドで、あなたが望むものは何でも、例:

convert image1.tif image2.tif ... image32.tif -evaluate-sequence median result.tif

使用可能な操作のリストを取得できます。

identify -list evaluate

出力

Abs
Add
AddModulus
And
Cos
Cosine
Divide
Exp
Exponential
GaussianNoise
ImpulseNoise
LaplacianNoise
LeftShift
Log
Max
Mean
Median
Min
MultiplicativeNoise
Multiply
Or
PoissonNoise
Pow
RightShift
RMS
RootMeanSquare
Set
Sin
Sine
Subtract
Sum
Threshold
ThresholdBlack
ThresholdWhite
UniformNoise
Xor
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top