OpenCV学习笔记(二):3种常用访问图像中像素的方式
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种常用访问图像中像素的方式相关推荐
- OpenCV学习笔记(七):访问图像中像素的三类方法
该文章参考毛星云著<OpenCV3编程入门>,电子工业出版社. 图像是以像素为单位储存的,访问图像中的每个像素是处理图像的基础,一般有三种访问图像像素的方法: 方法一:指针访问:C操作符[ ...
- 【opencv学习笔记】第五篇:访问图像中像素的三种方式、ROI区域图像叠加和图像混合
1. 访问图像中像素的三种方式 任何图像处理算法,都是从操作每个像素开始的.在OpenCV中,提供了三种访问每个像素的方法. 方法1:指针访问:C操作符[] 方法2:迭代器iterator 方法3:动 ...
- Opencv3编程入门学习笔记(三)之访问图像像素的三种方法
访问图像像素的三种方法:指针访问,迭代器访问,动态地址访问.访问最快的为指针访问,以下算法在几毫秒,但指针访问容易造成内存泄漏:其次为迭代器访问:最后为动态地址访问. 以下程序是根据<OpenC ...
- OpenCV学习笔记(十五):图像仿射变换:warpAffine(),getRotationMatrix2D()
OpenCV学习笔记(十五):图像仿射变换:warpAffine(),getRotationMatrix2D() 一个任意的仿射变换都能表示为乘以一个矩阵(线性变换)接着再加上一个向量(平移)的形式. ...
- OpenCV学习笔记(三):多通道图像分离、混合算子:split(),merge()
OpenCV学习笔记(三):多通道图像分离.混合算子:split(),merge() #include <opencv2/opencv.hpp>#define BRG_BLUE_CHANN ...
- opencv学习笔记二十九:SIFT特征点检测与匹配
SIFT(Scale-invariant feature transform)是一种检测局部特征的算法,该算法通过求一幅图中的特征点(interest points,or corner points) ...
- 3.2.1 ai and machine learning for coders Laurence Moroney 学习笔记(三)chapter3-检测图像中的特征-3.2 建立CNN区分人和马
在本节中,我们将探索一个比Fashion MNIST分类器更复杂的场景.我们将扩展关于卷积和卷积神经网络的知识,尝试对特征位置不总是在同一位置的图像内容进行分类.为此,我创建了马或人类数据集. 代码示 ...
- 【转】DCMTK 开源库的学习笔记2:直接操作dcm文件中像素数据的尝试
转自:https://blog.csdn.net/zssureqh/article/details/8785132 DCMTK官网给出了JPEG格式压缩的DCM文件解压缩的方法(http://supp ...
- OpenCv学习笔记(二)--Mat矩阵(图像容器)的创建及CV_8UC1,CV_8UC2等参数详解
(一)Mat矩阵(图像容器)创建时CV_8UC1,CV_8UC2等参数详解 1--Mat不但是一个非常有用的图像容器类,同时也是一个通用的矩阵类 2--创建一个Mat对象的方法很多,我们现在先看一下M ...
最新文章
- 在springcacheinvokecontext中没找到field_家庭中没入住多久玻璃胶就发黑发霉,终于找到它的原因了,很简单...
- golang 协程 通道channel阻塞
- 印章WinForm自定义控件封装,提供源码下载
- Py之pixellib:pixellib库的简介、安装、经典案例之详细攻略
- Java小结(二)——打印矩形和九九乘法表
- 机械硬盘提示操作无法完成,因为磁盘管理控制台视图不是最新状态要如何办啊...
- TypeError: the JSON object must be str, bytes or bytearray, not NoneType
- 番茄工作法—《可以量化的管理学》
- [设计模式] ------ 对比总结:简单工厂模式、工厂方法模式、抽象工厂模式
- mysql三种引擎_MySQL常见的三种存储引擎
- SnippetsLab:让代码信手拈来
- C语言-求绝对值-三目运算符
- 二维灰度地形图山脊线自动提取方法整理(PPA)
- 计算机不得不知道的知识,术业有专攻计算机维修人员不得不知道的知识
- 2015 电子科大校园招聘名单(更新中)
- 【转载】超强的学习能力是怎样练就的?
- 【历史上的今天】9 月 1 日:Pascal 语言诞生;世界上首批大规模生产的个人电脑出现;世界上第一家网吧开业
- php个性网址导航源码,仿13580个性网址导航源码PHP版
- C#整合layui实现导出带多张图片的word文档
- java毕业设计开题报告基于SSM考试在线报名管理系统
热门文章
- android 修改系统参数设置,2021-05-15 [RK3399][Android7.1] 调试笔记 ---显示参数动态设置接口...
- python complex函数def_【Python3】Python函数
- python分段函数图像画法_我想用Python matplotlib 画一个这样类似的图像,需要用到分段函数。大佬帮帮这个小弟?...
- 领域应用 | 美团商品知识图谱的构建及应用
- 参会邀请 - CCKS2020 | 2020全国知识图谱与语义计算大会(CCKS2020)明日开幕
- 论文浅尝 | 二维卷积知识图谱嵌入
- (Android开发辅助工具)动态广播注册解注工具
- 浅谈多重背包及其优化
- 每天一个Linux命令(17)--whereis命令
- spirng mvc 中使用验证码