2

これは、画像の色を改善しようとする関数です。それは機能しますが、本当に遅いです...誰かがより良いアイデアを持っているのでしょうか?

static Mat correctColor(Mat AImage) {
    Mat copyImage;
    AImage.copyTo(copyImage);
    Mat imgLab;
    cvtColor(copyImage, imgLab, CV_BGR2Lab);


    for (int y = 0; y < imgLab.rows; y++) {
        for (int x = 0; x < imgLab.cols; x++) {
            //get pixel value                
            imgLab.ptr<uchar > (y)[x * 3] = imgLab.ptr<uchar > (y)[x * 3]*0.3;
        }
    }
    cvtColor(imgLab, copyImage, CV_Lab2BGR);

    Mat img(copyImage.rows, copyImage.cols, CV_32FC3);
    copyImage.convertTo(img, CV_32FC3, 1 / 255.);        
    blur(img, img, Size(255, 255));
    Mat img32(copyImage.rows, copyImage.cols, CV_32FC3);
    copyImage.convertTo(img32, CV_32FC3, 1 / 255.);

    img.mul(img, 2);        
    divide(img32, img, img);

    img.convertTo(copyImage, CV_8U, 255.0);

    return copyImage;
 }
4

5 に答える 5

2

最適化する最善の方法は、最も多くの時間を費やしているところから始めることです。そのため、このコードをプロファイリングして、コードのどの部分に最も時間がかかっているかを正確に把握することを強くお勧めします。

さて、改善方法に関するいくつかの一般的なアイデア:

  • ラボへの変換を取り除く機会があれば、それを行います。
  • フロートは使用しないでください。浮動小数点を使わずに数学を行う方法は他にもたくさんあります。そのため、最初に uchars を試して (正規化ステップを取り除きます)、近似があまりにも悪い場合は unsigned short に変換し、すべての計算が完了したら uchar に戻します。
  • 除算の代わりに別の演算を見つけてみてください。これは、コンピューターで実行できる最もコストのかかる数学演算の 1 つです。おそらく、ビットをシフトしたり、同様の結果を持つ操作を見つけたりすることができます。
  • ptr で要素にアクセスしないでください。SO で検索して、Mat にすばやくアクセスします。
  • 255x255 のウィンドウでのぼかしは致命的です。処理時間の 95% がかかると思います。本当に小さくできないの?またはボックスフィルターを使用しますか?またはまったく使用しないのですか?または、インターネットで FFT フィルターの実装を探してください。これは、opencv で使用される単純なウィンドウ アプローチよりもはるかに高速です。
于 2012-05-07T17:21:12.433 に答える
2

主な問題は、元のイメージの複数のコピーをメモリ内に作成していることです: AImage、copyImage、imgLab、img、img32.

最初の最適化は、@Eric が提案したものでなければなりません (参照渡し):

static Mat correctColor(Mat& AImage) {

コードの残りの部分については、使用するコピーの数を減らすことができるかどうかを確認してください。

OpenCV には、 GPUにいくつかの関数を実装するGPU モジュールcv::blur()があります。この実装は CUDA フレームワークに基づいているため、グラフィック カードが NVIDIA の場合は運がいい: gpu::blur().

于 2012-05-07T12:47:59.883 に答える
1

まず、コードにクローンを作成しているので、参照によって引数を渡す必要があります。

于 2012-05-07T12:15:34.687 に答える
0

画像の色を改善しますか? 代わりに、ヒストグラム均等化を試してください。equalizeHist()関数を探します。

于 2012-05-07T12:20:39.630 に答える
-2

プログラムの最適化とは別に。-o3コンパイル中に、や などのコンパイラ最適化フラグを追加できます-NDEBUG

于 2015-12-09T08:37:45.027 に答える