在opencv中提供了cvtColor()函数,可以直接将彩色图像转换为灰度图。
下面讲解一下cvtColor()函数的具体参数:
第一个参数:输入一个图像
第二个参数: 输出一个图像
第三个参数:COLOR_BGR2GRAY(bgr——>gray)
第三个参数转到定义后还能看到可以填入的更多选项:
如:COLOR_BGR5652RGB:5位传B,6位传G,5位传R,这样数量会减小
COLOR_BGR5652RGBA:多在3D图像中使用,A是一个透明通道。
除了直接调用cvtColor()将图像转为灰度,我们自己也可以实现这个功能(如下面代码中的BGRToGray函数),并且将opencv中提供的cvtColor()函数和自己实现的函数,进行性能测试:
#include<iostream>
#include<opencv2\opencv.hpp>
using namespace std;
using namespace cv;
void BGRToGray(Mat &src, Mat &dest)
{
dest.create(src.rows,src.cols, CV_8UC1);
for (int r = 0; r < src.rows; r++)
{
for (int c = 0; c < src.cols; c++)
{
Vec3b & m = src.at<Vec3b>(r, c);
int gray = (m[2] * 30 + m[1] * 59 + m[0] * 11 + 50) / 100;
dest.at<uchar>(r, c) = gray;
}
}
}
int main()
{
Mat src = imread("D:\\photogallery\\人物\\image_11.jpg");
Mat grayimg;
clock_t begin1, end1,begin2,end2,begin3,end3;
begin1 = clock();
cvtColor(src, grayimg, COLOR_BGR2GRAY);
end1 = clock();
begin2 = clock();
cvtColor(src, grayimg, COLOR_BGR2GRAY);
end2 = clock();
begin3 = clock();
Mat mygray;
BGRToGray(src, mygray);
end3 = clock();
cout << "所用时间:" << double(end1 - begin1) / CLOCKS_PER_SEC * 1000 << "ms" << endl;
cout << "所用时间:" << double(end2 - begin2) / CLOCKS_PER_SEC * 1000 << "ms" << endl;
cout << "所用时间:" << double(end3 - begin3) / CLOCKS_PER_SEC * 1000 << "ms" << endl;
namedWindow("src");
namedWindow("gray");
namedWindow("mygray");
imshow("src", src);
imshow("gray", grayimg);
imshow("mygray", mygray);
waitKey(0);
return 0;
}
运行结果如下:
结果分析如下:
- 直接调用opencv中提供的cvtColor()函数速度更快。
- 首次调用cvtColor()可能会启动一些东西,所以第二次调用时,速度明显加快。