数字图像处理其实就是处理二维矩阵数据。利用opencv来学习处理算法是一种比较好的方式。学习opencv,主要就是调用其中的图像处理函数来实现各种操作。如果要得到想要的处理结果,还需要对图像处理算法有一定的了解。同时,可能也有自己想写一些算法的冲动,并急切的想验证自己写的算法是否能够满足处理的要求。可是,真正到自己动手写的时候,总发现无从下手,比如,想得到图像中的ROI区域(感兴趣区域),想对图像做加减运算算,将两幅图像连接成一幅图像等等。如果要想随心所欲的按照自己的想法来操作一幅图像,则需要对opencv的mat数据操作非常熟练,建议初学者将这些基本的操作背下来,然后你会发现,你再进行这样的操作将是得心应手。

在opencv中对图像数据进行操作,我们可以简单的把mat数据看成一个二维数,里面存储的就是图像的数据,所以,对mat数组的操作就是在操作二维图像数据。下面我们来实现常见的Mat数据操作。

首先,在c++中新建一个空的控制台程序,然后,在属性管理器中添加我们之前设置好的opencv4.0配置文件,回到解决方案界面,选择源文件,右键添加新项目,然后得到一个空白的源文件,如图1和图2所示。

图1添加配置好的opencv配置文件

图2 添加空白的源文件

然后,就可以在这个空白的源文件中写代码了。下面用具体的代码来说明怎么操作mat数据。下面的代码都可以直接复制到自己的工程中直接运行如果涉及到要打开图像文件的,直接替换代码中的文件路径为自己电脑中的图像路径就可以了。

