该文章参考毛星云著《OpenCV3编程入门》,电子工业出版社。

图像是以像素为单位储存的,访问图像中的每个像素是处理图像的基础,一般有三种访问图像像素的方法:

方法一:指针访问:C操作符[ ]

方法二:迭代器iterator

方法三:动态地址计算

下面直接上代码,代码的目的是减少图像的颜色种类数,即减少颜色的细分。

[cpp] view plaincopy
  1. #include<opencv2/opencv.hpp>
  2. #include<iostream>
  3. using namespace cv;
  4. using namespace std;
  5. void colorreduce(Mat& inputImage, Mat& outputImage, int div);
  6. int main()
  7. {
  8. Mat srcimage = imread("1.jpg");
  9. imshow("srcimage", srcimage);
  10. Mat dstimage;
  11. dstimage.create(srcimage.rows, srcimage.cols, srcimage.type());
  12. double time0 = static_cast<double>(getTickCount());
  13. colorreduce(srcimage, dstimage, 32);
  14. time0 = ((double)getTickCount() - time0) / getTickFrequency();
  15. cout << "Time = " << time0 << "seconds" << endl;
  16. imshow("dstimage", dstimage);
  17. waitKey(0);
  18. }
  19. void colorreduce(Mat & inputImage, Mat & outputImage, int div)
  20. {
  21. //方法一:使用指针
  22. outputImage = inputImage.clone();
  23. int rowNumber = outputImage.rows;
  24. int colNumber = outputImage.cols * outputImage.channels(); //每一行元素的个数
  25. for (int i = 0; i < rowNumber; i++)
  26. {
  27. uchar* data = outputImage.ptr<uchar>(i); //获取行地址
  28. for (int j = 0; j < colNumber; j++)
  29. {
  30. data[j] = data[j] / div*div + div / 2;
  31. }
  32. //*data++ = *data / div*div + div / 2; //所有方法中最快的
  33. }
  34. /*
  35. //方法二:迭代器
  36. outputImage = inputImage.clone();
  37. Mat_<Vec3b>::iterator it = outputImage.begin<Vec3b>();
  38. Mat_<Vec3b>::iterator itend = outputImage.end<Vec3b>();
  39. for (; it != itend; ++it)
  40. {
  41. (*it)[0] = (*it)[0] / div*div + div / 2;
  42. (*it)[1] = (*it)[1] / div*div + div / 2;
  43. (*it)[2] = (*it)[2] / div*div + div / 2;
  44. }
  45. */
  46. /*
  47. //方法三:动态地址计算
  48. outputImage = inputImage.clone();
  49. int rowNumber = outputImage.rows;
  50. int colNumber = outputImage.cols;
  51. for (int i = 0; i < rowNumber; i++)
  52. {
  53. for (int j = 0; j < colNumber; j++)
  54. {
  55. outputImage.at<Vec3b>(i, j)[0] = outputImage.at<Vec3b>(i, j)[0] / div*div + div / 2;
  56. outputImage.at<Vec3b>(i, j)[1] = outputImage.at<Vec3b>(i, j)[1] / div*div + div / 2;
  57. outputImage.at<Vec3b>(i, j)[2] = outputImage.at<Vec3b>(i, j)[2] / div*div + div / 2;
  58. }
  59. }
  60. */
  61. }

程序运行的效果如下:

从结果上看,减小颜色种类后,图像变得更模糊了。

在程序中,需要注意的是colorreduce函数的形参是Mat&,而不是Mat,这是C++的知识,因为需要传入函数的图片在主函数中也发生变化,即函数外部的数据随函数内部的操作而变化。

版权声明:本文为博主原创文章,未经博主允许不得用于商业转载。 https://blog.csdn.net/wangxuwen2/article/details/52091827

