动态地址计算和引用返回
不建议使用最后一种方法进行扫描。它是为了获取或修改图像中的随机元素而制作的。它的基本用途是指定要访问的项的行号和列号。在我们早期的扫描方法中,您已经注意到,我们通过哪种类型查看图像很重要。这里没有什么不同,因为您需要手动指定在自动查找时使用的类型。在以下源代码的灰度图像中,您可以观察到这一点(+ 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 毫秒 |
即时 RA | 93.7878 毫秒 |
LUT 函数 | 32.5759 毫秒 |
我们可以得出几点结论。如果可能的话,使用 OpenCV 已经制作的函数(而不是重新发明这些函数)。最快的方法是 LUT 函数。这是因为 OpenCV 库是通过英特尔线程构建模块实现多线程的。但是,如果您需要编写简单的图像扫描,则首选指针方法。迭代器是一个更安全的选择,但速度要慢得多。在调试模式下,使用动态引用访问方法进行完整映像扫描的成本最高。在发布模式下,它可能会击败迭代器方法,但肯定会为此牺牲迭代器的安全特性。
在线教程
- 麻省理工学院人工智能视频教程 – 麻省理工人工智能课程
- 人工智能入门 – 人工智能基础学习。Peter Norvig举办的课程
- EdX 人工智能 – 此课程讲授人工智能计算机系统设计的基本概念和技术。
- 人工智能中的计划 – 计划是人工智能系统的基础部分之一。在这个课程中,你将会学习到让机器人执行一系列动作所需要的基本算法。
- 机器人人工智能 – 这个课程将会教授你实现人工智能的基本方法,包括:概率推算,计划和搜索,本地化,跟踪和控制,全部都是围绕有关机器人设计。
- 机器学习 – 有指导和无指导情况下的基本机器学习算法
- 机器学习中的神经网络 – 智能神经网络上的算法和实践经验
- 斯坦福统计学习
有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓
人工智能书籍
- OpenCV(中文版).(布拉德斯基等)
- OpenCV+3计算机视觉++Python语言实现+第二版
- OpenCV3编程入门 毛星云编著
- 数字图像处理_第三版
- 人工智能:一种现代的方法
- 深度学习面试宝典
- 深度学习之PyTorch物体检测实战
- 吴恩达DeepLearning.ai中文版笔记
- 计算机视觉中的多视图几何
- PyTorch-官方推荐教程-英文版
- 《神经网络与深度学习》(邱锡鹏-20191121)
- …
第一阶段:零基础入门(3-6个月)
新手应首先通过少而精的学习,看到全景图,建立大局观。 通过完成小实验,建立信心,才能避免“从入门到放弃”的尴尬。因此,第一阶段只推荐4本最必要的书(而且这些书到了第二、三阶段也能继续用),入门以后,在后续学习中再“哪里不会补哪里”即可。
第二阶段:基础进阶(3-6个月)
熟读《机器学习算法的数学解析与Python实现》并动手实践后,你已经对机器学习有了基本的了解,不再是小白了。这时可以开始触类旁通,学习热门技术,加强实践水平。在深入学习的同时,也可以探索自己感兴趣的方向,为求职面试打好基础。
第三阶段:工作应用
这一阶段你已经不再需要引导,只需要一些推荐书目。如果你从入门时就确认了未来的工作方向,可以在第二阶段就提前阅读相关入门书籍(对应“商业落地五大方向”中的前两本),然后再“哪里不会补哪里”。
有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