这是一个我尝试改善图像颜色的功能。它有效,但它真的很慢......也许有人有更好的主意?
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;
}
答案 0 :(得分:1)
首先,您应该通过引用传递参数,因为您已经在代码中创建了一个克隆。
答案 1 :(得分:1)
主要问题是你在内存中创建原始图像的几个副本:AImage,copyImage,imgLab,img,img32。
首先应该是@Eric建议的优化(通过引用传递):
static Mat correctColor(Mat& AImage) {
至于你的其余代码,看看你是否可以减少你使用的副本数量。
OpenCV有一个 GPU模块,它在GPU中实现了几个功能,包括cv::blur()
。此实现基于CUDA框架,因此,如果您的图形卡是NVIDIA,那么您很幸运:gpu::blur()
。
答案 2 :(得分:1)
优化的最佳方式是从您花费最多时间的地方开始。因此,我强烈建议您分析此代码,以确切了解代码的哪些部分最耗时。
现在,关于如何改进的一些一般性想法:
答案 3 :(得分:0)
改善图像颜色?您应该尝试使用Histogram Equalization。查找 equalizeHist()函数。
答案 4 :(得分:-1)
除了对计划的优化。您可以在编译时添加编译器优化标志,如-o3
和-NDEBUG
。