三种方法分别问:

指针访问:void colorReduce_ptr(cv::Mat &inputImage, cv::Mat &outputImage, int div);

迭代器访问:void colorReduce_iterator(cv::Mat &inputImage, cv::Mat &outputImage, int div);

动态地址计算:void colorReduce_at(cv::Mat &inputImage, cv::Mat &outputImage, int div);

代码实例:

#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>using namespace std;
using namespace cv;void colorReduce_ptr(  Mat &inputImage,  Mat &outputImage, int div );
void colorReduce_iterator(  Mat &inputImage,  Mat &outputImage, int div );
void colorReduce_at(  Mat &inputImage,  Mat &outputImage, int div );void colorReduce_ptr(  Mat &inputImage,  Mat &outputImage, int div )
{outputImage = inputImage.clone( );int rowNumber = outputImage.rows;int colNumber = outputImage.cols*outputImage.channels( );for(size_t i = 0; i < rowNumber; i++){uchar* data = outputImage.ptr<uchar>( i );for(size_t j = 0; j < colNumber; j++){data[j] = data[j] / div*div + div / 2;}}
}void colorReduce_iterator( Mat &inputImage, Mat &outputImage, int div )
{outputImage = inputImage.clone( );Mat_< Vec3b>::iterator it = outputImage.begin< Vec3b>( );Mat_< Vec3b>::iterator it_end = outputImage.end< Vec3b>( );for(; it != it_end; ++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;}
}void colorReduce_at(  Mat &inputImage,  Mat &outputImage, int div )
{outputImage = inputImage.clone( );int rowNumber = outputImage.rows;int colNumber = outputImage.cols;for(size_t i = 0; i < rowNumber; i++){for(size_t j = 0; j < colNumber; j++){for(size_t px = 0; px < 3; px++){outputImage.at< Vec3b>( i, j )[px] = outputImage.at< Vec3b>( i, j )[px] / div * div + div / 2;}}}
}int main( int argc, char** argv[] )
{Mat srcImg =  imread( "11.jpg" );imshow( "srcImg", srcImg );Mat dstImg;dstImg.create( srcImg.rows, srcImg.cols, srcImg.type( ) );double timeStart;timeStart = static_cast<double>( getTickCount( ));colorReduce_ptr( srcImg, dstImg, 32 );timeStart = ((double) getTickCount( ) - timeStart) /  getTickFrequency( );cout << "ptr方法运行时间为:" << timeStart << "秒" << endl;timeStart = static_cast<double>( getTickCount( ));colorReduce_iterator( srcImg, dstImg, 32 );timeStart = ((double) getTickCount( ) - timeStart) /  getTickFrequency( );cout << "iterator方法运行时间为:" << timeStart << "秒" << endl;timeStart = static_cast<double>( getTickCount( ));colorReduce_at( srcImg, dstImg, 32 );timeStart = ((double) getTickCount( ) - timeStart) /  getTickFrequency( );cout << "at方法运行时间为:" << timeStart << "秒" << endl;imshow( "dstImg", dstImg );waitKey( 0 );
}

结果展示:

OpenCV访问像素的三种方法相关推荐

  1. OpenCV(图像处理)—访问像素的三种方法

    方法一:用指针访问像素 1 #include <opencv2/opencv.hpp> 2 #include <opencv2/core/core.hpp> 3 #includ ...

  2. OpenCV精进之路(零):访问图像中像素的三种方法

    访问像素的三种方法 指针访问:最快 迭代器iterator:较慢,非常安全,指针访问可能出现越界问题 动态地址计算:更慢,通过at()实现.适用于访问具体某个第i行,j列的像素,而不适用遍历像素 这里 ...

  3. Opencv3编程入门学习笔记(三)之访问图像像素的三种方法

    访问图像像素的三种方法:指针访问,迭代器访问,动态地址访问.访问最快的为指针访问,以下算法在几毫秒,但指针访问容易造成内存泄漏:其次为迭代器访问:最后为动态地址访问. 以下程序是根据<OpenC ...

  4. 【OpenCV】OpenCV访问像素点的三种方式

    环境配置   VS2013+OpenCV3.0+Win7(X64)    前言   OpenCV是图像处理最常用的库之一.它提供了许多常用的图像处理算法相关的函数,极大地方便了图像处理方法的开发,而图 ...

  5. NAS开通外网访问功能的三种方法

    1.从运营商申请固定IP,直接与NAS映射 因为疫情影响,回不了市区家里,这个方法还没测试过. 2.购买云服务器,赠送公网IP,通过frp实现内网穿透 先从阿里云购买了一周(最短一周,3月14日到期) ...

  6. 遍历图片像素的三种方法

    1.指针访问像素 void colorReduce(Mat& inputImage, Mat& outputImage, int div) {outputImage = inputIm ...

  7. C# .NET访问Oracle的三种方法(转)

    转自:https://blog.csdn.net/hndaihui/article/details/79524072 首先介绍下开发环境:WIn10 64bit+Visual Studio 2015+ ...

  8. html输入密码访问指定页面,三种方法使HTML单页面输入密码才能访问

    方法一 function password() { var testV = 1; var pass1 = prompt('请输入密码',''); while (testV < 3) { if ( ...

  9. 线程间操作无效:从不是创建控件的线程访问它的三种方法

    访问 Windows 窗体控件本质上不是线程安全的.如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态.还可能出现其他与线程相关的 bug,包括争用情况和死锁.确保以线程安 ...

最新文章

  1. OpenCV中imread/imwrite与imdecode/imencode的异同
  2. Python 实现整数线性规划:分枝定界法(Branch and Bound)
  3. python在读写文件之前需要创建文件对象-python读取或写入文件
  4. markdown 表格对齐方式、换行、内嵌列表、...
  5. 小师妹学JavaIO之:File文件系统
  6. 归并排序的分析与Java实现
  7. WebSocket服务器和客户端的一对多通知实现
  8. Hadoop入门(五)IO操作
  9. python面向对象作业_面向对象作业
  10. mysql解释命令,MySQL中EXPLAIN解释命令
  11. sql联接查询_SQL联接
  12. STM32的CAN波特率设置方法详解
  13. python中文近义词工具_python根据词条生成同义词库
  14. 共享单车数据集_共享单车数据可视化分析
  15. 高德地图定位误差_高德地图定位api以及导航和定位 位置的偏差
  16. 小白必看 APN/证书/越狱等名词详解
  17. 相关系数R-判定系数R方的matlab实现
  18. 思维导图Java篇(一)
  19. batch_size 大小的设定,对训练的影响
  20. GFC全球影视区块链技术峰会在河南成功举办

热门文章

  1. 【数据结构笔记35】C实现:有序子列的归并算法:递归与非递归的实现
  2. 时序分析基本概念介绍<系统接口sdc>
  3. matlab hopty,运行Matlab时出现错误?Attempted to access rxd(500); index out of bou
  4. python 指定gpu_加快Python算法的四个方法:Numba篇
  5. mysql flaskalchemy_python flask sqlalchemy 数据库mysql操作
  6. 新浪研发中心: Berkeley DB 使用经验总结
  7. [Silverlight]实战WCF RIA gzip压缩
  8. html二维坐标系转换,旋转坐标系 转换工具
  9. java集合框架源代码_面试必备——Java集合框架
  10. 在尝试重新安装一个服务时遇到这样的错误:指定服务已标记为删除