《OpenCV3编程入门》访问图像中像素的三类方法
2016-07-23 15:07
393 查看
·方法一 指针访问:C操作符[ ]; ·方法二 迭代器iterator; ·方法三 动态地址计算;
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream> using namespace std; using namespace cv; //使用【指针访问:C操作符[ ]】方法版的颜色空间缩减函数 void colorReduce1(Mat& inputImage, Mat& outputImage, int div); //使用【迭代器】方法版的颜色空间缩减函数 void colorReduce2(Mat& inputImage, Mat& outputImage, int div); //使用【动态地址运算配合at】方法版本的颜色空间缩减函数 void colorReduce3(Mat& inputImage, Mat& outputImage, int div); int main( ) { //【1】创建原始图并显示 Mat srcImage = imread("1.jpg"); imshow("原始图像",srcImage); //【2】按原始图的参数规格来创建创建效果图 Mat dstImage; dstImage.create(srcImage.rows,srcImage.cols,srcImage.type());//效果图的大小、类型与原图片相同 //【3】记录起始时间 double time0 = static_cast<double>(getTickCount()); //【4】调用颜色空间缩减函数 colorReduce(srcImage,dstImage,32); //【5】计算运行时间并输出 time0 = ((double)getTickCount() - time0)/getTickFrequency(); cout<<"\t此方法运行时间为: "<<time0<<"秒"<<endl; //输出运行时间 //【6】显示效果图 imshow("效果图",dstImage); waitKey(0); } //使用【指针访问:C操作符[ ]】方法版的颜色空间缩减函数 void colorReduce1(Mat& inputImage, Mat& outputImage, int div) { //参数准备 outputImage = inputImage.clone(); //拷贝实参到临时变量 int rowNumber = outputImage.rows; //行数 int colNumber = outputImage.cols*outputImage.channels(); //列数 x 通道数=每一行元素的个数 //双重循环,遍历所有的像素值 for(int i = 0;i < rowNumber;i++) //行循环 { uchar* data = outputImage.ptr<uchar>(i); //获取第i行的首地址 for(int j = 0;j < colNumber;j++) //列循环 { // ---------【开始处理每个像素】------------- data[j] = data[j]/div*div + div/2; // ----------【处理结束】--------------------- } //行处理结束 } } //使用【迭代器】方法版的颜色空间缩减函数 void colorReduce2(Mat& inputImage, Mat& outputImage, int div) { //参数准备 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; // ------------------------【处理结束】---------------------------- } } //使用【动态地址运算配合at】方法版本的颜色空间缩减函数 void colorReduce3(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; //红是通道 } } }
相关文章推荐
- python中使用OpenCV进行人脸检测的例子
- opencv 做人脸识别 opencv 人脸匹配分析
- 使用opencv拉伸图像扩大分辨率示例
- Android Studio中配置OpenCV库开发环境的教程
- 基于C++实现kinect+opencv 获取深度及彩色数据
- visual studio 2012安装配置方法图文教程 附opencv配置教程
- OpenCV 2.4.3 C++ 平滑处理分析
- Python中使用OpenCV库来进行简单的气象学遥感影像计算
- 利用Python和OpenCV库将URL转换为OpenCV格式的方法
- python结合opencv实现人脸检测与跟踪
- Python环境搭建之OpenCV的步骤方法
- Python+Opencv识别两张相似图片
- Python实现OpenCV的安装与使用示例
- 在树莓派2或树莓派B+上安装Python和OpenCV的教程
- opencv-python学习一--人脸检测
- 在Ubuntu上安装OpenCV3.0和Python-openCV的经历
- 使用 Java 开发 OpenCV 应用
- OpenCV配置,从来没有这么简单!
- ubuntu下opencv和qt的安装配置
- visual studio 2012安装配置方法图文教程 附opencv配置教程