一、OpenCV 简介
基于 python 的 OpenCV 课程介绍
定位:本课程是从事CV方向工作的基础课程,以OpenCV基础,介绍传统的图像处理算法,为图像处理算法工作打下坚实的基础。
主要内容: OpenCV 是应用广泛的开源图像处理库,我们以其为基础,介绍相关的图像处理方法: 包括基本的图像处理方法:几何变换(放大、缩小、平移、旋转),形态学变换(膨胀、填充),图像平滑(生产过程中不可避免的添加噪声,主要是降噪),直方图操作(灰度均衡化,提高对比度),模板匹配(寻找整个图像与模板相似位置),霍夫变换(检查图像的线、圆、椭圆)等;特征提取和描述方法:理解角点特征,Harris 和 Shi-Tomas 算法,SIFT/SURF 算法(尺度不变),Fast 算法(快速提取关键点,只是特征提取,没有描述),ORB 算法(Fast 后描述)等;还有 OpenCV 在视频操作中的应用(声音无法处理),最后的案例是使用 OpenCV 进行人脸检测。
1.1 图像处理简介
1.1.1 图像
图像定义:图像是人类视觉的基础,是自然景物的客观反映,是人类认识世界和人类本身的重要源泉。“图”是物体反射或透射光的分布,“像“是人的视觉系统所接受的图在人脑中所形版的印象或认识。照片、绘画、剪贴画、地图、书法作品、手写汉学、传真、卫星云图、影视画面、X光片、脑电图、心电图等都是图像。

图像的起源从模拟图像开始。
| 图像的两种表现 | 又称 | 定义 | 特点 | 主流 |
|---|---|---|---|---|
| 模拟图像 | 连续图像 | 通过某种物理量(如光、电等)的强弱变化来记录图像亮度信息 | ①所有数据是值连续存储的,容易受到噪声干扰;②其中一个值受到干扰就不连续;③不清晰 | 如今已经基本全面被数字图像替代 |
| 数字图像 | 离散图像 | 其亮度用离散数值表示,将图片编码成5个灰度级 | ①所有数据是分级存储的,不容易受到干扰;②清晰 | 如今已经基本全面被数字图像替代 |
1.1.2 数字图像
表示:数字图像跟计算机一样也是利用 0/1 来记录信息,平常接触的图像都是 8 位数图像,包含 0~255 灰度,其中 0 代表最黑,255 表示最白。如下图左边是灰度值,右边是灰度图。随着灰度值的增加,图像越亮。

人眼对灰度更敏感一些,在 16 位到 32 位之间,也就是在 0-216-1和0-232-1 之间,而且每个人对灰度的感受是有差别的。如下图,左右两边各有 1 条线,感觉是左边的线更亮,但实际上两条线的灰度值是一样的,是因为人眼受到对周围信息的对比干扰。

