如何使用 OpenCV 扫描图像、查找表和时间测量(二)

本文探讨了在OpenCV中使用动态地址计算和引用返回进行图像处理,比较了不同的访问方法如LUT函数、迭代器和指针,强调了LUT函数的高性能以及在不同模式下的性能差异和安全特性。
摘要由CSDN通过智能技术生成

动态地址计算和引用返回

不建议使用最后一种方法进行扫描。它是为了获取或修改图像中的随机元素而制作的。它的基本用途是指定要访问的项的行号和列号。在我们早期的扫描方法中,您已经注意到,我们通过哪种类型查看图像很重要。这里没有什么不同,因为您需要手动指定在自动查找时使用的类型。在以下源代码的灰度图像中,您可以观察到这一点(+ cv::Mat::at() 函数的使用):

Mat& ScanImageAndReduceRandomAccess(Mat& I, const uchar* const table)

{

​ 仅接受 char 类型矩阵

CV_Assert(I.depth() == CV_8U);

​ const int 通道 = I.channels();

​ switch(通道)

​ {

​ 案例一:

​ {

​ for( int i = 0; i < I.rows; ++i)

​ for( int j = 0; j < I.cols; ++j )

I.at<uchar>(i,j) = table[I.at<uchar>(i,j)];

​ 破;

​ }

​ 案例3:

​ {

Mat_ _I = 我;

​ for( int i = 0; i < I.rows; ++i)

​ for( int j = 0; j < I.cols; ++j )

​ {

_I(i,j)[0] = table[_I(i,j)[0]];

_I(i,j)[1] = table[_I(i,j)[1]];

_I(i,j)[2] = table[_I(i,j)[2]];

​ }

我 = _I;

​ 破;

​ }

​ }

​ 返回我;

}

该函数采用您的输入类型和坐标,并计算查询项的地址。然后返回对该引用的引用。当您获取该值时,这可能是一个常量,而在设置该值时,这可能是一个非常量。作为调试模式下的安全步骤*,将检查输入坐标是否有效且确实存在。如果不是这种情况,您将在标准错误输出流上收到一条很好的输出消息。与发布模式下的有效方法相比,使用它的唯一区别是,对于图像的每个元素,您将获得一个新的行指针,用于我们使用 C 运算符 [] 来获取列元素。

如果需要使用此方法对图像进行多次查找,则为每个访问输入类型和 at 关键字可能会很麻烦且耗时。为了解决这个问题,OpenCV 有一个 cv::Mat_ 数据类型。它与 Mat 相同,但需要额外的需求,即在定义时,您需要通过查看数据矩阵来指定数据类型,但是作为回报,您可以使用 operator() 来快速访问项目。为了让事情变得更好,这很容易从通常的 cv::Mat 数据类型转换。在上面函数的彩色图像的情况下,您可以看到它的示例用法。不过,需要注意的是,可以使用 cv::Mat::at 函数完成相同的操作(具有相同的运行时速度)。这只是为懒惰的程序员技巧编写的少一些内容。

核心功能

这是在图像中实现查找表修改的一种奖励方法。在图像处理中,通常希望将所有给定的图像值修改为其他值。OpenCV提供了修改图像值的功能,无需编写图像的扫描逻辑。我们使用核心模块的 cv::LUT() 函数。首先,我们构建一个 Mat 类型的查找表:

垫子 lookUpTable(1, 256, CV_8U);

uchar* p = lookUpTable.ptr();

​ for( int i = 0; i < 256; ++i)

p[i] = 表[i];

最后调用函数(I 是我们的输入图像,J 是输出图像):

LUT(I, lookUpTable, J);

性能差异

为获得最佳效果,请编译程序并自行运行。为了更清楚地说明差异,我使用了一张相当大的 (2560 X 1600) 图像。此处介绍的性能适用于彩色图像。为了获得更准确的值,我将从函数调用中获得的值平均了一百次。

方法时间
高效方式79.4717 毫秒
迭 代83.7201 毫秒
即时 RA93.7878 毫秒
LUT 函数32.5759 毫秒

我们可以得出几点结论。如果可能的话,使用 OpenCV 已经制作的函数(而不是重新发明这些函数)。最快的方法是 LUT 函数。这是因为 OpenCV 库是通过英特尔线程构建模块实现多线程的。但是,如果您需要编写简单的图像扫描,则首选指针方法。迭代器是一个更安全的选择,但速度要慢得多。在调试模式下,使用动态引用访问方法进行完整映像扫描的成本最高。在发布模式下,它可能会击败迭代器方法,但肯定会为此牺牲迭代器的安全特性。

在线教程

请添加图片描述

人工智能书籍

第一阶段:零基础入门(3-6个月)

新手应首先通过少而精的学习,看到全景图,建立大局观。 通过完成小实验,建立信心,才能避免“从入门到放弃”的尴尬。因此,第一阶段只推荐4本最必要的书(而且这些书到了第二、三阶段也能继续用),入门以后,在后续学习中再“哪里不会补哪里”即可。

第二阶段:基础进阶(3-6个月)

熟读《机器学习算法的数学解析与Python实现》并动手实践后,你已经对机器学习有了基本的了解,不再是小白了。这时可以开始触类旁通,学习热门技术,加强实践水平。在深入学习的同时,也可以探索自己感兴趣的方向,为求职面试打好基础。

第三阶段:工作应用

这一阶段你已经不再需要引导,只需要一些推荐书目。如果你从入门时就确认了未来的工作方向,可以在第二阶段就提前阅读相关入门书籍(对应“商业落地五大方向”中的前两本),然后再“哪里不会补哪里”。

有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

在这里插入图片描述

  • 33
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值