opencv学习(十)颜色缩减 // 查表 // 计时 // 访问像素的三个方法(指针/STL迭代器(待详细了解)/动态地址)//历遍图像的14种方法
2018-04-11 19:54
866 查看
1,图像储存方式
2,颜色缩减
3,查表 look up table
4,计时函数
实例 颜色空间缩减如256*256→26*26(访问每个像素)
#include<opencv2/opencv.hpp> #include<iostream> using namespace cv; using namespace std; void colorReduce(Mat& inputImage, Mat& outputImage, int div);//全局函数说明 int main() { Mat scrimage = imread("D://Bild.jpg");//注意路径格式 imshow("原图", scrimage); Mat dstimage; dstimage.create(scrimage.rows, scrimage.cols, scrimage.type());//构造与原图,行数,列数,类型相同 Mat&inputImage,Mat&outputImage,int div double time0 = static_cast<double>(getTickCount());//记录起始时钟周期数 colorReduce(scrimage, dstimage, 64); time0 = ((double)getTickCount() - time0) / getTickFrequency();//过程时间=(终止时钟周期数-起始时钟周期数)/一秒钟走过的时钟周期数(频率) cout << "此方法运行时间为:" << time0 << "秒" << endl;//输出 imshow("效果图", dstimage); waitKey(0); } void colorReduce(Mat& inputImage, Mat& outputImage, int div) { outputImage = inputImage.clone();//复制实参到临时变量 int rowNumber = outputImage.rows; int colNumber = outputImage.cols*outputImage.channels();//行数,列数(cols*通道数) for (int i = 0; i < rowNumber; i++)//行循环 { uchar* data = outputImage.ptr<uchar>(i); for (int j = 0; j < colNumber; j++) { data[j] = data[j] / div * div + div / 2; } } }
5,访问像素的三个方法
5.1,采用指针法(类似c语言,最快)
具体代码如上图所示,快是因为将三通道数据看成一样的(未划分开),依次操作,其他两种方法按通道类别来分别处理void colorReduce(Mat& inputImage, Mat& outputImage, int div) { outputImage = inputImage.clone();//复制实参到临时变量 int rowNumber = outputImage.rows; int colNumber = outputImage.cols*outputImage.channels();//行数,列数(cols*通道数) for (int i = 0; i < rowNumber; i++)//行循环 { uchar* data = outputImage.ptr<uchar>(i); for (int j = 0; j < colNumber; j++) { data[j] = data[j] / div * div + div / 2; } } }
5.2,STL迭代器法(待详细了解)
void colorReduce(Mat& inputImage, Mat& outputImage, int div)//采用STL迭代器方法 { outputImage = inputImage.clone();//复制实参到临时变量 Mat_<Vec3b>::iterator it = outputImage.begin<Vec3b>();//初始位置迭代器 Mat_<Vec3b>::iterator itend = outputImage.end<Vec3b>();//终止位置迭代器 for (; it !=itend; it++) { (*it)[0] = (*it)[0] / div * div + div / 2; (*it)[1] = (*it)[1] / div * div + div / 2; (*it)[2] = (*it)[2] / div * div + div / 2;//对三个通道的每个像素都进行操作 } }
5.3,动态地址(更直观,时间相对较长)
void colorReduce(Mat& inputImage, Mat& outputImage, int div) { outputImage = inputImage.clone();//复制实参到临时变量 int rowNumber = outputImage.rows; int colNumber = outputImage.cols;//行数,列数 for (int i = 0; i < rowNumber; i++)//行循环 { for (int j = 0; j < colNumber; j++) { outputImage.at<Vec3b>(i,j)[0]= outputImage.at<Vec3b>(i, j)[0] / div * div + div / 2; outputImage.at<Vec3b>(i, j)[1] = outputImage.at<Vec3b>(i, j)[1] / div * div + div / 2; outputImage.at<Vec3b>(i, j)[2] = outputImage.at<Vec3b>(i, j)[2] / div * div + div / 2; } } }
相关文章推荐
- opencv学习笔记1::访问图像中像素的三类方法(用指针,迭代器,动态地址)代码及用时检测
- OpenCv学习笔记(六)----图像空间缩减,OpenCv中的计时函数和OpenCv中操作图像单个像素点的方法
- opencv学习(5)图像像素的访问、颜色通道的分离和融合
- opencv学习(三)之图像像素遍历(颜色空间缩减、查找表)
- opencv内存总结和访问图像中像素方法案例(指针方法)
- OpenCV2 访问各个像素点的方法(图像遍历)
- OPENCV2 访问图像像素值的三种方法
- 像素临近区域、颜色通道、ROI区域的访问---opencv.2学习笔记2
- opencv2-用指针来访问图像像素
- [HQ]OpenCV访问图像像素, 数组元素等方法收集
- openCV中访问图像像素的两种方法
- opencv学习笔记(八)IplImage* 访问图像像素的值
- 学习OpenCV2——访问Mat图像的像素值
- OpenCV 2 学习笔记(5): 像素的访问:给图像加入椒盐噪声
- opencv里常用的访问图像像素数据方法
- 来自一本国外OpenCV2书籍的示例-遍历图像像素的14种方法
- Open CV 学习笔记:访问图像中像素的几种方法
- OpenCV访问图像像素的方法
- 【OpenCV学习笔记】【函数学习】二十(访问图像像素)
- opencv OpenCV访问图像像素, 数组元素等方法收集