【OpenCV】OpenCV访问像素点的三种方式
环境配置
VS2013+OpenCV3.0+Win7(X64)
前言
OpenCV是图像处理最常用的库之一。它提供了许多常用的图像处理算法相关的函数,极大地方便了图像处理方法的开发,而图像处理最本质的就是对图像中像素点的像素值的运算。所以我们需要了解一下OpenCV如何访问图像中的像素点。首先说明一下,这里默认图像储存为Mat格式,RGB类型。
三种访问方式
1. 利用指针访问
通过调用函数 Mat::ptr(i) 来得到第i行的首地址地址,然后在行内访问像素;
for (int i = 0; i < Row; i++)
{ for (int j = 0; j < Col; j++){ Scr.ptr<Vec3b>(i)[j][0] = 0;
}
}
上面的Vec3b指的是3通道的uchar类型的数据。i,j表示像素点在图像中的位置,而[0]表示通道编号,因为是3通道的数据,所以[0]表示RGB中的蓝色通道(因为在OpenCV中通道的顺序是BGR)。
2. 利用迭代器访问
创建一个Mat::Iterator对象it,通过it=Mat::begin()来的到迭代首地址,递增迭代器知道it==Mat::end()结束迭代;
while (it != Scr.end<Vec3b>())
{//(*it)[0] = 0;//蓝色通道置零;(*it)[1] = 0;//绿色通道置零;//(*it)[2] = 0;//红色通道置零;it++;
}
3. 动态访问
这种方法是最慢的一种方法,但是比较好理解,使用at函数来得到像素,Mat::at(i,j)为一个像素点的像素值数组,是一个大小为3的数组。从0到2存放了BGR三种颜色的灰度值。
for (int i = 0; i < Row; i++)
{for (int j = 0; j < Col; j++){Scr.at<Vec3b>(i, j)[2] = 0;}
}
运算结果
代码
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>using namespace std;
using namespace cv;void main()
{Mat Scr = imread("lena.jpg");if (Scr.empty() ){printf("%s\n", "读入图片失败;");system("pause");return;}imshow("原始图像", Scr);int Row = Scr.rows; //获取行数目;int Col = Scr.cols; //获取列数目;int Channel = Scr.channels(); //获取通道数目;Mat Array(3, 3, CV_8UC3, Scalar(2, 3, 240));cout << "Array=" <<endl<< Array<<endl;//指针的访问for (int i = 0; i < Row; i++){ for (int j = 0; j < Col; j++){ Scr.ptr<Vec3b>(i)[j][0] = 0;}}//迭代器访问,访问的是每一个像素点Mat_<Vec3b>::iterator it = Scr.begin<Vec3b>();while (it != Scr.end<Vec3b>()){//(*it)[0] = 0;//蓝色通道置零;(*it)[1] = 0;//绿色通道置零;//(*it)[2] = 0;//红色通道置零;it++;}//动态访问,访问的是每一个像素点,最慢也是最直接易理解的访问方式for (int i = 0; i < Row; i++){for (int j = 0; j < Col; j++){Scr.at<Vec3b>(i, j)[2] = 0;}}imshow("改变后的图像", Scr);waitKey(0);system("pause");return;
}
已完。。
【OpenCV】OpenCV访问像素点的三种方式相关推荐
- Struts2访问Servlet的三种方式
Struts2访问Servlet的三种方式 基本介绍 在Struts2中,Action并没有直接和Servlet API耦合.虽然Struts2 中的Action访问Servlet API麻烦一些,但 ...
- 视频解码opencv、ffmpeg、decord三种方式速度对比
在做视频理解和视频相关的项目都绕不开视频解码的过程,本文对比了三种视频解码的方法,仅供参考. # -*- coding: utf-8 -*- # @Time : 2020年9月30日16:01:40 ...
- Python使用opencv实现图片定位第三种方式
# -*- encoding=utf-8 -*- __author__ = 'Jeff.xie'#这个方法识别度更高,比cv2.matchTemplate更好, #cv2.matchTemplate无 ...
- bash shell脚本访问PostgreSQL的三种方式
bash脚本里有三种方式访问PostgreSQL数据库 但前提是要设置密码文件.当然对于有系统对应账户的数据库角色可以绕过密码登录环节,如 1 $ sudo -u postgres psql 或 1 ...
- COS中访问文件的三种方式
1.通过FID来访问文件(比如EF,DF) 2.通过SFI来访问文件(有些COS命令可以通过SFI来快速访问文件,而不需要事先选中文件) 3.通过文件名来访问文件(只能是DF文件) 转载于:https ...
- 安装web服务器访问站点的三种方式,Web服务器配置方法
您可能感兴趣的话题: 服务器配置 核心提示:本教程为大家介绍web服务器的配置方法. Web服务器概述 Web服务器又称为WWW服务器,它是放置一般网站的服务器.一台Web服务器上可以建立多个网站,各 ...
- 实现内网映射的三种方式:
实现内网映射的三种方式: 1.ngrok. 1)下载ngrok 下载地址:https://ngrok.com/download 选择合适的版本下载,我下载的是win64为的是这样: 2)解压下载下 ...
- 【opencv学习笔记】第五篇:访问图像中像素的三种方式、ROI区域图像叠加和图像混合
1. 访问图像中像素的三种方式 任何图像处理算法,都是从操作每个像素开始的.在OpenCV中,提供了三种访问每个像素的方法. 方法1:指针访问:C操作符[] 方法2:迭代器iterator 方法3:动 ...
- OpenCV像素点邻域遍历效率比较,以及访问像素点的几种方法
OpenCV像素点邻域遍历效率比较,以及访问像素点的几种方法 前言: 以前笔者在项目中经常使用到OpenCV的算法,而大部分OpenCV的算法都需要进行遍历操作,而且很多遍历操作都是需要对目标像素点的 ...
最新文章
- Google Mock(Gmock)简单使用和源码分析——源码分析
- 如何从值获取C#枚举描述? [重复]
- gx works2 存储器空间或桌面堆栈不足_保证安全的移动空间,超高安全品质的私家车推荐...
- 题目1103:二次方程计算器
- Objective-C语法之Object对象的那些事儿(五)
- Ethernet/IP 学习笔记一
- C语言数组元素总和最大的连续子序列的算法(附完整源码)
- [翻译]你或许还未听说过的一些ASP.NET 2.0要诀
- Java中继承、this关键字、super关键字
- 模块目录下site.php,使用apache配置为每个站点指定PHP包含目录
- BigDecimal用法介绍
- 谷歌 Nest 和 Fitbit 漏洞奖励翻番
- Intel的AVX2指令集解读
- git命令——git commit
- jmeter笔记02
- lua-获取当前时间
- 洛谷 P2879 [USACO07JAN]区间统计Tallest Cow
- 深入剖析线程同步工具CountDownLatch原理
- 实时Javascript开发框架Clouda、Meteor、Firebase对比
- Windows照片查看器无法显示此图片,因为计算机上的可用内存可能不足的最好解决办法。
热门文章
- Windows Azure奇趣应用之Swingify
- 《老子》中国古代先秦诸子百家经典欣赏
- Node跨域cors模块,nodejs+express跨域
- Docker实战部署JavaWeb项目-基于SpringBoot
- #苹果maccmsv10# redis memcached 缓存的若干问题解决
- C语言 判断两个字符串大小相等关系
- 「mac版」支持flash的浏览器,谷歌浏览器Chrome、火狐浏览器Firefox
- 【Day09】JavaScript 为什么要区分微任务和宏任务
- 《高性能mysql》读书笔记一
- 修改webpack配置,在react中使用less