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

技术标签: OpenCV2  Mat类元素访问  

矩阵元素的表达:

对于单通道图像,其元素类型一般为 8U (即 8位无符号整数),当然也可以 是 16S 、32S、32F 等;这些类型可以直接用 uchar、short 、float等 C/C++语言中的基本数据类型表达。

如果多通道图像,如RGB彩色图像,需要用三个通道来表示。在这种情况 下,如果依然将图像视作一个二维矩阵那么矩阵的元素不再是基本数据类型。

opencv中使用vec可表示向量,用于矩阵元素的表达。

1、像素值的读写可使用at()函数:

          cv::Mat也是向量,可以使at方法取值,使用调用方法image.at<cv::Vec3b>(j,i),at方法方便,直接给i,j赋值就可以随意访问图像中任何一个像素,其中j表示第j行,i表示该行第i个像素。但是at方法效率是这3中访问方法中最慢的一个,所以如果遍历图像或者访问像素比较多时,建议不要使用这个方法,毕竟程序的效率还是比程序的可读性要重要的。

   如:

for (int j = 0; j< image.rows; j++)
{
	for (int i = 0; i< image.cols; i++)
	{
		image.at<cv::Vec3b>(j, i)[0] = image.at<cv::Vec3b>(j, i)[0] / div*div + div / 2;
		image.at<cv::Vec3b>(j, i)[1] = image.at<cv::Vec3b>(j, i)[1] / div*div + div / 2;
		image.at<cv::Vec3b>(j, i)[2] = image.at<cv::Vec3b>(j, i)[2] / div*div + div / 2;
	} // end of line                     
}

  

 

2、使用Mat的成员函数ptr< >( )

         cv::Mat中提供ptr函数访问任意一行像素的首地址,特别方便图像的一行一行的横向访问,如果需要一列一列的纵向访问图像,就稍微麻烦一点。但是ptr访问效率比较高,程序也比较安全,有越界判断。

如:

int nl = image.rows; //行数  
int nc = image.cols * image.channels();
for (int j = 0; j<nl; j++)
{
	uchar* data = image.ptr<uchar>(j);
	for (int i = 0; i<nc; i++)
	{
		data[i] = data[i] / div*div + div / 2;
	}
}

 

3、使用迭代器遍历图像

cv::Mat同样有标准模板库(STL),可以使用迭代器访问数据。

用迭代器来遍历图像像素,可简化过程降低出错的机会,比较安全,不过效率较低;如果想避免修改输入图像实例cv::Mat,可采用const_iterator。iterator有两种调用方法,cv::MatIterator_<cv::Vec3b>it;cv::Mat_<cv::Vec3b>::iterator it;中间cv::Vec3b是因为图像是彩色图像,3通道,cv::Vec3b可以代表一个像素。

如:

cv::Mat_<cv::Vec3b>::iterator it = image.begin<cv::Vec3b>();
cv::Mat_<cv::Vec3b>::iterator itend = image.end<cv::Vec3b>();
for (; it != itend; ++it)
{
	(*it)[0] = (*it)[0] / div*div + div / 2;
	(*it)[1] = (*it)[1] / div*div + div / 2;
	(*it)[2] = (*it)[2] / div*div + div / 2;
}

 

参考:https://blog.csdn.net/u011574296/article/details/70139563

           https://blog.csdn.net/xuhang0910/article/details/47058419 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/kou_ching/article/details/86732930

智能推荐

ASP.NET MVC 4 (十三) 基于表单的身份验证_weixin_30652897的博客-程序员秘密

在前面的章节中我们知道可以在MVC应用程序中使用[Authorize]特性来限制用户对某些网址(控制器/控制器方法)的访问,但这都是在对用户认证之后,而用户的认证则依然是使用ASP.NET平台的认证机制。ASP.NET提供Windows和Forms两种身份验证,前者主要用于Intranet上域环境内,后者则更多的应用于Internet,这里我们只讨论后者。先从最简单的例子开始,我们在web.c...

SpringCloud(十)zuul网关 路由url与service-id配置_f45056231p的博客-程序员秘密

SpringCloud(十)zuul网关 路由url与service-id配置2018年06月12日 00:16:22 徐海兴 阅读数:7859更多所属专栏: SpringCloud版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012326462/article/details/80659582在zuul中有两种路由配置:1...

Kafka中间件实战_去撒哈拉当海盗的博客-程序员秘密_kafka中间件

