常言道“温故而知新”,写此文章就是对自己目前学习内容的小小的总结与记录。
本文力求用最简洁的语言,详细的代码将此部分内容讲解清楚,但由于博主同样是刚刚接触OpenCV,或许表达上有些瑕疵,还望读者能够指教探讨,大家共同进步。
博主机器配置为:VS2013+opencv2.4.13+Win-64bit。
若本文能给读者带来一点点启示与帮助,我就很开心了。
===========================分割线========================
颜色压缩(Color Reduction)最简单的理解就是减少表示图像的颜色数目,我们都知道,8位的3通道RGB真彩图像包括了1600多万(256×256×256=16777216)的颜色数目,其实在某些应用中用不到这么多数量,往往并不是将图像作为一个整体进行操作,而是对图像中的所有点或特殊点进行运算,所以遍历图像就显得很重要,如何高效的遍历图像是一个很值得探讨的问题。本节将介绍四种方法访问图像中的每个像素。
- 动态地址计算——配合.at<Vec3b>(i, j)[k]访问像素。
- 用指针来遍历图像——C操作符[]。
- 更高效的方法——isContinuous()函数。
- 迭代器——比较安全的方式。
=================================分割线===========================
图像矩阵如何存储在内存中
首先大致说明下图像数据如何在内存中存储。Mat是OpenCV2.x版本以上基本的图像类型,Mat可以视为一个矩阵,矩阵的大小依赖于该Mat是什么颜色空间(Color Space),比如最基本的灰度(Gray scale)或者RGB,CMYK,YCbCr等,因为这决定了该Mat具有多少个通道,一般来讲,灰度图像只有一个通道,而RGB图像具有三个通道。
对于灰度图像来讲,图像数据在内存中的存储如图所示:
对于灰度图像来讲,图像数据在内存中的存储如图所示: