图像像素的获取和操作(第三天)
图像处理顾名思义就是对图像的像素进行操作,这是核心基础!
有三种方法对图像的操作:(图像像素的获取参差在其中)
第一种:使用指针进行操作
这个指针在上一篇博文中已经提到,这节博文进行加深理解。
先讲解opencv的指针应用:
1 Mat image = cv::Mat(400, 600, CV_8UC3); //宽400,长600,3通道彩色图片 rows=400,cols=600 2 uchar * data000 = image.ptr<uchar>(0);//第一行第一个元素地址3 uchar * data100 = image.ptr<uchar>(1);//第二行第一个元素地址4 uchar * data001 = image.ptr<uchar>(0)[1];//第一行第二个元素地址5 uchar * data111 = image.ptr<uchar>(0)(1);//这个目的是想操作第一行第二个元素的地址,语法没错,但是操作的结果是错误的,具体看下面6 uchar * data7 Mat image = cv::Mat(400, 600, CV_8UC3); //宽400,长600,3通道彩色图片8 Vec3b * data000 = image.ptr<cv::Vec3b>(0);//9 Vec3b * data100 = image.ptr<cv::Vec3b>(1);//
10 Vec3b * data001 = image.ptr<cv::Vec3b>(0)[1];//第一行第二个像素
11 Vec3b * data001 = image.ptr<cv::Vec3b>(0)[1][0];//第一行第二个像素第一个通道
12 Vec3b * data
指针的实例(正确)
1 int main(int argc,char**argv)2 2 {3 3 Mat input_image = imread("9.jpg");4 4 //cvtColor(input_image, input_image, COLOR_BGR2GRAY);5 5 namedWindow("Sourse image");6 6 imshow("Sourse image", input_image);7 7 Mat output_image;8 8 int width = input_image.rows;9 9 int length = input_image.cols;
10 10 output_image.create(input_image.size(),input_image.type());
11 11 //-----------------指针操作--------------------//
12 12 for (int i = 0; i < width; i++)
13 13 {
14 14 uchar *in = input_image.ptr<uchar>(i);
15 15 uchar *out = output_image.ptr<uchar>(i);
16 16 for (int j = 0; j < length * input_image.channels(); j++)
17 17 {
18 18 out[j] = 255 - in[j];
19 23 }
20 24 }
21 25 namedWindow("Destinate image");
22 26 imshow("Destinate image",output_image);
23 27 waitKey(0);
24 28 return 0;
25 29 }
显示:
![](/assets/blank.gif)
指针的实例(错误)
1 int main(int argc,char**argv)2 {3 Mat input_image = imread("9.jpg");4 //cvtColor(input_image, input_image, COLOR_BGR2GRAY);5 namedWindow("Sourse image");6 imshow("Sourse image", input_image);7 Mat output_image;8 int width = input_image.rows;9 int length = input_image.cols;
10 output_image.create(input_image.size(),input_image.type());
11 //-----------------指针操作--------------------//
12 for (int i = 0; i < width; i++)
13 {
14 for (int j = 0; j < length * input_image.channels(); j++)
15 {
16 *(output_image.ptr<uchar>(i, j)) = saturate_cast<uchar>(255 - (*(input_image.ptr<uchar>(i, j))));//这段代码是有问题的操作
17 }
18 }
19 namedWindow("Destinate image");
20 imshow("Destinate image",output_image);
21 waitKey(0);
22 return 0;
23 }
显示:
![](/assets/blank.gif)
第二种是利用迭代器:
迭代器在C++里面经常用到,个人简单的理解就是指针的升级版,有指针的基本功能,并且比指针还好用。
这部分内容比较简单,有C++基础就看的懂,就不解释过多。
直接上代码:
注意:[]是一级优先级,*:是二级优先级,(*out)[0]:这里一定得加括号!!!
1 Mat_<Vec3b>::iterator in = input_image.begin<Vec3b>();2 Mat_<Vec3b>::iterator out = output_image.begin<Vec3b>();3 while (in != input_image.end<Vec3b>())4 {5 (*out)[0] = saturate_cast<uchar>(255 - (*in)[0]);6 (*out)[1] = saturate_cast<uchar>(255 - (*in)[1]);7 (*out)[2] = saturate_cast<uchar>(255 - (*in)[2]);8 ++out;9 ++in;
10 }
图片显示和上面一样了。
第三种是Mat自带的at函数:
从下面可以看出,上面指针的错误在这里可以运用,一般操作图像用at,用的熟练就用指针。当然指针的速度肯定最快的
1 for (int i = 0; i < width; i++)2 {3 4 for (int j = 0; j < length; j++)5 {6 if (input_image.channels() == 3) {7 output_image.at<Vec3b>(i, j)[0] = saturate_cast<uchar>(255-input_image.at<Vec3b>(i,j)[0]);8 output_image.at<Vec3b>(i, j)[1] = saturate_cast<uchar>(255-input_image.at<Vec3b>(i,j)[1]);9 output_image.at<Vec3b>(i, j)[2] = saturate_cast<uchar>(255-input_image.at<Vec3b>(i,j)[2]);
10 }
11 else {
12 output_image.at<uchar>(i, j) = saturate_cast<uchar>(255-input_image.at<uchar>(i, j));
13 }
14 }
15 }
其实还有很多种方法,在网上看到一篇博文说有十种方法,等到我用十种方法的时候我应该成大神了。哈哈
本博文参考《opencv3编程入门》、51CTO的教程、http://blog.csdn.net/github_35160620/article/details/51708659
图像像素的获取和操作(第三天)相关推荐
- c#图像处理入门(-bitmap类和图像像素值获取方法)
c#图像处理入门 -bitmap类和图像像素值获取方法 一.Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义 ...
- C#中的bitmap类和图像像素值获取方法
private void button1_Click_1(object sender, EventArgs e) { // 画直线 //Bitmap bitM ...
- 【opencv学习笔记】003之图像像素基本操作(获取像素指针、范围处理)及掩膜操作(filter2D)详解
目录 一.前言 二.图像像素基本操作 1.获取图像像素指针 1.获取图像像素指针是什么? 2.相应API 3.获取目的 2.像素范围处理saturate_cast 1.像素范围处理是什么? 2.像素范 ...
- OpenCV(一)图像读取与新建、图像显示、操作图像像素(2种涂色并比较算法优劣、输出RGB)
目录 一.读取图像与新建图像 1.读取图像 2.新建图像 二.显示图像 1.过程 2.代码 3.运行效果 三.操作图像像素 1.逐RGB涂色(单循环)(快) 1-1.过程 2-2.代码 2-3.运行结 ...
- HTML5 Canvas操作图像像素
操作图像像素 如果要对图像进行进一步的处理,就可以先通过getImageData()方法获取图像像素,进行处理后再通过putImageData()方法,把处理后的像素重新绘制到画布中. 1)getIm ...
- OpenCV-图像像素遍历操作的三种方法对比(程序提速)
作者:Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 场景需求 使用OpenCV,避免不了的就是对图像像素进行操作,遍历操作更是家常便饭,当图像数据不多时, ...
- opencv学习记录——(5)图像像素的操作
1.先补充几点opencv的相关知识点 1.1 通过Scalar来设置颜色 Scalar(b1, b2, b3, b4),前面的三个参数是依次设置BGR的,和RGB相反,第四个参数设置图片的透明度. ...
- android都图片mat_计算机视觉 OpenCV Android | Mat像素操作(图像像素的读写、均值方差、算术、逻辑等运算、权重叠加、归一化等操作)...
本文目录 1. 像素读写 2. 图像通道与均值方差计算 3. 算术操作与调整图像的亮度和对比度 4. 基于权重的图像叠加 5. Mat的其他各种像素操作 1. 像素读写 Mat作为图像容器,其数据部分 ...
- 【opencv学习笔记】005之读像素(获取像素)及写像素(修改像素、空白图像、分割图像)
目录 一.前言 二.图像像素操作 1.读像素 2.写像素 三.全部代码及结果展示 1.代码 2.运行效果图 一.前言 欠下的总是要还的,继续给大家更新有关于OpenCV的教程,我也不知道能不能保证每天 ...
最新文章
- Flash Player漏洞利用Exploiting Flash Reliably
- Linux 虚拟化网络技术 — 物理网卡的虚拟化(MACVLAN 和 MACVTAP)
- AdventureWorksDW 2019还原图解
- 迪普科技以近50%份额全面中标国家电网2016信息化硬件采购
- android定时循环,Android AlarmManager实现定时循环后台任务
- 程序挂起时自动创建转储文件
- TokenInsight:反映区块链行业整体表现的TI指数较昨日同期上涨0.41%
- php curl上传文件$_FILES为空问题
- pythonsuper多重继承_解决python super()调用多重继承函数的问题
- 学画画软件app推荐_学画漫画的APP有哪些?2018动漫绘画学习软件推荐
- 并行计算,网格计算与分布式计算的…
- EDraw 亿图图示设计软件 一款好用的绘制网络拓扑图的软件
- 抖音书单号如何快速上热门
- 网易游戏实习——BI研究员
- 批处理--删除当前目录及子目录中的空文件夹或文件
- 计算机考研自我介绍大概多少字,1分钟自我介绍多少字
- Data Whale第20期组队学习 Pandas学习—第一次综合练习
- 通信网络与IP网络知识梳理
- eMMC介绍及硬件电路设计
- 豪赚83亿,长城汽车还在渴望一场新能源“狂飙”
热门文章
- smarty模板引擎的整理
- matlab西西,MATLAB常用操作大全
- php验证固定电话,php验证手机号_php中固定电话号码和手机号码正则表达式验证...
- 2018年计算机基础知识答案,最全全国计算机基础知识试题及答案考级宝典(2018)...
- 华为机试-----集五福作为近年来大家喜闻乐见迎新春活动,集合爱国福、富强福、和谐福、友善福、敬业福即可分享超大红包
- Manjaro语言改回英文
- 【PMSM控制】电流环带宽
- Auto.js 如何把图片和脚本一起打包,或者打包多个脚本
- 华为荣耀3X 八大优势
- Mysql 开启慢日志