Index 目录索引

  • 写在前面
  • 先修知识
  • 使用at()函数访问像素值
  • 使用Mat的成员函数ptr< >( )访问像素值
  • 案例演示
  • 参考文章

写在前面

做CV领域的小伙伴,想必都要跟图像像素的运算打交道,本文将介绍几种访问图像像素的方法,并用一个简单的例子进行演示。


先修知识

CV_8U is unsigned 8bit/pixel - ie a pixel can have values 0-255, this is the normal range for most image and video formats.

CV_32F is float - the pixel can have any value between 0-1.0, this is useful for some sets of calculations on data - but it has to be converted into 8bits to save or display by multiplying each pixel by 255.

CV_32S is a signed 32bit integer value for each pixel - again useful of you are doing integer maths on the pixels, but again needs converting into 8bits to save or display. This is trickier since you need to decide how to convert the much larger range of possible values (+/- 2billion!) into 0-255.


一般使用的灰度图像元素是8位的uchar型(注意不是无符号整型,而是无符号字符型。元素值0~255),自定义Mat矩阵时,推荐使用8位无符号字符型,即CV_8U、CV_8UC31


一般的图像文件格式使用的是 Unsigned 8bits,CvMat矩阵对应的参数类型就是
CV_8UC1,CV_8UC2,CV_8UC3。
(最后的1、2、3表示通道数,譬如RGB3通道就用CV_8UC3)

而float 是32位的,对应CvMat数据结构参数就是:CV_32FC1,CV_32FC2,CV_32FC3…
double是64bits,对应CvMat数据结构参数:CV_64FC1,CV_64FC2,CV_64FC3等。


使用at()函数访问像素值

使用cv::Mat定义的图像是向量,可以使用at方法取值,使用调用方法image.at<cv::Vec3b>(i,j),at方法方便,直接给i、j赋值就可以随意访问图像中任何一个像素,其中i表示第i行,j表示该行第j个像素。

但是at方法效率是这几种访问方法中最慢的一个,所以如果遍历图像或者访问像素比较多时,不建议使用这个方法,毕竟程序的效率还是比程序的可读性要重要的2


使用Mat的成员函数ptr< >( )访问像素值

该方法使用到指针cv::Mat中提供ptr函数访问任意一行像素的首地址,特别方便图像一行一行地横向访问。

ptr访问效率比较高,程序也比较安全,有越界判断。


案例演示

下面用一个例子来对这几种访问图像像素值的方法进行演示,本例子将演示图像的像素值置为全黑、置为全白以及灰度化处理,代码如下:

#include<opencv2/opencv.hpp>int main() {cv::Mat image = cv::imread("./opencv_logo.png");
// 对三通道图像进行各个像素的访问
#if 0for (int i = 0; i < image.rows; i++) {for (int j = 0; j < image.cols; j++) {for (int n = 0; n < image.channels(); n++) {image.at<cv::Vec3b>(i, j)[n] = 155;}}}cv::imwrite("./logo_after.png", image);
#endif#if 0// 对单通道图像进行各个像素的访问cv::Mat image_gray;cv::cvtColor(image, image_gray, cv::COLOR_BGR2GRAY);cv::imwrite("./logo_gray.png", image_gray);for (int i = 0; i < image_gray.rows; i++) {for (int j = 0; j < image_gray.cols; j++) {image_gray.at<uchar>(i, j) = 0;}}cv::imwrite("./logo_gray_after.png", image_gray);#endif#if 0
//通过指针访问来修改图像的像素值for (int i = 0; i < image.rows; i++) {uchar *data = image.ptr<uchar>(i);      //ptr函数访问任意一行像素的首地址,特别方便图像地一行一行的横向访问for (int j = 0; j < image.cols*image.channels(); j++) {    // //在循环体内,应该避免多次运算,应该提前算cols*channelsdata[j] = 255;}}cv::imwrite("./logo_ptr_white.png", image);
#endif#if 1// 案例二,使用指针将彩色图转为灰度图cv::Mat grayImage = cv::Mat(image.rows, image.cols, CV_8U);     // 生成和原图image大小相同的空白灰度图像for (int i = 0; i < image.rows; i++) {// 指针,用来获取每一行的首地址cv::Vec3b *p = image.ptr<cv::Vec3b>(i);       // p 指向地址, *p指向内容uchar *p2 = grayImage.ptr<uchar>(i);for (int j = 0; j < image.cols; j++) {// 每次迭代获取图像列的地址cv::Vec3b &pix = *p++;                  // pix 指向内容, &pix 指向地址uchar &pix2 = *p2++;pix2 = pix[0] * 0.114 + pix[1] * 0.587 + pix[2] * 0.299;      // pix[0] 对应B通道,pix[1]对应G通道,pix[2]对应R通道  Gray = R*0.299 + G*0.587 + B*0.114}}cv::imwrite("./logo_ptr_gray.png", grayImage);#endifreturn 0;
}


