首页 / 资料库 / 微软 · AI 入门

资料库10 分钟读完MIT计算机视觉OpenCV图像处理光流

计算机视觉入门

译自《Introduction to Computer Vision》 · 查看英文原文

原文出处Introduction to Computer Vision 原作者:Microsoft · 许可证:MIT License 中文译本由诸葛AI学院整理,仅供学习参考,版权归原作者与微软所有。

计算机视觉(computer vision)是一门学科,目标是让计算机对数字图像形成高层次的理解。这个定义相当宽泛,因为"理解"可以指很多不同的事:在图片里找出某个物体(目标检测,object detection)、弄清楚画面里正在发生什么(事件检测,event detection)、用文字描述一张图片,或者重建场景的三维结构。还有一批围绕人像的专门任务,比如年龄与情绪估计、人脸检测与识别、三维姿态估计(3D pose estimation),这里不一一列举。

课前小测

计算机视觉最简单的任务之一是图像分类(image classification)。

计算机视觉常被视为 AI 的一个分支。如今大部分计算机视觉任务都是用神经网络解决的。在本节后面的课程里,我们会深入了解神经网络中专门用于计算机视觉的一类:卷积神经网络(convolutional neural network)。

不过,在把图片送进神经网络之前,很多情况下先用一些算法手段增强图像更划算。

Python 里做图像处理有这么几个库:

  • imageio,可以读写不同的图像格式。它也支持 ffmpeg,这是一个把视频帧转成图片的实用工具。
  • Pillow(也叫 PIL)功能更强一些,还支持一些图像操作,比如变形(morphing)、调色板调整等。
  • OpenCV 是用 C++ 写成的强大图像处理库,已经成为图像处理的事实标准(de facto standard)。它提供了顺手的 Python 接口。
  • dlib 是一个实现了大量机器学习算法的 C++ 库,其中就包括一些计算机视觉算法。它同样有 Python 接口,能应付人脸检测、面部特征点检测这类高难度任务。

OpenCV

OpenCV 被视为图像处理的事实标准。它内置了许多用 C++ 实现的有用算法,你也可以从 Python 里调用它。

学 OpenCV 有个不错的去处:这个 Learn OpenCV 课程。在本课程大纲里,我们的目标不是教你把 OpenCV 学通,而是给你看几个例子,说明它能在什么时候、以什么方式派上用场。

加载图像

在 Python 里,图像可以方便地用 NumPy 数组表示。比如一张 320x200 像素的灰度图会存成一个 200x320 的数组,同样尺寸的颜色图像形状则是 200x320x3(3 个颜色通道)。加载一张图片可以用下面的代码:

```python import cv2 import matplotlib.pyplot as plt

im = cv2.imread('image.jpeg') plt.imshow(im) ```

OpenCV 传统上对颜色图像使用 BGR(蓝-绿-红)编码,而 Python 生态的其他工具多用更常见的 RGB(红-绿-蓝)。要让图片显示正常,你需要把它转到 RGB 色彩空间:可以在 NumPy 数组里交换维度,也可以调用一个 OpenCV 函数:

python im = cv2.cvtColor(im,cv2.COLOR_BGR2RGB)

同一个 cvtColor 函数还能做其他色彩空间转换,比如把图片转成灰度图,或转到 HSV(色调-饱和度-明度,Hue-Saturation-Value)色彩空间。

你也可以用 OpenCV 逐帧读取视频,示例见练习文档 OpenCV Notebook

图像处理

在把图片喂给神经网络之前,你可能想做几步预处理。OpenCV 能做的事情很多,包括:

  • im = cv2.resize(im, (320,200),interpolation=cv2.INTER_LANCZOS) 对图像缩放(resizing)
  • im = cv2.medianBlur(im,3)im = cv2.GaussianBlur(im, (3,3), 0) 对图像模糊(blurring)
  • 调整图像的亮度和对比度,可以通过 NumPy 数组操作完成,这个 Stackoverflow 回答里有做法
  • 使用阈值化(thresholding),调用 cv2.threshold/cv2.adaptiveThreshold 函数。这通常比调亮度、对比度更可取
  • 对图像施加不同的几何变换
    • 仿射变换(affine transformation):当你要把旋转、缩放和倾斜合并着施加到图像上,并且知道图中三个点在变换前后的位置时,它就有用。仿射变换能让平行线保持平行
    • 透视变换(perspective transformation):当你知道图中四个点在变换前后的位置时,它就有用。举个例子,你用手机摄像头从某个角度拍一份矩形文件,想把画面校正回文件本身那张矩形的样子
  • 借助光流(optical flow)来理解图像里的运动

计算机视觉应用示例

在我们的 OpenCV Notebook 里,有几个用计算机视觉完成具体任务的例子:

  • 预处理一本盲文书的照片。重点是怎么组合使用阈值化、特征检测、透视变换和 NumPy 操作,把一个个盲文字符分离出来,供神经网络后续分类。原文此处有三张并排的图,依次是:盲文书的原始照片、预处理后的结果、分离出的盲文字符(来自 OpenCV.ipynb)。
  • 用帧差法检测视频里的运动。如果摄像头是固定不动的,视频流里相邻帧的画面应该彼此非常接近。既然帧就是用数组表示的,把相邻两帧的数组相减,就得到逐像素的差异:静止的画面差异值很低,画面里出现明显运动时差异值就会升高。原文此处有一张图,画的是连续的视频帧和它们相减后的差异结果(来自 OpenCV.ipynb)。
  • 用光流检测运动光流能帮我们搞清楚视频帧上各个像素是怎么移动的。光流分两种:

  • 稠密光流(dense optical flow)计算一个矢量场,给出每个像素往哪里移动

  • 稀疏光流(sparse optical flow)先取图像里的一些显著特征(比如边缘),再逐帧追踪这些特征的轨迹

原文此处有一张图,画的是光流的运动矢量示意(来自 OpenCV.ipynb)。

示例 Notebook 动手练习:OpenCV

我们一起做点 OpenCV 实验,去探索 OpenCV Notebook实际动手试试 OpenCV

小结

有些任务听起来挺复杂,比如运动检测、指尖检测,其实纯靠计算机视觉手段就能解决。所以,了解计算机视觉的基本技术、知道 OpenCV 这类库能做什么,会非常有用。

挑战任务

看一下 AI Show 的这期视频,了解 Cortic Tigers 项目:他们做了一个基于积木块的方案,靠一台机器人把计算机视觉任务变得人人可以上手。你还可以去找找其他类似的项目,这类项目能帮新学习者进入这个领域。

课后小测

复习与自学

想读更多光流的内容,看这篇讲得很不错的教程

实验作业

在这个实验里,你会拿到一段只有简单手势的视频,目标是用光流提取出手势的上、下、左、右移动。原文此处有一张图,画的是手掌移动的视频帧。

这篇在讲什么,跟咱们的课怎么对?

资料库是大厂公开教材的中文译本,偏原理和工程做法。想看面向中小企业的白话版本,去入门课场景课