OpenCV——颜色缩减、计时函数、访问像素

 1 //颜色空间缩减
 2 //src:源图片
 3 //dst:目标图片
 4 //divideWith:缩减宽度
 5 void ColorSpaceReduction(Mat src,int divideWith,Mat& dst)
 6 {
 7     //创建查询用的表
 8     uchar table[256];
 9     for (int i = 0; i < 256; ++i)
10         table[i] = divideWith * (i / divideWith);
11     //创建mat型用于LUT函数查表
12     Mat lookUpTable(1, 256, CV_8U);
13     uchar* p = lookUpTable.data;
14     for (int i = 0; i < 256; ++i)
15         p[i] = table[i];
16     //src是输入dst是输出
17     LUT(src, lookUpTable, dst);
18 
19 }

1 double time0 = static_cast<double>(getTickCount());//记录起始时间
2 
3 time0 = ((double)getTickCount() - time0) / getTickFrequency();
4 cout << "运行时间为 "<< time0 << ""<<endl;//输出运行时间

访问像素的三种方法

【方法1】指针访问,c语言操作符[ ](速度最快,但有越界的风险)

 1     int rowNumber = dst.rows;//行数
 2     int colNumber = dst.cols*dst.channels();//列数*通道数=每一行的元素个数
 3 
 4     //循环遍历每个元素
 5     for (int i = 0; i < rowNumber; i++)//行循环
 6     {
 7         uchar* data = dst.ptr<uchar>(i);//获取第i行首地址
 8         for (int j=0; j < colNumber; j++)//列循环
 9             data[j] = data[j] / div* div+div/2;//颜色缩减操作
    //也可以写成 *data++=*data/div*div+div/2;
10 }

【方法2】迭代器iterator(绝对安全,不会越界)

1     Mat_<Vec3b>::iterator it = dst.begin<Vec3b>();//初始位置的迭代器
2     Mat_<Vec3b>::iterator itend = dst.end<Vec3b>();//终止位置的迭代器
3     //彩色图像每个像素有3个通道
4     for (; it != itend; ++it)
5     {
6         (*it)[0] = (*it)[0] / div * div + div / 2;
7         (*it)[1] = (*it)[1] / div * div + div / 2;
8         (*it)[2] = (*it)[2] / div * div + div / 2;
9     }

【方法1】动态地址计算(最慢)

 1     int rowNumber = dst.rows;//行数
 2     int colNumber = dst.cols;//列数
 3     for (int i = 0; i < rowNumber; i++)
 4     {
 5         for (int j = 0; j < colNumber; j++)
 6         {
 7             //彩色图像每个像素有3个通道
 8             dst.at<Vec3b>(i, j)[0] = dst.at<Vec3b>(i, j)[0] / div * div + div / 2;
 9             dst.at<Vec3b>(i, j)[1] = dst.at<Vec3b>(i, j)[1] / div * div + div / 2;
10             dst.at<Vec3b>(i, j)[2] = dst.at<Vec3b>(i, j)[2] / div * div + div / 2;
11         
12         }
13     }

原文地址:https://www.cnblogs.com/long5683/p/9651442.html