写到这里,差不多本文也就要结束了,如有错误,敬请指正。如果我的这篇文章帮助到了你,那我也会感到很高兴,一个人能走多远,在于与谁同行


参考文章


  1. Mat中的元素类型(如CV_8U)、范围、获取、格式转换
    ↩︎

  2. OpenCV2学习(10)之Mat类对象元素的获取与赋值_kou_ching的博客-程序员秘密
    ↩︎

C++常用的图像像素值读写的方法相关推荐

  1. android都图片mat_计算机视觉 OpenCV Android | Mat像素操作(图像像素的读写、均值方差、算术、逻辑等运算、权重叠加、归一化等操作)...

    本文目录 1. 像素读写 2. 图像通道与均值方差计算 3. 算术操作与调整图像的亮度和对比度 4. 基于权重的图像叠加 5. Mat的其他各种像素操作 1. 像素读写 Mat作为图像容器,其数据部分 ...

  2. c#图像处理入门(-bitmap类和图像像素值获取方法)

    c#图像处理入门 -bitmap类和图像像素值获取方法 一.Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义 ...

  3. Dicom 图像--像素值(灰度值)转为CT值

    摘要: 1. 概念: 2. 公式: 3. 具体情况: 4. DICOM TAG分类和说明 1. 概念: 数据:Dicom数据的原始像素值(pixel value)是没有实际意义的,所以我们常用的是Di ...

  4. VTK修炼之道19:图像基本操作_图像像素值的访问与修改

    1.直接访问图像像素(索引法) #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL);#include <vtkS ...

  5. matlab显示像素分布,MATLAb-----7--------如何动态显示鼠标的坐标值和图像像素值

    MATLAB如何动态显示鼠标的坐标值和图像像素值 http://apps.hi.baidu.com/share/user/41caedc2bda36d61746c6162330a (1)fix(x) ...

  6. 【转】DICOM图像像素值(灰度值)转换为CT值

    转自:https://www.cnblogs.com/xuhui24/p/6193032.html            https://zhuanlan.zhihu.com/p/358770379 ...

  7. 【转】DICOM图像像素值、灰度值与CT值!!!!!

    转自:https://blog.csdn.net/syz201558503103/article/details/107238940 做医学图像处理会涉及DICOM图像,初学者应该要对图像像素有一定了 ...

  8. DICOM图像像素值(灰度值)转换为CT值

    CT值的单位是Hounsfield,简称为Hu,范围是-1024-3071.用于衡量人体组织对X射线的吸收率,设定水的吸收率为0Hu. 在DICOM图像读取的过程中,我们会发现图像的像素值有可能不是这 ...

  9. Dicom 图像像素值(灰度值)转为CT值

    CT值的单位是Hounsfield,简称为Hu,范围是-1024-3071.用于衡量人体组织对X射线的吸收率,设定水的吸收率为0Hu. 在DICOM图像读取的过程中,我们会发现图像的像素值有可能不是这 ...

  10. opencv创建图像,图像像素值处理、生成单通道图像和生成tif图像方法的整理

    就是做个小笔记,后面要查方便 1.创建设定尺寸图象 import numpy as np """h,w,c分别代表图像的高.宽和通道数""" ...

最新文章

  1. 字符串算法--KMP--Java实现
  2. myeclipse中git的使用
  3. 更改mssql数据库的名字
  4. [zz]zookeeper的配置项
  5. iframe js 加载失败_如何提高Vue项目首页的加载速度
  6. Inside Dynamics Axapta源代码赏析(四)
  7. 滑动窗口--单调队列
  8. JSTL与JAVA数据交互 pagecontext
  9. Shell 常用积累
  10. MediaPlayer/MediaRecorder与AudioTrack/AudioRecord区别(三十九)
  11. C语言 - 数组作为参数传递给函数(按值传递和按引用传递)
  12. 软件测试体系学习及构建(20)测试专项丨易用性测试
  13. wps开机启动无法禁用问题
  14. Word2016任意页开始设置页码
  15. 打开qq相册回收站一直显示服务器忙,qq照片回收站怎么打不开 手机qq回收站进不去怎么办...
  16. 不错的javascript极品日历
  17. script什么意思中文翻译成,script中文是什么意思
  18. python程序弹出输入框_Python弹出输入框并获取输入值的实例
  19. cwd命令linux,PCMan's FTP Server 'CWD'命令缓冲区溢出漏洞
  20. 动态规划------求解决策过程中最优化的数学方法

热门文章

  1. 用JavaScript制作一个贷款计算器(注:附带详细注释)
  2. 无模拟电路基础如何看TTL电路
  3. java开发pc端和移动端的区别,移动端和PC端的区别
  4. Flotherm 2021热仿真分析基础到高级视频教程
  5. Python剑指offer之两个栈实现一个队列-两个队列实现一个栈
  6. dateutil 日期计算_时间工具——DateUtil
  7. Windows jdk下载与安装
  8. mysql回显_SQL回显
  9. pyhon下实现通过身份证获取归属地的方法
  10. 计算机数字合成音乐,数字音乐合成原理