int main(int argc, char** argv){//构造3X3的Mat矩阵// CV_8UC1和CV_8UC3是数据类型和通道,指8位无符号单通道和3数据,通道数据Mat a(Size(3,3),CV_8UC1);Mat b = Mat(Size(3,3),CV_8UC3);cout<

图3 输出构造的mat数据

图3是上面代码输出的结果,a是单通道,b是三通道,所以b是3行9列。里面的具体的值是opencv随机自动给的,因为我们还没有对mat赋值,这个不用管。再来看几个操作,

Mat mz = Mat::zeros(Size(5,5),CV_8UC1);//构造5X5的全是0的mat数据

Mat mo = Mat::ones(Size(5,5),CV_8UC1);// 构造5X5的全是1的mat数据

Mat me = Mat::eye(Size(5,5),CV_8UC1); 构造5X5的单位矩阵的mat数据

上面的代码可以直接在上面的main函数里面接着往下写。图4是输出结果

图4 上面三行代码的输出结果

接着往下写。

Mat m1 = Mat::eye(Size(3,3),CV_32F);// CV_32F表示浮点数Mat m2 = Mat::ones(Size(3,3),CV_32F);Mat add = m1 + m2;//mat相加Mat sub = m1 –m2;//mat相减Mat mul1 = m1 * 2;//mat乘一个常数Mat mul2 = m1 + 2;//mat加一个常数Mat m1t = m1.t();//mat矩阵转置Mat meInv = mul2.inv();//mat矩阵的逆矩阵int nonZeroNum = countNonZero(m1);//统计mat中非0的个数

下面我们重新写一个main函数,不自己构造mat数据,直接从图像中得到。然后对图像数据的mat进行操作

int main(int argc, char** argv){Mat src1 = imread("E:1.bmp", 0);//0表示单通道,1表示3通道Mat src2 = imread("E:2.bmp", 0);Mat absSub;absdiff(src1, src2, absSub);//两图相减的绝对值namedWindow("absSub",0);imshow("absSub", absSub);Mat roiMat = src1(Range(0,3),Range(0,4));//取图像中的0到3行和0到4列cout<< roiMat <

图5 输出结果显示

上面包括了mat数据的主要操作命令,如果能够把这些命令记住了,要对图像做一般的操作基本上没有什么问题了。

此外,如果要访问图像中的每一个像素值,可以采用下面指针的方式,速度是最快的。下面的代码只是演示了怎么使用指针访问像素,没有什么特别的目的。

Mat dyImg = Mat(src1.rows, src1.cols,0);

for(int i=0;i

{

uchar* srcdata = src1.ptr(i);

uchar* dydata = dyImg.ptr(i);

for(int j=0;j< src1.cols;j++)

{

double tempValue = double(srcdata [j]) + 20.0;

if(tempValue < 0)

dydata[j] = 0;

else if(tempValue > 255)

dydata[j] = 255;

else

dydata[j] = tempValue;

}

}

namedWindow("dyImg ",0);

imshow("dyImg ", dyImg);

opencv获取mat的指针_数字图像处理之opencv中Mat数据操作相关推荐

  1. 8bit黑白图像的灰度值范围是_数字图像处理基本知识

    1.数字图像: 数字图像,又称为数码图像或数位图像,是二维图像用有限数字数值像素的表示.数字图像是由模拟图像数字化得到的.以像素为基本元素的.可以用数字计算机或数字电路存储和处理的图像. 2.数字图像 ...

  2. 数字图像处理:OpenCV直方图均衡算法研究及模拟实现

    一.引言 在<数字图像处理:直方图均衡(Histogram Equalization)的原理及处理介绍 >(链接:https://blog.csdn.net/LaoYuanPython/a ...

  3. matlab moveverage,MATLAB在数字图像处理课程教学中的应用

    ISSN1672-4305 CN12-1352/N 实 验 室 科 学 LABORATORY SC I ENCE 第14卷 第1期 2011年2月 Vol 14 N o 1 Feb 2011 MATL ...

  4. 数字图像处理:OpenCV-Python中的直方图均衡知识介绍及函数equalizeHist详解

    一.引言 在<数字图像处理:直方图均衡(Histogram Equalization)的原理及处理介绍 >(链接:https://blog.csdn.net/LaoYuanPython/a ...

  5. 图像处理边缘增强matlab,数字图像处理实验 matlab 图像增强 边缘检测 图像操作.doc...

    数字图像处理实验 matlab 图像增强 边缘检测 图像操作 实验1 点运算和直方图处理 实验目的 1. 掌握利用Matlab图像工具箱显示直方图的方法 2. 掌握运用点操作进行图像处理的基本原理. ...

  6. Python基础_第5章_Python中的数据序列

    Python基础_第5章_Python中的数据序列 文章目录 Python基础_第5章_Python中的数据序列 Python中的数据序列 一.字典--Python中的==查询==神器 1.为什么需要 ...

  7. c++gdal如何在大图像中截取小图像并获取其图像信息_【图像处理】OpenCV系列十 --- 边缘检测之Canny算子...

    上一篇我们学习了图像处理形态学相关知识点,相信大家学习之后已经对形态学有了足够的理解了,那么接下来,我们一起来学习一下图像处理中的边缘检测吧!我们将会重点学习边缘检测各种算子和滤波器 --- Cann ...

  8. python 图像分析自然纹理方向与粗细代码_数字图像处理与Python实现笔记之基础知识...

    数字图像处理与Python实现笔记之基础知识 摘要 绪论 1 数字图像处理基础知识 1.1 数字图像简介 1.1.1 数字图像处理的目的 1.1.2 数字图像处理的应用 1.1.3 数字图像处理的特点 ...

  9. winpcap基本原理及常见应用_数字图像处理原理及应用教学大纲

    课程基本信息 课程代码:080706E3S3004 学 分 数:3学分 学 时 数:48学时(讲课36,实验12) 课程类别:专业方向课.必修课 开课学期:6学期 主讲教师:陈天华 修订日期:2020 ...

最新文章

  1. 【c语言】扶老奶奶过街
  2. 我是如何把 Java 项目移植到 .NET 5.0 的
  3. 知名大学硕士生被通报,这件事千万别做!
  4. day27:三剑客之sed
  5. 产品总监的日常:管好团队必须先“正三观”
  6. Rust 学习笔记——智能指针
  7. java基础之枚举类
  8. epcs1s是epcs1系列的么_串行FLASH配置芯片(EPCS1或EPCS4)数据手册
  9. 502 java_502 Bad Gateway
  10. Pandas Query 方法深度总结
  11. vue的proxy代理
  12. [CF1421E]Swedish Heroes
  13. 温州医科大学计算机学院分数线,2017温州医科大学录取分数线
  14. 远程智能化灌溉系统 解决方案
  15. 诺贝尔经济学家的著作——值得读
  16. 计算机操作系统期末复习
  17. java part part_Java Nashorn--Part 5
  18. Educational Codeforces Round 87 (Rated for Div. 2) C1+C2(几何图形/找规律)
  19. 中小型网站运营者的基础运营思路
  20. 阿里云安装mysql

热门文章

  1. 【CUDA开发】 Check failed: error == cudaSuccess (8 vs. 0) invalid device function
  2. 请教各位 android activity之间切换的问题
  3. Linux Shell 之 我的第一个Shell程序
  4. 戏耍Transaction,多个连接的Transaction处理(非COM+)
  5. makefile之目标与依赖(1)
  6. 携程将推“3+2”工作模式:每周到岗3天,在家2天,你羡慕吗?
  7. 新手也能看懂的 SpringBoot 异步编程指南
  8. 前端Chrome调试技巧汇总
  9. mysql索引类型normal,unique,full text
  10. sap commit rollback