图像处理中很多时候会对像素点进行操作。在OpenCV有许多方法来对像素进行遍历。

at()函数

对于单通道图像"picture1",picture1.at<uchar>(i,j)就表示在第i行第j列的像素值。

对于多通道图像如RGB图像"picture2",可以用picture2.at<Vec3b>(i,j)[c]来表示某个通道中在(i,j)位置的像素值。

1)上面的uchar、Vec3b表示图像元素的类型。

2)(i,j)当然就是指像素点的位置,表示第i行第j列。

3)[c]表示的是通道,对于RGB图像而言,c取0就是B分量;c取1就是G分量;c取2就是R分量(要注意在OpenCV中是按BGR的顺序表示的)。

在OpenCV官方文档中是这么写的:

翻译:

 注意:

我们有时候回遇到这种情况

带有单个索引(i)的变量可用于访问单行或单列二维数组的元素。也就是说,如果,例如,A是一个1 x N的浮点矩阵,B是一个M x 1的整数矩阵,你可以简单地写A在<float>(k+4)处和B在<int>(2*i+1)处,而不是A在<float>(0,k+4)处和B在<int>(2*i+1,0)处。

例如:

double predictAngle = prediction.at<float>(0);

上面代码的意思就是,prediction是个单行或者单列的单通道Mat类型,prediction.at<float>(0)即为访问数组的第一个元素(可以理解为访问一个一维数组的第一个元素)

但是我发现

不是单行或者单列的Mat类型(但需要为单通道)也可以使用at<float>(n),这种情况下会默认访问矩阵第一行(row =0)的元素,以第一行来进行索引。

即double predictAngle = prediction.at<float>(4);  等价于:double predictAngle = prediction.at<float>(0,4);

/***Copyright (c) 2019 Young Fan.All Right Reserved.*Author: Young Fan*Date: 2019.05.16*IDE: Visual Studio 2017*Description:*/#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;int main()
{Mat img = imread("1.jpg", 0); //以单通道读入图片int x = img.at<uchar>(118);int y = img.at<uchar>(0,118);cout << x << endl;cout << y << endl;imshow("图像", img);waitKey();return 0;
}

代码

下面对像素的操作,使用的是动态地址计算方式。操作像素的方式还有其他两种:C语言指针访问像素,迭代器操作像素。

单通道图像遍历:


#include <opencv2/opencv.hpp>using namespace cv;int main(int argc, char** argv){Mat picture(200, 200, CV_8UC1);/*创建图像picture,默认为纯黑色(即每个点的像素值为0),大小为200 * 200,类型为CV_8UC1(是单通道图像)*/imshow("picture", picture);   //在“picture”窗口显示图像picture//遍历picture的每个像素点,并将所有像素点的值修改为150for (int i = 0; i < 200; i++){for (int j = 0; j < 200; j++)picture.at<uchar>(i, j) = 150;}imshow("dst", picture);//在“dst”窗口显示修改后的图像picturewaitKey(0);//等待用户按键return 0;}

运行结果:

彩色图像遍历:


#include <opencv2/opencv.hpp>using namespace cv;int main(int argc, char** argv){Mat picture(200, 200, CV_8UC3);//新建一个三通道彩色图像,初始默认为纯黑色imshow("picture", picture); //遍历picture的每个像素点,并将每个通道所有像素点的值修改为0~255中随机一个整数值for (int i = 0; i < 200; i++){for (int j = 0; j < 200; j++){picture.at<Vec3b>(i, j)[0] = rand() % 255;//B通道picture.at<Vec3b>(i, j)[1] = rand() % 255;//G通道picture.at<Vec3b>(i, j)[2] = rand() % 255;//R通道}}imshow("dst", picture);waitKey(0);return 0;}

运行效果:

参考:

https://blog.csdn.net/qq_36503007/article/details/79895610

