目录
本次主要分为这几个阶段
第 1 篇:入门篇。本篇包括 Python 与 OpenCV、搭建开发环境、图像处理的基本操作、像素的操作和色彩空间与通道。这些内容的作用相当于「扫盲」,即完成一个从「什么都不知道」到「掌握关键知识点」的转变过程,为学习后面的内容奠定基础。
第 2 篇:基础篇。本篇介绍了绘制图形和文字、图像的几何变换、图像的阈值处理和图像的运算。学习完这一部分后,读者不仅能够直观地看到运用 OpenCV 处理图像后的效果,还能够了解 OpenCV 程序的编码步骤和注意事项。
第 3 篇:进阶篇。本篇的内容较多,包含了 6 章内容,分别是模板匹配、滤波器、腐蚀与膨胀、图形检测、视频处理以及人脸检测和人脸识别。这 6 章内容虽然相对独立,但是在实际开发过程中,是相辅相成、相得益彰的。
第 4 篇:项目篇。本篇通过一个完整的小型 MR 智能视频打卡系统,按照「需求分析 → 系统设计 → 文件系统设计 → 数据实体模块设计 → 工具模块设计 → 服务模块设计 → 程序入口设计」顺序,手把手指导读者运用 Python OpenCV 完成软件项目的开发实践
OpenCV 的设计初衷是提供易于使用的计算机视觉接口,以帮助开发人员在实际开发中快速建立精巧的视觉应用。为此,OpenCV 库包含了从计算机视觉各个领域衍生出来的 500 多种方法。这使得 OpenCV 自测试版发布以来,就被广泛地应用在安保行业、航空领域和其他高精尖的科研工作中。近年来,随着 Python 语言的强势崛起,Python OpenCV 已经成为一个很好的学习方向。
OpenCV 是一个开源的计算机视觉库,可以在 Windows、Linux、MacOS 等操作系统上运行。它起源于英特尔性能实验室的实验研究,由俄罗斯的专家负责实现和优化,并以为计算机视觉提供通用性接口为目标。
人类的视觉能够很轻易地从这幅图像中识别花朵。但是,计算机视觉不会像人类视觉那样能够对图像进行感知和识别,更不会自动控制焦距和光圈,而是把图像解析为按照栅格状排列的数字。以图 1.7 为例,计算机视觉将其解析为如图 所示的按照栅格状排列的数字(图 下只是图 1.7 的一部分)。
OpenCV 的作用在于让开发人员更容易地通过编码来处理图像。那么,处理图像需要执行哪些操作呢?图像处理的基本操作包含 4 个方面的内容:读取图像、显示图像、保存图像和获取图像属性。其中,常用的图像属性有 3 个:shape、size 和 dtype。本章将依次详解实现图像处理的 4 个基本操作,并分别阐明常用的 3 个图像属性各自的含义及其使用方法。
image = cv2.imread(filename, flags)
image:imread()方法的返回值,返回的是读取到的图像。
filename:要读取的图像的完整文件名。例如,要读取当前项目目录下的 3.1.jpg,filename 的值为「3.1.jpg」(双引号是英文格式的)。
flags:读取图像颜色类型的标记。当 flags 的默认值为 1 时,表示读取的是彩色图像,此时的 flags 值可以省略;当 flags 的值为 0 时,表示读取的是灰度图像(如果读取的是彩色图像,也将转换为与彩色图像对应的灰度图像)。
说明
灰度图像是一种每个像素都是从黑到白,被处理为 256 个灰度级别的单色图像。256 个灰度级别分别用 0(纯黑色)~255(纯白色)的数值表示。
相比图 3.2 中密密麻麻的数字,如
果能够将这幅图像显示出来,就可以更加直观地看到它。为此,OpenCV 提供了 imshow()方法、waitKey()方法和 destroyAllWindows()方法。
cv2.imshow(winname, mat)
cv2.imwrite(filename, img)
filename:保存图像时所用的完整路径。
img:要保存的图像。
在处理图像的过程中,经常需要获取图像的大小、类型等图像属性。为此,OpenCV 提供了 shape、size 和 dtype 3 个常用属性,具体含义分别如下。
shape:如果是彩色图像,那么获取的是一个包含图像的水平像素、垂直像素和通道数的数组,即(垂直像素,水平像素,通道数);如果是灰度图像,那么获取的是一个包含图像的水平像素和垂直像素的数组,即(垂直像素,水平像素)。
size:获取的是图像包含的像素个数,其值为「水平像素 × 垂直像素 × 通道数」。灰度图像的通道数为 1。
dtype:获取的是图像的数据类型。
像素是图像的最小单位。每一幅图像都是由M行N列的像素组成的,其中每一个像素都存储一个像素值。以灰度图像为例,计算机通常把灰度图像的像素处理为 256 个灰度级别,256 个灰度级别分别使用区间[0,255]中的整数数值表示。其中,「0」表示纯黑色;「255」表示纯白色。本章将围绕着像素展开,介绍如何使用 NumPy 模块操作像素。
确定像素的位置
正方向 分别是 往右和往下
读取像素
- import cv2
-
- image = cv2.imread(「D:/4.1.jpg」) # 读取 D 盘根目录下的 4.1.jpg
- px = image[291, 218] # 坐标(291, 218)上的像素
获取像素的 BGR 值
blue green red
通常我们用的是RBG值 但是opencv中用的是反过来的 用BGR值
所以我们平时的(0,0,255)其实是纯红色
- import cv2
-
- image = cv2.imread(「D:/4.1.jpg」)
- blue = image[291, 218, 0] # 坐标(291, 218)上的像素的 B 通道的值
- green = image[291, 218, 1] # 坐标(291, 218)上的像素的 G 通道的值
- red = image[291, 218, 2] # 坐标(291, 218)上的像素的 R 通道的值
- print(blue, green, red)
修改像素的 BGR 值
直接给像素赋值即可
例如
px = [255, 255, 255]