1.Mat矩阵数值的存储方式

这里以指针的方式访问图像素为例

(1)单通道

定义一个单通道图像:

   cv::Mat img_1 = (320, 640, CV_8UC1, Scalar(0));

对于单通道M(i,j)即为第i行j列的其灰度值;程序中表示为:

 img_1.ptr<uchar>(i)[j];

(2)多通道

这里以RGB图像为例,每一个子列依次为B、G、R,,第一个分量是蓝色,第二个是绿色,第三个是红色。

定义一个3通道BGR图像:

  cv::Mat img_1 = (320, 640, CV_8UC3, Scalar(0, 0 ,0));

对于多通道M(i,j*3)即为第i行j列的B通道其灰度值,M(i,j*3+1) 即为第i行j列的G通道其灰度值,M(i,j*3+1) 即为第i行j列的B通     道其灰度值;程序中表示为:

第i行j列的B通道其灰度值:

    img_1.ptr<uchar>(i)[j*3];

第i行j列的G通道其灰度值:

 img_1.ptr<uchar>(i)[j*3+1];

第i行j列的R通道其灰度值:

 img_1.ptr<uchar>(i)[j*3+2];

2.示例程序,以三种方法(指针,at,迭代器)

获得图像像素值#include <iostream>#include <vector>#include <algorithm>#include <opencv2/core/core.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/opencv.hpp>using namespace std;using namespace cv;void get_setImagePixel3(char *imagePath, int x, int y){Mat image = imread(imagePath, 1);//得宽高int w = image.cols;int h = image.rows;int channels = image.channels();if (channels == 1){//得到初始位置的迭代器 Mat_<uchar>::iterator it = image.begin<uchar>();//得到终止位置的迭代器 Mat_<uchar>::iterator itend = image.end<uchar>();int pixel = *(it + y * w + x);cout << "灰度图像,处的灰度值为" << pixel << endl;}else{//得到初始位置的迭代器 Mat_<Vec3b>::iterator it = image.begin<Vec3b>();//得到终止位置的迭代器 Mat_<Vec3b>::iterator itend = image.end<Vec3b>();//读取it = it + y * w + x;int b = (*it)[0];cout << b << endl;int g = (*it)[1];cout << g << endl;int r = (*it)[2];cout << r << endl;//设置像素值(*it)[0] = 255;(*it)[1] = 255;(*it)[2] = 255;}imshow("cc", image);}int main(){vector<int> v = {1,2,3,4,6};cout << "*********通过指针访问像素的灰度值********************"  << endl;//通过指针访问像素的灰度值//单通道Mat img1(20, 30, CV_32FC1, Scalar(0));img1.ptr<float>(19)[25] = 23456.1789;cout << "img(19,25):" << img1.ptr<float>(19)[25] <<endl;//多通道,创建一个B、G、R通道灰度值为0的图像,图像大小20*30,每个灰度值为16位无符号2进制表示Mat img2(20, 30, CV_16UC3, Scalar(0, 0, 0));cout << "img(1,2):" << int(img1.ptr<uchar>(19)[25]) << endl;Mat img = imread("test1.jpg");int numRow = img.rows;int numCol = img.cols;int numCol_channel = img.cols*img.channels();cout << "numRow:" << numRow << endl;cout << "numCol:" << numCol << endl;cout << "numCol_channel:" << numCol_channel << endl;cout << "45行,483列B通道灰度值" << int(img.ptr<uchar>(45)[483*3]) << endl;cout << "45行,483列G通道灰度值" << int(img.ptr<uchar>(45)[483*3+1]) << endl;cout << "45行,483列R通道灰度值" << int(img.ptr<uchar>(45)[483*3+2]) << endl;Mat img_B(numRow, numCol, CV_8UC3, Scalar(0, 0, 0));Mat img_G(numRow, numCol, CV_8UC3, Scalar(0, 0, 0));Mat img_R(numRow, numCol, CV_8UC3, Scalar(0, 0, 0));for (int i = 0; i < numRow; i++){for (int j = 0; j < numCol; j++){img_B.ptr<uchar>(i)[j*3] = img.ptr<uchar>(i)[j*3];img_G.ptr<uchar>(i)[j*3+1] = img.ptr<uchar>(i)[j*3+1];img_R.ptr<uchar>(i)[j*3+2] = img.ptr<uchar>(i)[j*3+2];}}imshow("img", img);imshow("img_B", img_B);imshow("img_G", img_G);imshow("img_R", img_R);cout << endl;cout << endl;cout << endl;cout << "*********at只适合灰度值为8位的图像********************" << endl;//注意:at只适合灰度值为8位的图像//单通道Mat img3(20, 30, CV_8UC1, Scalar(0));cout << "img(7,8)" << int(img3.at<uchar>(7, 8)) << endl;//多通道Mat img4(20, 30, CV_8UC3, Scalar(0));//BGR通道cout << "B通道灰度值" << int(img4.at<Vec3b>(3, 4)[0]) << endl;cout << "G通道灰度值" << int(img4.at<Vec3b>(3, 4)[1]) << endl;cout << "R通道灰度值" << int(img4.at<Vec3b>(3, 4)[2]) << endl;waitKey(0);system("pause");return 0;}

