2012-05-07 173 views
2

這裏是我嘗試改善圖像顏色的功能。它的作品,但它真的很慢......也許有人有一個更好的主意?Opencv慢代碼:是不是有問題?

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; 
} 
+2

這應該更好地發佈到[codereview.se] – CharlesB

+0

thx我不知道這個頁面 – rouge

回答

1

首先,您應該通過引用傳遞參數,因爲您已經在代碼中創建了一個克隆。

+0

感謝那個提示 – rouge

0

改善圖像顏色?您應該嘗試使用Histogram Equalization。尋找equalizeHist()函數。

+1

這不是「改善」的靈丹妙藥。改進不是一個數學上定義的術語;) –

+1

那麼......你是對的。 :)但是均衡對於這類任務非常有用。 –

+0

當然可以:) –

1

主要問題是,您正在內存中創建原始圖像的多個副本:AImage,copyImage,imgLab,img,img32。

首先優化應該是什麼@Eric建議(通過引用傳遞):

static Mat correctColor(Mat& AImage) { 

至於你的代碼的其餘部分,看看你能不能減少你一起工作的份數。

OpenCV有一個GPU模塊它在GPU中實現了幾個功能,包括cv::blur()。這個實現基於CUDA框架,所以如果你的顯卡是NVIDIA,你很幸運:gpu::blur()

1

優化的最佳方式是從最耗費時間的地方開始。因此,我強烈建議您對這些代碼進行簡要分析,以確切知道代碼的哪些部分是最耗時的。

現在,關於如何提高一些總體思路:

  • 如果有任何機會擺脫轉換到實驗室去做。
  • 請勿使用浮筒。有很多其他方法可以做數學,而不需要浮點數。因此,首先嚐試使用uchars(擺脫歸一化步驟),然後,如果近似值太差,則轉換爲unsigned short,然後返回到uchar,以便完成所有計算。
  • 嘗試找到另一個操作,而不是除法。這是您可以在計算機上執行的最昂貴的數學操作之一。也許你可以移位,或者找到一個具有類似結果的操作。
  • 請勿通過ptr訪問元素。在SO上搜索快速Mat訪問。
  • 模糊的255x255窗口是一個殺手。我懷疑它需要95%的處理時間。你真的不能變小嗎?或使用盒式過濾器?或者根本不使用它?或者查看互聯網上的FFT濾波器實現。它比opencv使用的簡單窗口方法快得多。
+0

爲什麼不通過ptr訪問元素? @vasile – solvingPuzzles

+0

按圖像訪問元素。ptr 比原始指針訪問速度慢(提取原始指針指向圖像數據,並通過指針索引訪問它) – Sam

-1

除了優化程序。您可以在編譯時添加編譯器優化標誌,如-o3-NDEBUG