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
时间: 2024-10-08 14:58:48