OpenCV访问像素点的灰度值相关推荐

  1. opencv读取图像的灰度值并显示出来

    通过双层循环,遍历所有的像素值,再输出灰度值即可.图片太大,所有只选择20行和20列进行输出. 昨天要用到图片的灰度值,脑子突然短路了,忘了存储灰度图的数组,存放的就是图片的灰度值,还以为要用什么函数 ...

  2. 用MATLAB怎么获取任意像素点的灰度值

    用MATLAB怎么获取任意像素点的灰度值 这两天跑代码遇到一个问题,想要根据图像的灰度值进行阈值分割,通过学习,总结以下两种方法来对任意像素点的灰度值. 方法一 1.首先取得你想要的点的坐标,通过gi ...

  3. OpenCV(7)--设置图片像素点的灰度值

    GitHub@ShaneHolmes_OpenCV_image_itemset 知识基础: 图像处理 一幅图像由若干个像素点组成,每个像素用BGR三种颜色表示,强度值均是0-255.在OpenCV中, ...

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

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

  5. 如何将一幅图像中灰度值为80的像素点的灰度值改成90(并行实现)

    # -*- coding: utf-8 -*- import numpy as npdef eighty_to_ninty(img):"""把图像中80像素的位置转成90 ...

  6. OpenCV+python:图像二值化

    1,图像二值化概念及方法 一个像素点的颜色是由RGB三个值来表现的,所以一个像素点矩阵对应三个颜色向量矩阵,分别是R矩阵,G矩阵,B矩阵,它们也都是同样大小的矩阵. 在图像处理中,用RGB三个分量(R ...

  7. 用python怎么样实现图像二值化_使用Python+OpenCV如何实现图像二值化

    使用Python+OpenCV如何实现图像二值化 发布时间:2020-10-26 14:15:52 来源:亿速云 阅读:77 作者:蛋片鸡 这篇文章运用简单易懂的例子给大家介绍使用Python+Ope ...

  8. 机器视觉中的像素、分辨率、灰度值等概念

    Sensor的感光原理是通过一个一个的感光点对光进行采样和量化,但在Sensor中,每一个感光点只能感光RGB三基色中的一种颜色(这个颜色可以理解为像素的一个颜色分量,并不是最终的图像显示的颜色,最终 ...

  9. cv mat 灰度值和_访问OpenCV中灰度图像的像素值

    我只是想让我的概念清楚 - 访问cv :: Mat的所有矩阵元素意味着我实际上访问图像的所有像素值(灰度 - 1通道和颜色 - 3通道)? 就像我的代码打印加载的1通道图像的灰度矩阵的值和类型CV_3 ...

最新文章

  1. VB6 通过winsock控件数组实现客户端和服务器多对一通信
  2. Python Tornado
  3. 2018.08.02 hdu1558 Segment set(并查集+计算几何)
  4. IDEA对tomcat远程debug
  5. 相同布局在不同手机上显示不同_React Native布局详细指南
  6. PDF免费转word方法
  7. Linux下PHP开启Oracle支持(oci8)
  8. java读取properties配置文件路径
  9. MySQL安全你不知道的事
  10. 命令修改本地计算机策略,命令行修改本地组策略_通过命令行从Windows进行本地组管理...
  11. 安装office,错误1706。安装程序找不到所需文件。请检查网络连接或CD-ROM驱动器。
  12. vue emoji编辑器
  13. 昔者,圣人之作易也,幽赞神明而生蓍
  14. CSS3动画实现左右滚动效果
  15. 李力刚:职场上如何成功推销自己
  16. scheme语言编写运行
  17. java中curr是什么意思_curr.是什么意思
  18. Spring5学习笔记------4、JdbcTemplate
  19. [AV1] AV1 Reference Software
  20. .考试倒计时43天!来提分啦!

热门文章

  1. 订阅号微信公众号历史文章爬虫php,一步步教你怎么打造微信公众号历史文章爬虫...
  2. go语音protobuf_golang 使用 protobuf 的教程
  3. python list存储对象_python List 对象
  4. idea springboot 发布webservice 发布服务_阿里云发布 Spring Boot 新脚手架,真香
  5. php 删除数组的空元素,php删除数组空元素的方法_后端开发
  6. java按钮改变窗口大小_布局似乎有问题,JButton在调整窗口大小时显示出意外的行为。...
  7. HDMI视频光端机传输故障如何调试?
  8. 工业级光纤收发器如何正确使用和维护?
  9. 【渝粤教育】广东开放大学 文化田野调查 形成性考核 (22)
  10. 【渝粤教育】广东开放大学 嵌入式数据库 形成性考核 (48)