| 数字图像的分类 | 定义 | 说明 | 数据类型 | 使用场景 |
|---|---|---|---|---|
| 二值图像 | 一幅二值图像的二维矩阵仅由 0、1 两个值构成,“0”代表黑色,“1”代白色 | 每一像素(矩阵中每一元素)取值仅有 0、1 两种可能,即黑色与白色 | 1 个二进制位 | 文字、线条图的扫描识别(OCR)和掩膜图像的存储 |
| 灰度图 | 每个像素只有一个采样颜色的图像,这类图像通常显示为从最暗黑色到最亮白色的灰度 | 灰度图像在黑色与白色之间还有许多级的颜色深度 | 灰度图经常是在单个电磁波频谱如可见光内测量每个像素的亮度得到的,用于显示的灰度图像通常用每个采样像素8位的非线性尺度来保存,这样可以有 256 级灰度(如果用 16 位,则有 65536 级) | |
| 彩色图 | 每个像素通常是由红(R)、绿(G)、蓝(B)三个分量来表示的,每个分量介于(0, 255) | RGB 图像与索引图像一样都可以用来表示彩色图像,相同点都是分别用R、G、B的组合来表示每个像素的颜色,不同点是 RGB 图像每一个像素的颜色值直接存放在图像矩阵中 | 8 位无符号整形 | 表示和存放彩色图像 |
1.2 OpenCV 的简介及安装方法
1.2.1 简介
介绍:OpenCV 是一个计算机视觉处理开源软件库,支持与计算机视觉和机器学习相关的众多算法。
| OpenCV 的优势 | 说明 |
|---|---|
| 编程语言 | OpenCV 基于 C++ 实现,同时提供 Python、Ruby、Matlab 等语言的接口。OpenCV-Python 是 OpenCV 的 Python API,结合 OpenCV C++ API 和 Python语言的最佳特性 |
| 跨平台 | 可以在不同的系统平台上使用,包括 Windows、Linux、OS X、Android和 iOS。基于 CUDA 和 OpenCL 的高速 GPU 操作接口也在积极开发中 |
| 丰富的 API | 完善的传统计算机视觉算法,涵盖主流的机器学习算法(比如神经网络),同时添加了对深度学习(TensorFlow)的支持。 |
| 活跃的开发团队 |
OpenCV-Python:OpenCV-Python 是一个 Python 绑定库,是原始 OpenCV C++ 实现的 Python包装器,旨在解决计算机视觉问题。
优点:Python 因为其简单性,使程序员能够用更少的代码行表达思想。与 C/C++ 等语言相比,Python 运行速度较慢,但OpenCV-Python提供 C/C++ 扩展,因此可以在 C/C++ 中编写计算密集型代码,并创建可用作 Python 模块的 Python 包装器。这带来两个好处,首先,代码与原始 C/C++ 代码一样快(因为它是在后台工作的,后台是 C++ 代码),其次,在 Python 中编写代码比使用 C/C++ 更容易。
说明:OpenCV-Python使用 numpy,numpy 是一个高度优化的数据库操作库,具有 MATLAB 风格的语法。因为图像读取出来的数据是二维数组,所有 OpenCV 数组结构都转换为 Numpy 数组,使得与使用 Numpy 的其他库(如 SciPy 和 Matplotlib)集成更容易。
1.2.2 OpenCV 部署方法
①安装 OpenCV之前需要先安装 numpy 和 matplotlib;
②创建 Python 虚拟环境 cv(机器学习),在 cv 中安装即可;
③先安装 OpenCV-Python,由于一些经典的算法、函数被申请了版权,新版本有很大的限制,所以选用 3.4.3 以下的版本,但是 python 3.6 版本是没有办法下载 3.4.2 的 opencv,所以想要下载 3.4.2 版本首先要降低版本 python 的版本。安装命令如下:
pip install opencv-python==3.4.2.17
④测试是否安装成功,运行以下代码无报错则说明安装成功。
import cv2
# 读一个图片并进行显示。其中图片路径需自己指定,读取图像支持 bmp、jpg、png、tiff 等常用格式
read_image = cv2.imread("D:\OnePiece.png")
# 展示窗口名字为 ShowImage,展示的图片为 read_image
cv2.imshow("ShowImage", read_image)
# 按下任意按键继续
cv2.waitKey(0)
# 销毁所有打开的 GUI 窗口
cv2.destroyAllWindows()
# 如果安装成功,这个图像就会显示出来,也可以打印处图片的行数和列数进一步验证
print(f"size=width*hight={read_image.shape[0]}ppi*{read_image.shape[1]}ppi")
因为 opencv-python 没有 SIFT 和 SURF 算法,SIFT 和 SURF 算法在扩展库 opencv-contrib-python,如果要利用 SIFT 和 SURF 等进行特征提取时,还需要安装:
pip install opencv-contrib-python==3.4.2.17
1.3 OpenCV 的模块

其中 core、highgui、imgproc 是最基础的模块:
① core 模块实现了最核心的数据结构及其基本运算,如绘图函数、数组操作相关函数等。
② highgui 模块实现了视频与图像的读取、显示、存储等接口。
③ imgproc 模块实现了图像处理的基础方法,包括图像滤波、图像的几何变换、平滑、阈值分割、形态学处理、边缘检测、目标检测、运动分析和对象跟踪等。
对于图像处理其他更高层次的方向及应用,OpenCV 也提供特征提取相关模块、机器学习模块:
① features2d 模块用于提取图像特征以及特征匹配,其里面的 nonfree 模块(非免费模块)实现了一些专利算法,如 sift 特征(nonfree 模块在 3.4.3 及其以上版本才有)
② objdetect 模块实现了一些目标检测的功能,经典的基于 Haar、LBP 特征的人脸检测,基于 HOG 的行人、汽车等目标检测,分类器使用 Cascade Classification(级联分类)和Latent SVM 等。
③ stitching 模块实现了图像拼接功能,常用于遥感影像。
④ FLANN 模块(Fast Library for Approximate Nearest Neighbors),包含快速近似最近邻搜索 FLANN 和聚类 Clustering 算法。
⑤ ml 模块机器学习模块(SVM,决策树,Boosting 等等)。
⑥ photo 模块包含图像修复和图像去噪两部分。
⑦ video 模块针对视频处理,如背景分离,前景检测、对象跟踪等。
⑧ calib3d 模块即Calibration(校准)3D,这个模块主要是相机校准和三维重建相关的内容。包含了基本的多视角几何算法,单个立体摄像头标定,物体姿态估计,立体相似性算法,3D 信息的重建等等。
⑨ G-API 模块包含超高效的图像处理 pipeline 引擎

9946

被折叠的 条评论
为什么被折叠?



