一、 图像在内存中存储方式

图像矩阵的大小取决于我们所用的颜色模型,确切地说,取决于所用通道数。如果是灰度图像,矩阵就会像这样:

而对多通道图像来说,矩阵中的列会包含多个子列,其子列个数与通道数相等。例如,RGB颜色模型的矩阵:

注意到,子列的通道顺序是反过来的:BGR而不是RGB。很多情况下,因为内存足够大,可实现连续存储,因此,图像中的各行就能一行一行地连接起来,形成一个长行。连续存储有助于提升图像扫描速度,我们可以使用 isContinuous() 来去判断矩阵是否是连续存储的. 相关示例会在接下来的内容中提供。

二、扫描图像几种方式

2.1 指针访问

/*!* \brief scanImagePtr* \param image* \return*/
Mat& scanImagePtr(Mat &image){double start = static_cast<double>(getTickCount());//! 行int rowNumber = image.rows;//! 每一行元素个数 = 列数 x 通道数int colNumber = image.cols * image.channels();for (int i = 0; i < rowNumber; i++){//! 获取第i行的首地址uchar* data = image.ptr<uchar>(i);for (int j = 0; j < colNumber; j++){data[j] /= 2;}}double end = static_cast<double>(getTickCount());double time = (end - start) / getTickFrequency();cout << "type1:" << time << "s" << endl;return image;
}

2.2 迭代器iterator

/*!* \brief scanImageiterator* \param image* \return*/
Mat& scanImageiterator(Mat &image){double start = static_cast<double>(getTickCount());//! 初始位置的迭代器Mat_<Vec3b>::iterator it = image.begin<Vec3b>();//! 终止位置的迭代器Mat_<Vec3b>::iterator itend = image.end<Vec3b>();for (; it != itend; it++){//! 处理BGR三个通道(*it)[0] = 255;//B//(*it)[1] = 255;//G//(*it)[2] = 0;//R}double end = static_cast<double>(getTickCount());double time = (end - start) / getTickFrequency();//计算时间cout << "type2:" << time << "s" << endl;return image;
}

2.3 动态地址计算

/*!* \brief scanImageAt* \param image* \return*/
Mat& scanImageAt(Mat &image){double start = static_cast<double>(getTickCount());int rowNumber = image.rows;int colNumber = image.cols;for (int i = 0; i < rowNumber; i++)for (int j = 0; j < colNumber; j++){//! 处理BGR三个通道//image.at<Vec3b>(i, j)[0] = 0;//Bimage.at<Vec3b>(i, j)[1] = 255;//G//image.at<Vec3b>(i, j)[2] = 0;//R}double end = static_cast<double>(getTickCount());double time = (end - start) / getTickFrequency();//计算时间cout << "type3:" << time << "s" << endl;return image;
}

2.4 三种方法效能对比

type1:0.000189559s
type2:0.000832323s
type3:0.000424337s

经典的C风格运算符[](指针)访问要更胜一筹。

代码详见《OpenCV扫描图像三种方式练习》

三、OpenCv坐标系

OpenCV中坐标体系中的零点坐标定义为图片的左上角,X轴为图像矩形的上面那条水平线,从左往右;Y轴为图像矩形左边的那条垂直线,从上往下。在Point(x,y)和Rect(x,y)中,第一个参数x代表的是元素所在图像的列数,第二个参数y代表的是元素所在图像的行数,而在at(x,y)中是相反的。

参考资料:

  • OpenCV坐标系与操作像素的四种方法
  • OpenCV如何扫描图像、利用查找表和计时
  • Opencv中三种操作像素的方法

OpenCV学习笔记之扫描图像相关推荐

  1. OPENCV学习笔记2-5_扫描图像并访问相邻像素

    To illustrate this recipe, we will apply a processing function that sharpens an image(锐化图像的处理函数). Th ...

  2. opencv学习笔记20:图像轮廓

    图像轮廓 Contours:轮廓 轮廓是将没有连着一起的边缘连着一起. 边缘检测检测出边缘,边缘有些未连接在一起. 注意问题 1.对象为二值图像,首先进行阈值分割或者边缘检测. 2.查找轮廓需要更改原 ...

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

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

  4. opencv学习笔记14:图像礼帽,图像黑帽

    python + OpenCV 图像礼帽 图像礼帽 也叫图像顶帽 礼帽图像=原始图像-开运算图像 得到噪声图像 开运算:先腐蚀再膨胀 使用对象:二值图像 使用方法:morphologyEx cv2.M ...

  5. opencv学习笔记12:图像腐蚀和图像膨胀

    语言:python+opencv 为什么使用图像腐蚀和图像膨胀 如图,使用图像腐蚀进行去噪,但是为压缩噪声. 对腐蚀过的图像,进行膨胀处理,可以去除噪声,并保持原样形状. 图像腐蚀 腐蚀主要针对的是二 ...

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

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

  7. opencv 学习笔记9:图像缩放与图像翻转

    图像缩放 缩放包括缩小和放大 语法格式 cv2.resize()有很多参数,其中src和dsize必备 cv2.resize(src.dsize) src原始图像路径 dsize 目标图像大小 (列, ...

  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. socket与TcpListener/TcpClient/UdpClient 的区别及联系
  2. docker安装redis提示没有日记写入权限_Docker 学习笔记(第六集:使用 Dockerfile 定制镜像)...
  3. 关于SQL查询效率,100w数据,查询只要1秒
  4. python flask解决上传下载的问题
  5. Leetcode 77.组合
  6. inmemory_通过Spring Boot了解H2 InMemory数据库
  7. 如何通过Windows Server 2008 R2建立NFS存储
  8. Delta3d框架学习--程序启动过程详解
  9. 计算机系统-电路设计04-全加器的内部电路实现
  10. UE4之cmd调用函数
  11. Scanner、String(java基础知识十二)
  12. Ubuntu Desktop 变为 Ubuntu Server 服务器版的方法
  13. 小h的数列 //差分前缀和的应用(好好看好好学(包括我自己))
  14. 计算机桌面如何分区,展示电脑如何分区
  15. Iptables 指南
  16. Unix网络编程-同步
  17. matlab更改类型,matlab数据类型和转换
  18. 编写宠物dog类python_Python编程:创建和使用类
  19. Dev C++环境中使用OpenGL
  20. OpenStack虚拟云桌面在携程呼叫中心的应用

热门文章

  1. boost::units::information相关的测试程序
  2. boost::local_time模块实现打印本地日期时间的测试程序
  3. boost::gregorian模块实现月末日的测试程序
  4. GDCM:gdcm::PDFCodec的测试程序
  5. boost::core模块实现np地址
  6. VTK:可视化算法之PineRootDecimation
  7. OpenCV移植各向异性图像分割间隙流体的实例(附完整代码)
  8. OpenCV微笑探测器smile detector的实例(附完整代码)
  9. OpenGL 变换Transformations
  10. QT的QGLShaderProgram类的使用