- 1. 学习如何在你的电脑上配置OpenCV-Python环境!
- 1.1 开始了解OpenCV-Python
- 1.2 在 Windows 下安装 OpenCV-Python
- 1.3 在 Fedora 环境下安装 OpenCV-Python
- 1.4 在 Debian(Ubuntu)中配置 OpenCV-Python
- 1.5 在Docker中安装OpenCV-Python
- 1.6 在树莓派配置OpenCV-Python
- 2. OpenCV中的GUI功能
- 2.1 开始使用图像
- 2.2 开始使用视频
- 2.3 OpenCV 中的绘图函数
- 2.4 以鼠标为画笔
- 2.5 用滑块控制条做调色板
- 3. OpenCV中的GUI功能
- 3.1 图片基本操作
- 3.2 图像算术操作
- 3.3 性能评估与改进技巧
- 4. OpenCV中的图像处理
- 4.1 更换颜色空间
- 4.2 对图像进行几何变换
- 4.3 图像二值化处理
- 4.4 平滑图像
- 4.5 形态学转换
- 4.6 图像梯度
- 4.7 Canny边缘检测
- 4.8 图像金字塔
- 4.9.1 直方图:查找,绘制,分析
- 4.9.2 直方图均衡化
- 4.9.3 二维直方图
- 4.9.4 直方图反投影
- 4.10 OpenCV中的图像变换
- 4.10.1 傅立叶变换
- 4.11 模板匹配
- 4.12 霍夫直线变换
- 4.13 霍夫圆变换
- 4.14 基于分水岭算法的图像分割
- 4.14 使用 GrabCut 算法交互式前景提取
- 5. 特征检测和描述符
- 5.1 理解特征
- 5.2 Harris 角点检测
- 5.3 Shi-Tomasi 角点检测 & 适合用来跟踪的特征
- 5.4 介绍SIFT(尺度不变特征转换)
- 5.5 介绍SURF(加速稳健特征)
- 5.6 角点检测的FAST算法
- 5.7 BRIEF特征点描述算法
- 5.8 ORB 特征描述符(Oriented FAST and Rotated BRIEF)
- 5.9 特征匹配
- 5.10 特征匹配和使用单应性匹配来搜索物体
- 6. 视频分析
- 6.1 Meanshift和Camshift
- 6.2 光流
- 6.3 背景分割
- 7. 相机校准和3D重建
- 7.1 相机校准
- 7.2 姿势估计
- 7.3 极线几何
- 7.4 来自立体图像的深度图
- 8. 机器学习
- 8.1 K-最近邻算法
- 8.1.1 了解k-最近邻算法
- 8.1.2 使用kNN进行手写字符的OCR
- 8.2 支持向量机(SVM)
- 8.2.1 理解SVM
- 8.2.2 使用SVM的手写数据的OCR
- 8.3 K-Means聚类
- 8.3.1 理解 K-Means 聚类
- 8.3.2 OpenCV中的K-Means聚类
- 9. 计算摄影学
- 9.1 图像去噪
- 9.2 图像修复
- 9.3 高动态范围(HDR)
- 10. 目标检测
- 10.1 使用 Haar Cascades 的面部识别
- 11. OpenCV-Python 绑定
- 11.1 OpenCV-Python绑定如何工作?
5.1 理解特征
目标
在这一章中,我们将会试着理解什么是特征,为什么它们很重要,为什么边角很重要等等。
详细解释
大家一定都玩过拼图。你会拿到到一张图片的许多小的部分,然后你需要把它们拼成一个大的图片。问题是,你是怎么做到的?我们能否将同样的方法应用到计算机程序中,让计算机也会玩拼图?如果计算机会玩拼图,为什么我们不能给它一些真实生活中的风景图片然后让它将这些图片拼成一张大的图片?如果计算机能将自然风景图片拼成一张,那么何不给它一些建筑物的图片并让它建立起这个建筑物的立体模型?
这些问题和想象还可以继续。但这都基于一个最基本的问题:你是怎么玩拼图的?你是怎么将混乱的大量图像片拼成一个大图像?
答案是我们寻找特定的、唯一的结构或者说特征,这些结构或特征可以被轻易地追踪和比较。如果我们要对这个特征下一个定义,我们可能发现用语言表达它并不容易,但是我们心里知道这些特征是什么。如果有人让你指出一个可以用于比较几个图片的特征,你可以指出一个。这就是为何小孩子也能容易地玩这些游戏。我们从图片中找到特征,在其他图片中找到同样的特征,然后将它们放在一起。仅此而已。(在拼图游戏中,我们更多地关注不同图像的连续性)。所有这些能力对于我们来说都是与生俱来的。
因此,我们的基本的问题数量上变多了,但变得更加具体。 这些特征是什么? (这个问题的答案应该也可以被计算机理解。)
很难说人类是如何找到这些特征的。 我们天生就具备这种能力。
但是如果我们深入了解一些图片并寻找不同的模式,我们会发现一些有趣的东西。
图像非常简单。在图像的顶部,给出了六个小图像块。你要解决的问题是要找到这些图像块在原始图像中的确切位置。你能找到多少正确的结果?
A和B都是平坦的表面,它们分布在很多的区域。很难找到这些图像块的确切位置。
C和D要简单得多。他们是建筑物的边缘。你可以找到一个大概的位置,但寻找确切位置仍然困难。这是因为建筑物边缘的模式是相同的。
然而,在建筑物边缘,结构和别处是不同的。因此,与平坦区域相比,边缘是更好的特征,但是还不够好(然而在拼图游戏中,边缘的连续性是好的特征)。
最后,E和F是建筑物的一些边角。他们可以很容易地找到。因为不管你将这个图像块移动到其他任何地方,它看起来都不一样。所以他们可以被认为是好的特征。
现在我们进入更简单(和使用更广泛的)图像,以更好的理解特征。
就像上面那样,蓝色图像块是平坦的区域,很难查找和跟踪。 无论你向哪里移动蓝色图像块,它看起来都是一样的。 黑色图像块有一个边缘。 如果沿垂直方向(或沿着倾斜方向)移动,它会发生变化。 沿着边缘(平行于边缘)移动,它看起来是一样的。 而对于红色补丁,这是一个边角。 无论你如何移动图像块,它看起来都不同,意味着它是独一无二的。 所以基本上来说,边角被认为是一个图像中的好特征。 (不只是边角,在某些情况下斑点也被认为是好的特征)。
所以现在我们回答了我们的问题:“这些特征是什么?”。 但接下来下一个问题出现了。 我们如何找到他们? 或者说我们如何找到边角? 我们以一种直观的方式表述这个问题,即:在周围所有区域移动(少量)时,寻找图像中具有最大变化的区域。 这将在未来的章节中被应用到计算机语言中。 寻找这些图像特征称为特征检测。
现在我们在图像中找到了这些特征。 只要你找到了特征,你应该能够找到有相同特征的其他图像。 这是怎么做到的? 我们把这个特征周围的区域用我们自己的话来解释,比如“上半部分是蓝天,下半部分是建筑物,在那个建筑物上有玻璃等等”,然后在另一个区域搜索有相同的区域特征的图片。 基本上,你正在描述你找到的特征。 相似的,计算机也应该描述特征点周围的区域,以便在其他图像中找到它。 这样的描述称为特征描述。 一旦你有了这些特征及其描述,你可以在所有图像中找到相同的特征,并将它们放在一起,拼接在一起或做任何你想用它们做的。
在这个单元中,我们将看到如何使用OpenCV中的不同算法来查找特征,描述它们,匹配它们等等。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论