个人资料,仅供学习使用
修改时间——2022年2月7日 11:00:47
学习课程:OpenCV4 C++ 快速入门视频30讲
视频老师:贾志刚

04 图像像素的读写操作

opencv知识点:

  • 获取/改变图像的某个像素 - Mat::at
  • 图像像素 - 数组遍历
  • 图像像素 - 指针遍历

本课所解决的问题:

  • 如何获取/改变图像的某个像素?
  • 如何利用数组遍历图像像素?
  • 如何利用指针遍历图像像素?

1.获取某个像素

我们获取/改变图像的某个像素,要用到Mat::at< >( )

image.at<uchar>(row, col);
/*
获取指定位置的像素值这里只是at方法的一种演示,一共6种传参方式,具体可查看文档
说明:at<>中必须标明矩阵的数据类型,一般图像是uchar(8位无符号整型)类型这里我们采用二维度坐标的方式传参
*/

2.图像像素的数组遍历

为了演示图像像素遍历,我们在遍历的同时进行一个反色处理

//函数定义
void pixel_visit_demo(Mat& image);//函数实现
void QuickDemo::pixel_visit_demo(Mat& image) {int h = image.rows;int w = image.cols;int dims = image.channels();/*灰度图像——通道为1彩色图像——通道为3*/for(int row = 0; row < h; row++) {for (int col = 0; col < w; col++) {if (dims == 1) {//灰度图像int pv = image.at<uchar>(row, col);image.at<uchar>(row, col) = 255 - pv;}if (dims == 3) {//彩色图像Vec3b bgr = image.at<Vec3b>(row, col);image.at<Vec3b>(row, col)[0] = 255 - bgr[0];image.at<Vec3b>(row, col)[1] = 255 - bgr[1];image.at<Vec3b>(row, col)[2] = 255 - bgr[2];}}}imshow("像素读写演示", image);
}

如上,我们可以看到,不同通道数的处理方式是不同的

  • 对于单通道图像的使用方法:
int pv = image.at<uchar>(row, col);image.at<uchar>(row, col) = 255 - pv;//对访问的像素进行反色
  • 对于RGB三通道图像的使用方法:
Vec3b bgr = image.at<Vec3b>(row, col);image.at<Vec3b>(row, col)[0] = 255 - bgr[0];//对访问的像素进行反色
image.at<Vec3b>(row, col)[1] = 255 - bgr[1];//对访问的像素进行反色
image.at<Vec3b>(row, col)[2] = 255 - bgr[2];//对访问的像素进行反色

这里我们解释一下Vec3b是什么

Vec3b可以看作是vector<uchar, 3>。
简单而言就是一个uchar类型的,长度为3的vector向量。

根据通道数的不同,数据类型的不同,就有了很多变化,下面是常用的三种

8U 类型的 RGB 彩色图像可以使用 < Vec3b >
3 通道 float 类型的矩阵可以使用 < Vec3f >
3 通道 int 类型的矩阵可以使用 < Vec3i >

3.图像像素的指针遍历

另一种更快的方式就是指针遍历

通过设置每一行的首地址指针,我们可以实现更快的遍历

for(int row = 0; row < h; row++) {uchar* curren_row = image.ptr<uchar>(row);//相当于每次获取行的首地址for (int col = 0; col < w; col++) {//灰度图像if (dims == 1) {*curren_row++ = 255 - *curren_row;}//彩色图像if (dims == 3) {*curren_row++ = 255 - *curren_row;*curren_row++ = 255 - *curren_row;*curren_row++ = 255 - *curren_row;}}}

取完每行的首地址之后

  • 对于单通道图像的使用方法:
*curren_row++ = 255 - pv;
  • 对于RGB三通道图像的使用方法:
//与数组遍历相比,3通道时执行三次就可以
*curren_row++ = 255 - *curren_row;
*curren_row++ = 255 - *curren_row;
*curren_row++ = 255 - *curren_row;

本课所用API查阅

Mat::at

虽然有12种重载,但只有6种传参方式

  1. 单维度坐标——i0:沿维度 0 的索引

  2. 双维度坐标——row 沿维度 0 的索引 ;col 沿维度 1 的索引

  3. 三维度坐标——i0 沿维度 0 的索引;i1 沿维度 1 的索引;i2 沿维度 2 的索引

  4. 维度数组坐标——int数组

  5. 维度数组坐标——vector数组

  6. 像素点的坐标——point类

【个人笔记】OpenCV4 C++ 快速入门 04课相关推荐

  1. 【个人笔记】OpenCV4 C++ 快速入门 29课

    个人资料,仅供学习使用 修改时间--2022年2月19日 15:02:27 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 29 高斯双边模糊 opencv知识点: 高斯双边模 ...

  2. 【个人笔记】OpenCV4 C++ 快速入门 26课

    个人资料,仅供学习使用 修改时间--2022年2月13日 20:49:07 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 26 直方图均衡化 opencv知识点: 均衡灰度图 ...

  3. 【个人笔记】OpenCV4 C++ 快速入门 25课

    个人资料,仅供学习使用 修改时间--2022年2月13日 20:45:23 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 25 二维直方图 opencv知识点: 计算直方图数 ...

  4. 【个人笔记】OpenCV4 C++ 快速入门 23课

    个人资料,仅供学习使用 修改时间--2022年1月26日 00:49:43 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 23 视频处理与保存 opencv知识点: Vide ...

  5. 【个人笔记】OpenCV4 C++ 快速入门 22课

    个人资料,仅供学习使用 修改时间--2022年1月25日 22:09:17 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 22 视频文件摄像头使用 opencv知识点: VI ...

  6. 【个人笔记】OpenCV4 C++ 快速入门 20课

    个人资料,仅供学习使用 修改时间--2022年1月24日 22:09:02 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 20 图像翻转 opencv知识点: 图像翻转 - ...

  7. 【个人笔记】OpenCV4 C++ 快速入门 19课

    个人资料,仅供学习使用 修改时间--2022年1月24日 20:17:13 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 19 图像放缩与插值 opencv知识点: 图像放缩 ...

  8. 【个人笔记】OpenCV4 C++ 快速入门 17课

    个人资料,仅供学习使用 修改时间--2022年1月23日 17:59:14 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 17 鼠标操作与响应 opencv知识点: 设置指定 ...

  9. 【个人笔记】OpenCV4 C++ 快速入门 14课

    个人资料,仅供学习使用 修改时间--2022年2月13日 09:47:32 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 14 图像几何形状绘制 opencv知识点: 四种几 ...

最新文章

  1. VC++ 判断文件或文件夹是否存在的快捷方法 _access
  2. 波士顿动力机器狗再进化:已学会自主规划路线
  3. oracle 修改聚簇因子,Oracle 基础篇 --- 聚簇因子(clustering_factor)
  4. P2550 [AHOI2001]彩票摇奖
  5. Linux实战教学笔记24:SSH连接原理及ssh-key
  6. MTP管理才能发展专家
  7. 柱坐标系下的流体力学控制方程组的微分形式的推导
  8. 1寸、小2寸、2寸证件照片是多大尺寸?
  9. async/await 记录
  10. 广东知名企品牌拉芳好迪等的中文域名遭抢注
  11. 苹果iPhone14频繁自动重启是什么原因?如何修复这个问题?
  12. PreScan快速入门到精通第三十四讲基于PreScan进行超声波雷达传感器仿真
  13. Java中的枚举类是什么?enum关键字怎么使用?
  14. 万圣节html代码大全,基于Jquery实现万圣节快乐特效
  15. 蛋白质集合c语言算法,利用蛋白质序列的预测方法
  16. imp 00017 由于 oracle 错误 6550,imp 导入dmp文件报错 IMP-00017: 由于 ORACLE 异常 20005 求大神!...
  17. odoo12企业版修改邮箱配置
  18. 使用echarts实现雷达图
  19. LXC是什么、什么是docker、docker产生的背景
  20. 免费打印控件Lodop

热门文章

  1. NLP+词法系列(二)︱中文分词技术简述、深度学习分词实践(CIPS2016、超多案例)
  2. R+NLP︱text2vec包——四类文本挖掘相似性指标 RWMD、cosine、Jaccard 、Euclidean (三,相似距离)
  3. 特征选择的工程方法?
  4. Nova 操作汇总(限 libvirt 虚机) [Nova Operations Summary]
  5. 红帽专家谈 Ceph 与 Gluster 开源存储路线
  6. [转] 用GDB调试程序(五)
  7. python查询注册表子项是否存在并操作
  8. 《R in Action》读书笔记(3) 数据变换
  9. HP刀片服务器C7000-Cisco网络模块配置指南
  10. 教你如何与电脑病毒打游击