OpenCV像素值读写之at()函数相关推荐

  1. Opencv像素值的存储及访问机制

    Opencv像素值的存储及访问机制 说明 一.像素值的存储 1.单通道和三通道的存储方式 (1)单通道 (2)三通道 2.Mat类的成员和函数 (1)成员变量 [1]列数cols [2]行数rows ...

  2. 【计算机视觉基础】MATLAB程序实现图像中两个像素点的8-邻域、欧几里得距离与出租车距离、互换两像素点的罗森菲尔德8-邻域像素值

    调用Matlab函数指令实现以下内容: 提取图像上某两点(x1,y1).(x2,y2)的8-邻域罗森菲尔德邻域并显示: 显示(x1,y1)与(x2,y2)两点间的图像像素变化情况: 比较并显示RGB图 ...

  3. MATLAB图像处理(三):获取图像像素值、改变像素值及像素数

    一.原理 图像由像素组成,imread 函数可读取图像每个像素的RGB值. RGB图的每个像素的像素值一般由三个变量r.g.b组成(0-255). 灰度图的每个像素的像素值一般只有一个值(0-255) ...

  4. OpenCV 读写图像、读写像素、修改像素值(案例:图像反处理)

    文章目录 读写图像 1. `imread` 可以指定加载为灰度或者RGB图像. 2. `imwrite` 保存图像文件,类型由扩展名决定. 读写像素 读一个GRAY像素点的像素值(CV_8UC1) 读 ...

  5. OpenCV图像处理学习四,像素的读写操作和图像反差函数操作

    一.读写图像 imread 可以指定加载为灰度或者RGB图像 Imwrite 保存图像文件,类型由扩展名决定 二.读写像素 读一个GRAY(灰度图)像素点的像素值(CV_8UC1) Scalar in ...

  6. OpenCV 学习笔记-day13 像素值统计 统计计算最大最小值,平均值和标准差 (minMaxLoc()和meanStdDev()函数的使用)

    OpenCV 学习笔记 day13 像素值统计 函数 minMaxLoc(); 最大值最小值统计 meanStdDev();平均值和标准方差统计 代码 day13 像素值统计 函数 minMaxLoc ...

  7. 【C++ Opencv】读写灰度图像,RGB图像的某个像素、修改像素值、图像取反(源码+API)

    1. 读写像素 (1)读一个灰度图像的某点像素值 Scalar intensity=img.at<uchar>(y,x); 或者Scalar intensity =img.at<uc ...

  8. Python+OpenCV 图像处理系列(4)—— 图像像素的读写、算术运算、逻辑运算及像素的统计

    1. 像素的读写 可以根据像素的行和列的坐标获取它的像素值.对 BGR 图像而言,返回值为 B,G,R 的值. img.shape 可以获取图像的形状.它的返回值是一个包含行数 h,列数 w,通道数 ...

  9. OpenCV学习笔记(四十一)——再看基础数据结构core OpenCV学习笔记(四十二)——Mat数据操作之普通青年、文艺青年、暴力青年 OpenCV学习笔记(四十三)——存取像素值操作汇总co

    OpenCV学习笔记(四十一)--再看基础数据结构core 记得我在OpenCV学习笔记(四)--新版本的数据结构core里面讲过新版本的数据结构了,可是我再看这部分的时候,我发现我当时实在是看得太马 ...

最新文章

  1. ISME:南土所梁玉婷组-不同气候条件下微生物代谢及残体介导施肥对土壤有机碳的影响...
  2. 转: HighCharts 详细使用及API文档说明
  3. .NET : 通过配置文件指定跟踪(trace)选项
  4. Cookie简介及JSP处理Cookie的方法(转)
  5. 草稿selenium显示等待
  6. python 矩阵类型转换_python中的矩阵运算
  7. 智能优化算法:原子轨道搜索算法-附代码
  8. dfema规则_DFMEA失效分析简介
  9. 新手必看:PS钢笔抠图教程
  10. java供应商管理系统项目简介,基于jsp的供应商管理系统-JavaEE实现供应商管理系统 - java项目源码...
  11. 学习java哪个网课最好_学习Java的最佳方法
  12. 数字时代的保险创新与升级 | 创新场景50
  13. Windows 10 微信双开或多开【PC端】
  14. 栈与堆的区别(内存分配与数据结构)
  15. 樱花未开(更新完毕)
  16. 数模美赛论文模板(笔记)
  17. linux课后作业答案第六章,第六章作业及答案
  18. matlab 白板,Paintshow(电子白板教学软件)
  19. 中国高校教师跌入“社会底层”?
  20. 机器学习算法——详细介绍 集成学习,以及什么是Bagging、随机森林、Boosting、XGBoost

热门文章

  1. docker部署python项目中pillow的字体文件解决
  2. SSM数据库账号密码加密
  3. 【maven实战】41-使用cargo-maven2-plugin实现自动化部署
  4. Centos7执行yum install *时出现“Peer‘s Certificate has expired.“
  5. 手机上怎么学习计算机,手机投屏到Win10电脑上怎么操作呢?-电脑自学网
  6. Qt收缩窗口动态效果
  7. 省市区三级联动html
  8. Mac专业音频后期制作软件:Davinci Resolve达芬奇17中文版
  9. 实现财务自由的四大准则与五项禁令
  10. Python代码写得丑怎么办?推荐几个神器拯救你