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

优化的最佳方法是从您花费最多时间的地方开始。因此,我强烈建议您分析此代码,以准确了解代码的哪些部分最耗时。

现在,关于如何改进的一些一般想法:

  • 如果有任何机会摆脱对 Lab 的转换,那就去做吧。
  • 不要使用浮动。除了浮点数,还有许多其他的数学运算方法。因此,首先尝试 uchars(摆脱标准化步骤),然后,如果近似值太差,则转换为 unsigned short,然后在所有计算完成后返回 uchar。
  • 尝试找到另一个操作而不是除法。这是您可以在计算机上进行的最昂贵的数学运算之一。也许您可以移动位,或找到具有类似结果的操作。
  • 不要通过 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

除了对程序的优化。您可以在编译时添加编译器优化标志,例如-o3and -NDEBUG

于 2015-12-09T08:37:45.027 回答