OpenCV学习笔记(二):3种常用访问图像中像素的方式

#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//【1】创建原始图并显示Mat srcImage = imread("F:/C++/2. OPENCV 3.1.0/TEST/11.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<<"此方法运行时间为: "<<time0<<"秒"<<endl;  //输出运行时间//【6】显示效果图imshow("效果图",dstImage);waitKey(0);
}

一、指针访问,C操作符方式:

void colorReduce(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 colorReduce(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;  //红色通道}
}

三、动态地址计算方式:

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;  //第i行j列元素的蓝色通道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;  //红色通道}  }
}
// 动态地址,创建渐变色图Mat mat(480,640,CV_8UC4);for (int i = 0; i < mat.rows; ++i){for (int j = 0; j < mat.cols; ++j){Vec4b& rgba = mat.at<Vec4b>(i, j);rgba[0] = UCHAR_MAX;rgba[1] = saturate_cast<uchar>((float(mat.cols - j)) / ((float)mat.cols) *UCHAR_MAX);rgba[2] = saturate_cast<uchar>((float(mat.rows - i)) / ((float)mat.rows) *UCHAR_MAX);rgba[3] = saturate_cast<uchar>(0.5 * (rgba[1] + rgba[2]));}}imshow("PNG 图", mat);

OpenCV学习笔记(二):3种常用访问图像中像素的方式相关推荐

  1. OpenCV学习笔记(七):访问图像中像素的三类方法

    该文章参考毛星云著<OpenCV3编程入门>,电子工业出版社. 图像是以像素为单位储存的,访问图像中的每个像素是处理图像的基础,一般有三种访问图像像素的方法: 方法一:指针访问:C操作符[ ...

  2. 【opencv学习笔记】第五篇:访问图像中像素的三种方式、ROI区域图像叠加和图像混合

    1. 访问图像中像素的三种方式 任何图像处理算法,都是从操作每个像素开始的.在OpenCV中,提供了三种访问每个像素的方法. 方法1:指针访问:C操作符[] 方法2:迭代器iterator 方法3:动 ...

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

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

  4. OpenCV学习笔记(十五):图像仿射变换:warpAffine(),getRotationMatrix2D()

    OpenCV学习笔记(十五):图像仿射变换:warpAffine(),getRotationMatrix2D() 一个任意的仿射变换都能表示为乘以一个矩阵(线性变换)接着再加上一个向量(平移)的形式. ...

  5. OpenCV学习笔记(三):多通道图像分离、混合算子:split(),merge()

    OpenCV学习笔记(三):多通道图像分离.混合算子:split(),merge() #include <opencv2/opencv.hpp>#define BRG_BLUE_CHANN ...

  6. opencv学习笔记二十九:SIFT特征点检测与匹配

    SIFT(Scale-invariant feature transform)是一种检测局部特征的算法,该算法通过求一幅图中的特征点(interest points,or corner points) ...

  7. 3.2.1 ai and machine learning for coders Laurence Moroney 学习笔记(三)chapter3-检测图像中的特征-3.2 建立CNN区分人和马

    在本节中,我们将探索一个比Fashion MNIST分类器更复杂的场景.我们将扩展关于卷积和卷积神经网络的知识,尝试对特征位置不总是在同一位置的图像内容进行分类.为此,我创建了马或人类数据集. 代码示 ...

  8. 【转】DCMTK 开源库的学习笔记2:直接操作dcm文件中像素数据的尝试

    转自:https://blog.csdn.net/zssureqh/article/details/8785132 DCMTK官网给出了JPEG格式压缩的DCM文件解压缩的方法(http://supp ...

  9. OpenCv学习笔记(二)--Mat矩阵(图像容器)的创建及CV_8UC1,CV_8UC2等参数详解

    (一)Mat矩阵(图像容器)创建时CV_8UC1,CV_8UC2等参数详解 1--Mat不但是一个非常有用的图像容器类,同时也是一个通用的矩阵类 2--创建一个Mat对象的方法很多,我们现在先看一下M ...

最新文章

  1. 在springcacheinvokecontext中没找到field_家庭中没入住多久玻璃胶就发黑发霉,终于找到它的原因了,很简单...
  2. golang 协程 通道channel阻塞
  3. 印章WinForm自定义控件封装,提供源码下载
  4. Py之pixellib:pixellib库的简介、安装、经典案例之详细攻略
  5. Java小结(二)——打印矩形和九九乘法表
  6. 机械硬盘提示操作无法完成,因为磁盘管理控制台视图不是最新状态要如何办啊...
  7. TypeError: the JSON object must be str, bytes or bytearray, not NoneType
  8. 番茄工作法—《可以量化的管理学》
  9. [设计模式] ------ 对比总结:简单工厂模式、工厂方法模式、抽象工厂模式
  10. mysql三种引擎_MySQL常见的三种存储引擎
  11. SnippetsLab:让代码信手拈来
  12. C语言-求绝对值-三目运算符
  13. 二维灰度地形图山脊线自动提取方法整理(PPA)
  14. 计算机不得不知道的知识,术业有专攻计算机维修人员不得不知道的知识
  15. 2015 电子科大校园招聘名单(更新中)
  16. 【转载】超强的学习能力是怎样练就的?
  17. 【历史上的今天】9 月 1 日:Pascal 语言诞生;世界上首批大规模生产的个人电脑出现;世界上第一家网吧开业
  18. php个性网址导航源码,仿13580个性网址导航源码PHP版
  19. C#整合layui实现导出带多张图片的word文档
  20. java毕业设计开题报告基于SSM考试在线报名管理系统

热门文章

  1. android 修改系统参数设置,2021-05-15 [RK3399][Android7.1] 调试笔记 ---显示参数动态设置接口...
  2. python complex函数def_【Python3】Python函数
  3. python分段函数图像画法_我想用Python matplotlib 画一个这样类似的图像,需要用到分段函数。大佬帮帮这个小弟?...
  4. 领域应用 | 美团商品知识图谱的构建及应用
  5. 参会邀请 - CCKS2020 | 2020全国知识图谱与语义计算大会(CCKS2020)明日开幕
  6. 论文浅尝 | 二维卷积知识图谱嵌入
  7. (Android开发辅助工具)动态广播注册解注工具
  8. 浅谈多重背包及其优化
  9. 每天一个Linux命令(17)--whereis命令
  10. spirng mvc 中使用验证码