OpenCV学习笔记(七):访问图像中像素的三类方法相关推荐

  1. OpenCV学习笔记(二):3种常用访问图像中像素的方式

    OpenCV学习笔记(二):3种常用访问图像中像素的方式 #include <opencv2/opencv.hpp>using namespace cv; using namespace ...

  2. 【opencv学习笔记】第五篇:访问图像中像素的三种方式、ROI区域图像叠加和图像混合

    1. 访问图像中像素的三种方式 任何图像处理算法,都是从操作每个像素开始的.在OpenCV中,提供了三种访问每个像素的方法. 方法1:指针访问:C操作符[] 方法2:迭代器iterator 方法3:动 ...

  3. opencv计算图像亮度调节_【opencv学习笔记七】访问图像中的像素与图像亮度对比度调整...

    今天我们来看一下如何访问图像的像素,以及如何改变图像的亮度与对比度. 在之前我们先来看一下图像矩阵数据的排列方式.我们以一个简单的矩阵来说明: 对单通道图像排列如下: 对于双通道图像排列如下: 那么对 ...

  4. opencv学习笔记11:图像滤波(均值,方框,高斯,中值)

    为什么要使用滤波 消除图像中的噪声成分叫作图像的平滑化或滤波操作.信号或图像的能量大部分集中在幅度谱的低频和中频段是很常见的,而在较高频段,感兴趣的信息经常被噪声淹没.因此一个能降低高频成分幅度的滤波 ...

  5. OpenCV学习笔记(七)——图像梯度及边缘检测

    图像梯度计算的是图像变化的速度.对于图像的边缘部分,其灰度值变化较大,梯度值也较大:相反,对于图像中比较平滑的部分,其灰度值变化较小,相应的梯度值也较小.一般情况下,图像梯度计算的是图像的边缘信息. ...

  6. opencv 手选roi区域_【opencv学习笔记六】图像的ROI区域选择与复制

    图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...

  7. opencv学习笔记19:图像金字塔和图像拉普拉斯金字塔 (用于图像放大和缩小)

    图像金字塔原理 图像金字塔:只不同分辨率,不同尺寸子图构成的集合. 取样 向下取样:有一个图像G0,对它重新采样,得到分辨率小些的G1,以此类推. 向上取样:有一个图像G3,然后变成像素更多的G2,以 ...

  8. opencv学习笔记7:图像加法与图像融合

    图像加法 1.使用Numpy加法 运算方式:结果=图像1+图像2 原理:图像数据格式为unit8 8位二进制表示范围是0到255. 二进制相加 1.不超过255的,如100+58=158 2.两数相加 ...

  9. [转载] opencv学习笔记7:图像加法与图像融合

    参考链接: python opencv 基础 4: addWeighted() 融合两张图像 图像加法 1.使用Numpy加法 运算方式:结果=图像1+图像2 原理:图像数据格式为unit8 8位二进 ...

最新文章

  1. SuSE下VNCVIEWER没有出现界面,只有shell窗口的问题
  2. mysql 移植 azure_初码-Azure系列-记一次MySQL数据库向Azure的迁移
  3. PHP-fpm 优化问题
  4. 极致的线上产品设计与终极数据分析工具,两者缺一不可(下)
  5. 为什么我们总是喜欢选择差不多的价格
  6. stacktraces_Stacktraces告诉了事实。 但事实并非如此。
  7. Android之jni入门
  8. input禁止鼠标滚轮改变数值
  9. Python网络编程——使用TCP方式传输文件
  10. nmealib linux编译,nmealib的使用可以缩短GPS的开发周期
  11. 【同124】LeetCode 543. Diameter of Binary Tree
  12. Java-BufferReader中的readLine()方法
  13. MogileFS原理
  14. c3p0连接池配置连接不上mysql_数据库连接池之c3p0的配置 + 问题解决方案
  15. hs8346v5联通 说明书_中兴Memo V5S说明书
  16. 多重序列比对 CLUSTALX
  17. Freeswitch的Proxy(代理转发)模式和Bypass(旁路)模式的正确配置
  18. python爬高德地图_【爬虫】Java关于高德地图爬取数据
  19. 创业者的心得:心有菩提手有刀,欲成舍利却成妖(转)
  20. 软件工程专业的论文答辩_2015软件工程硕士论文答辩流程

热门文章

  1. boost::shared_lock相关的测试程序
  2. boost::sort模块实现spreadsort 64 位整数排序示例
  3. boost::heap模块实现可变堆的测试程序
  4. boost::hana::transform用法的测试程序
  5. boost::iterator_property_map用法的测试程序
  6. boost::core::has_single_bit的测试
  7. ITK:将像素缓冲区导入到图像中
  8. VTK:Utilities之ColorTransferFunction
  9. VTK:图片之ImageMathematics
  10. OpenGL 纹理坐标的实例