OpenCV学习笔记(七):访问图像中像素的三类方法
该文章参考毛星云著《OpenCV3编程入门》,电子工业出版社。
图像是以像素为单位储存的,访问图像中的每个像素是处理图像的基础,一般有三种访问图像像素的方法:
方法一:指针访问:C操作符[ ]
方法二:迭代器iterator
方法三:动态地址计算
下面直接上代码,代码的目的是减少图像的颜色种类数,即减少颜色的细分。
- #include<opencv2/opencv.hpp>
- #include<iostream>
- using namespace cv;
- using namespace std;
- void colorreduce(Mat& inputImage, Mat& outputImage, int div);
- int main()
- {
- Mat srcimage = imread("1.jpg");
- imshow("srcimage", srcimage);
- Mat dstimage;
- dstimage.create(srcimage.rows, srcimage.cols, srcimage.type());
- double time0 = static_cast<double>(getTickCount());
- colorreduce(srcimage, dstimage, 32);
- time0 = ((double)getTickCount() - time0) / getTickFrequency();
- cout << "Time = " << time0 << "seconds" << endl;
- imshow("dstimage", dstimage);
- waitKey(0);
- }
- void colorreduce(Mat & inputImage, Mat & outputImage, int div)
- {
- //方法一:使用指针
- outputImage = inputImage.clone();
- int rowNumber = outputImage.rows;
- int colNumber = outputImage.cols * outputImage.channels(); //每一行元素的个数
- for (int i = 0; i < rowNumber; i++)
- {
- uchar* data = outputImage.ptr<uchar>(i); //获取行地址
- for (int j = 0; j < colNumber; j++)
- {
- data[j] = data[j] / div*div + div / 2;
- }
- //*data++ = *data / div*div + div / 2; //所有方法中最快的
- }
- /*
- //方法二:迭代器
- outputImage = inputImage.clone();
- Mat_<Vec3b>::iterator it = outputImage.begin<Vec3b>();
- Mat_<Vec3b>::iterator itend = outputImage.end<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;
- }
- */
- /*
- //方法三:动态地址计算
- outputImage = inputImage.clone();
- int rowNumber = outputImage.rows;
- int colNumber = outputImage.cols;
- for (int i = 0; i < rowNumber; i++)
- {
- for (int j = 0; j < colNumber; j++)
- {
- outputImage.at<Vec3b>(i, j)[0] = outputImage.at<Vec3b>(i, j)[0] / div*div + div / 2;
- outputImage.at<Vec3b>(i, j)[1] = outputImage.at<Vec3b>(i, j)[1] / div*div + div / 2;
- outputImage.at<Vec3b>(i, j)[2] = outputImage.at<Vec3b>(i, j)[2] / div*div + div / 2;
- }
- }
- */
- }
程序运行的效果如下:
从结果上看,减小颜色种类后,图像变得更模糊了。
在程序中,需要注意的是colorreduce函数的形参是Mat&,而不是Mat,这是C++的知识,因为需要传入函数的图片在主函数中也发生变化,即函数外部的数据随函数内部的操作而变化。
OpenCV学习笔记(七):访问图像中像素的三类方法相关推荐
- OpenCV学习笔记(二):3种常用访问图像中像素的方式
OpenCV学习笔记(二):3种常用访问图像中像素的方式 #include <opencv2/opencv.hpp>using namespace cv; using namespace ...
- 【opencv学习笔记】第五篇:访问图像中像素的三种方式、ROI区域图像叠加和图像混合
1. 访问图像中像素的三种方式 任何图像处理算法,都是从操作每个像素开始的.在OpenCV中,提供了三种访问每个像素的方法. 方法1:指针访问:C操作符[] 方法2:迭代器iterator 方法3:动 ...
- opencv计算图像亮度调节_【opencv学习笔记七】访问图像中的像素与图像亮度对比度调整...
今天我们来看一下如何访问图像的像素,以及如何改变图像的亮度与对比度. 在之前我们先来看一下图像矩阵数据的排列方式.我们以一个简单的矩阵来说明: 对单通道图像排列如下: 对于双通道图像排列如下: 那么对 ...
- opencv学习笔记11:图像滤波(均值,方框,高斯,中值)
为什么要使用滤波 消除图像中的噪声成分叫作图像的平滑化或滤波操作.信号或图像的能量大部分集中在幅度谱的低频和中频段是很常见的,而在较高频段,感兴趣的信息经常被噪声淹没.因此一个能降低高频成分幅度的滤波 ...
- OpenCV学习笔记(七)——图像梯度及边缘检测
图像梯度计算的是图像变化的速度.对于图像的边缘部分,其灰度值变化较大,梯度值也较大:相反,对于图像中比较平滑的部分,其灰度值变化较小,相应的梯度值也较小.一般情况下,图像梯度计算的是图像的边缘信息. ...
- opencv 手选roi区域_【opencv学习笔记六】图像的ROI区域选择与复制
图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...
- opencv学习笔记19:图像金字塔和图像拉普拉斯金字塔 (用于图像放大和缩小)
图像金字塔原理 图像金字塔:只不同分辨率,不同尺寸子图构成的集合. 取样 向下取样:有一个图像G0,对它重新采样,得到分辨率小些的G1,以此类推. 向上取样:有一个图像G3,然后变成像素更多的G2,以 ...
- opencv学习笔记7:图像加法与图像融合
图像加法 1.使用Numpy加法 运算方式:结果=图像1+图像2 原理:图像数据格式为unit8 8位二进制表示范围是0到255. 二进制相加 1.不超过255的,如100+58=158 2.两数相加 ...
- [转载] opencv学习笔记7:图像加法与图像融合
参考链接: python opencv 基础 4: addWeighted() 融合两张图像 图像加法 1.使用Numpy加法 运算方式:结果=图像1+图像2 原理:图像数据格式为unit8 8位二进 ...
最新文章
- SuSE下VNCVIEWER没有出现界面,只有shell窗口的问题
- mysql 移植 azure_初码-Azure系列-记一次MySQL数据库向Azure的迁移
- PHP-fpm 优化问题
- 极致的线上产品设计与终极数据分析工具,两者缺一不可(下)
- 为什么我们总是喜欢选择差不多的价格
- stacktraces_Stacktraces告诉了事实。 但事实并非如此。
- Android之jni入门
- input禁止鼠标滚轮改变数值
- Python网络编程——使用TCP方式传输文件
- nmealib linux编译,nmealib的使用可以缩短GPS的开发周期
- 【同124】LeetCode 543. Diameter of Binary Tree
- Java-BufferReader中的readLine()方法
- MogileFS原理
- c3p0连接池配置连接不上mysql_数据库连接池之c3p0的配置 + 问题解决方案
- hs8346v5联通 说明书_中兴Memo V5S说明书
- 多重序列比对 CLUSTALX
- Freeswitch的Proxy(代理转发)模式和Bypass(旁路)模式的正确配置
- python爬高德地图_【爬虫】Java关于高德地图爬取数据
- 创业者的心得:心有菩提手有刀,欲成舍利却成妖(转)
- 软件工程专业的论文答辩_2015软件工程硕士论文答辩流程
热门文章
- boost::shared_lock相关的测试程序
- boost::sort模块实现spreadsort 64 位整数排序示例
- boost::heap模块实现可变堆的测试程序
- boost::hana::transform用法的测试程序
- boost::iterator_property_map用法的测试程序
- boost::core::has_single_bit的测试
- ITK:将像素缓冲区导入到图像中
- VTK:Utilities之ColorTransferFunction
- VTK:图片之ImageMathematics
- OpenGL 纹理坐标的实例