SpringBoot整合Kafka实战1.Kafka简介和应用2.Kafka相关概念3.SpringBoot2.x整合Kafka实战3.1Kafka和Zookeeper的本地安装和启动3.2新建SpringBoot项目并加载相关依赖3.3kafka相关属性配置3.4生产者框架搭建3.5消费者框架搭建3.5测试生产和消费流程1.Kafka简介和应用Apache Kafka是分布式发布-订阅消息系统。它最初由LinkedIn公司开发,之后成为Apache项目的一部分。Kafka是一种快速、可扩展的、设计内在

最快的PNG图像解码器!速度提升2.75倍,比老大哥“libpng”还安全_QbitAl的博客-程序员秘密

艳艳 发自 凹非寺量子位 报道 | 公众号 QbitAI提到PNG,大多数人都不会感到陌生。这种位图格式在图像领域使用频率仅次于JPEG。然而在“解码PNG”这件事上,23年来主流的工具是...

Linux_Chrome出现Adobe Flash Player is out of date解决方法_FlushHip的博客-程序员秘密

我只用过两个linux的发行版,Ubuntu和Centos。在安装Google的Chrome后都有出现Adobe Flash Player is out of date的问题。在网上也参考了很多方法,但是还是不行,最后自己想着它不是过期了吗,那我们给他安装一个新的就好了啊。  Chrome浏览器用的播放器插件是PepperFlashPlayer。而且是内置的。寻常的在命令行下安装的这个插件貌似起不到

随便推点

【记录】关于在64位win7下运行Virtualbox安装系统时出错(提示VBoxDD.DLL错误)的解决方案。_501007162021的博客-程序员秘密

原文地址:http://blog.sina.com.cn/s/blog_4dc988240102vj8a.html安装没有问题,安装了最新版VirtualBox-4.3.18-96516-Win,一点运行想安装系统时就出错。 这是提示的错误: 运行Virtualbox去安装系统时出错:Failed to open a session for the virtual machine,Unable

weinre 移动项目的远程调试_大圣非大圣的博客-程序员秘密

在项目开发中,尤其是移动端项目开发,部署到真机上之后,由于不同机型的适配或者兼容性的问题,而出现样式或者布局发生改变,甚至是功能出现问题。而谷歌或者火狐的模拟手机,也仅仅是模拟而已,与真机终究是不一样的。因此,如何在真机上查看我们的代码效果,就必须要远程调试了。而weinre作为简单易上手的移动端远程调试工具,诸位可以尝试一下。首先,(前提是你安装了node,如果没有,自行百度,此不赘

【PMP】项目管理中冲突考点的说明_心跳包的博客-程序员秘密

PMBOK中默认的项目组织是矩阵型组织,团队成员需要对项目经理负责,又要对职能经理负责,所以冲突是不可避免的。成功的冲突管理可提高生产力,改进工作关系。同时,如果管理得当,意见分歧有利于提高创造力和改进决策。所以,管理者不仅要解决组织中的冲突,更要刺激建设性的冲突,以促进组织目标的达成。冲突的来源进度计划项目的优先级资源技术意见执行情况的权衡行政程序上的冲突成本个人工作风格差异/个性影响冲...

java.lang.IllegalStateException: port: 8000 not available!_温酒暖良人的博客-程序员秘密

java.lang.IllegalStateException:端口:8000不可用!解决办法1.启动windows的命令窗口,按键盘上的windows+R,在输入框中输入cmd,启动命令窗口;2.输入netstat -ano然后回车,就可以看到系统当前所有的端口使用情况。3.通过命令查找某一特定端口,在命令窗口中输入命令中输入netstat -ano |findstr “端口号”,然后回车就可以看到这个端口被哪个应用占用。如 netstat -ano |findstr “8000”4.查看

CentOS+Nginx+PHP+MySQL详细配置_weixin_34406796的博客-程序员秘密

一、安装MySQL 目前web服务器已经很少有跑静态页面的,如果要跑动态网站那当然就离不开数据库,虽然在以前文章中有写MySQL是怎么安装的,但是感觉好久没装MySQL,现在只把步骤贴出来,就不做过多的讲解了#useradd mysql#tar zxvf mysql-5.0.40.tar.gz#cd mysql-5.0.40#....

2018年项目管理千人峰会--大咖云集,不容错过的干货_qq123yyy的博客-程序员秘密

互联网、物联网、区块链、大数据、人工智能飞速发展,世界正处于聚变之中。传统企业不断面临挑战,人才技能不断迭代。如何将传统优秀的方法体系与变化相融合成为企业与个人不断追求的契合。峰会议程会议:2018.12.15下午地址:长沙•茉莉花国际酒店电话:1827481539213:45~14:00 大会开幕,介绍大会及流程14:00~14:15 致欢迎词,专家介绍14:15~14:5...