查找表的优势是不需要进行计算,只需要读取结果。逐像素浏览图像,主要有三种方法。
在彩色图像中,每一列都有三个uchar项。在OpenCV中用Vec3b表示。用[ ]操作符就可以获取第n个子列。重要的是要记住OpenCV迭代器遍历列并自动跳到下一行。因此,对于彩色图像,如果您使用一个简单的uchar迭代器,您将只能访问蓝色通道值。
1、高效方法
①在性能方面,您无法击败经典的 C 样式运算符[ ](指针)访问。因此,我们可以推荐的最有效的分配方法是使用指向Mat数据部分的指针:
我们基本上只是获取一个指向每行开头的指针,并遍历它直到它结束。在矩阵以连续方式存储的特殊情况下,我们只需要请求一次指针并一直到最后。需要注意彩色图像:有三个通道,因此需要在每行中传递三倍以上的项目。
②Mat 对象的数据成员返回指向第一行、第一列的指针。如果此指针为 null,则该对象中没有有效的输入,这是检查图像加载是否成功的最简单方法。如果存储是连续的,我们可以使用它来遍历整个数据指针。如果是灰度图像:
2、迭代器(安全)方法:确保您通过适当数量的 uchar 字段并跳过行之间可能发生的间隙是您的责任。使用迭代器方法,您需要做的就是询问图像矩阵的开始和结束,然后增加开始迭代器,直到到达终点。要获取迭代器指向的值,请使用 * 运算符
3、使用at方法或者Mat_类型:好处是可以随机访问你指定的数据
at方法还支持我们传入cv::Point类型的参数,例如at<uchar>(cv::Point2f(16, 18))。
4、OpenCV提供了修改图像值的功能,无需编写图像的扫描逻辑。我们使用核心模块的 cv::LUT()函数
其中I为输入图像,J为输出图像
5、时间计算
速度对比
方法 | 时间(毫秒) |
高效方法 | 79.4717 |
迭代器 | 83.7201 |
at | 93.7878 |
LUT | 32.5759 |
源链接:OpenCV: How to scan images, lookup tables and time measurement with OpenCV