2024年最新OpenCV-Python实战(1)——OpenCV简介与图像处理基础

OpenCV-Python实战(1)——OpenCV简介与图像处理基础

OpenCV介绍

OpenCV 是一个的跨平台计算机视觉库,可以运行在 Linux、Windows 和 Mac OS 操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时也提供了 Python 接口,实现了图像处理和计算机视觉方面的很多通用算法。在本文中,将介绍 OpenCV 库,包括它的主要模块和典型应用场景。

Python安装OpenCV

对于 LinuxWindows 操作系统,首需要在 shellcmd 中运行以下命令安装 NumPy:

pip install numpy

然后再安装 OpenCV,可以选择两种不同版本:

  1. 仅安装主模块包
pip install opencv-python

  1. 安装完整包(包括主模块和附加模块)
pip install opencv-contrib-python

OpenCV主要模块

OpenCV 可以被划分为不同模块,其主要模块如下:
OpenCV主要模块
下表整理介绍了各主要模块的作用:

模块介绍
core核心模块,是定义基本数据结构的模块,也包括库中所有其他模块使用的基本函数
imgproc图像处理模块,包括图像滤波、几何图像变换、颜色空间变换和直方图
imgcodecs图像文件读写
highgui高级GUI,提供UI功能的接口,可以执行以下操作:创建和操作可以显示的窗口、将滑动条添加到窗口、键盘命令和处理鼠标事件等
videoio视频I/O,视频捕获和视频编解码器的接口
video视频分析模块,包括背景减法、运动估计和目标跟踪算法
calib3d摄像机标定和三维重建,包括基本的多视点几何算法、立体匹配算法、目标姿态估计、单摄像机和立体摄像机标定以及三维重建
features2d二维特征框架,该模块包括特征检测器、描述符和描述符匹配器
objdetect目标检测,检测预定义类的对象和实例(例如,人脸、眼睛、人和汽车)
dnn深度神经网络(Deep neural network, DNN)模块,本模块包含以下内容:用于创建新层的API、一组预定义的常用层、从层构造和修改神经网络的API、从不同深度学习框架加载序列化网络模型的功能等
ml机器学习库(Machine Learning Library, MLL)是一组可用于分类、回归和聚类目的的类和方法
flann快速近似近邻库(Fast Library for Approximate Nearest Neighbors, FLANN)是一组非常适合快速近邻搜索的算法,用于多维空间中的聚类和搜索
photo计算摄影,提供一些计算摄影的函数
stitching图像拼接,实现了一个自动拼接全景图像的拼接流水线
shape形状距离和匹配模块,可用于形状匹配、检索或比较
superres超分辨率,包含一组可用于提高分辨率的类和方法
videostab视频稳定,包含一组用于视频稳定的类和方法
viz三维可视化工具,用于显示与场景交互的小部件
OpenCV应用场景

OpenCV 可以应用但不仅限于以下场景:二维和三维特征提取、街景图像拼接、人脸识别系统、手势识别、人机交互、动作识别、物体识别、自动检查和监视、分割与识别、医学图像分析、运动跟踪、增强现实、视频/图像搜索与检索、机器人与无人驾驶汽车导航与控制、驾驶员疲劳驾驶检测等。

OpenCV图像处理基础

图像基础

接下来,首先从理论上介绍图像的相关概念。

图像处理中的主要问题

我们看可以把图像看作是三维世界的二维视图,那么数字图像作为2D图像,可以使用称为像素的有限数字集进行表示(像素的概念将在像素、颜色、通道、图像和颜色空间部分中详细解释)。我们可以,将计算机视觉的目标定义为将这些2D数据转换为以下内容:

  1. 新的数据表示(例如,新图像)
  2. 决策目标(例如,执行具体决策任务)
  3. 目标结果(例如,图像的分类)
  4. 信息提取(例如,目标检测)

在进行图像处理时,经常会遇到以下问题:

  1. 图像的模糊性,由于受到透视的影响,从而会导致图像视觉外观的变化。例如,从不同的角度看同一个物体会产生不同的图像;
  2. 图像通常会受许多自然因素的影响,如光照、天气、反射和运动;
  3. 图像中的一部分对象也可能会被其他对象遮挡,使得被遮挡的对象难以检测或分类。随着遮挡程度的增加,图像处理的任务(例如,图像分类)可能非常具有挑战性。

为了更好的解释上述问题,我们假设需要开发一个人脸检测系统。该系统应足够鲁棒,以应对光照或天气条件的变化;此外,该系统应该可以处理头部的运动——用户头部可以在坐标系中每个轴上进行一定程度的动作(抬头、摇头和低头,用户可以离相机稍近或稍远的情况)。而许多人脸检测算法在人脸接近正面时表现出良好的性能,但是,如果一张脸不是正面的(例如,侧面对着镜头),算法就无法检测到它。此外,算法需要即使在用户戴着眼镜或太阳镜时,也可能需要检测面部(即使这会在眼睛区域产生遮挡)。综上所述,当开发一个计算机视觉项目时,我们必须综合考虑到所有这些因素,一个很好的表征方法是有使用大量测试图像来验证算法。我们也可以根据测试图像的不同困难程度来对它们进行分类,以便于检测算法的弱点,提高算法的鲁棒性。

图像处理流程

完整的图像处理程序通常可以分为以下三个步骤:

  1. 读取图像,图像的获取可以有多种不同的来源(相机、视频流、磁盘、在线资源),因此图像的读取可能涉及多个函数,以便可以从不同的来源读取图像;
  2. 图像处理,通过应用图像处理技术来处理图像,以实现所需的功能(例如,检测图像中的猫);
  3. 显示结果,将图像处理完成后的结果以人类可读的方式进行呈现(例如,在图像中绘制边界框,有时也可能需要将其保存到磁盘)。

此外,上述第2步图像处理可以进一步分为三个不同的处理级别:

  1. 低层处理(或者在不引起歧义的情况下可以称为预处理),通常将一个图像作为输入,然后输出另一个图像。可在此步骤中应用的步骤包括但不限于以下方法:噪声消除、图像锐化、光照归一化以及透视校正等;
  2. 中层处理:是将预处理后的图像提取其主要特征(例如采用 DNN 模型得到的图像特征),输出某种形式的图像表示,它提取了用于图像进一步处理的主要特征。
  3. 高层处理:接受中层处理得到的图像特征并输出最终结果。例如,处理的输出可以是检测到的人脸.
像素、颜色、通道、图像和颜色空间

在表示图像时,有多种不同的颜色模型,但最常见的是红、绿、蓝 (RGB) 模型。
RGB 模型是一种加法颜色模型,其中原色 (在RGB模型中,原色是红色 R、绿色 G 和蓝色 B) 混合在一起就可以用来表示广泛的颜色范围。
每个原色 (R, G, B) 通常表示一个通道,其取值范围为[0, 255]内的整数值。因此,每个通道有共256个可能的离散值,其对应于用于表示颜色通道值的总比特数 (

2

8

256

2^8=256

28=256)。此外,由于有三个不同的通道,使用 RGB 模型表示的图像称为24位色深图像:

加色法
在上图中,可以看到 RGB 颜色空间的“加法颜色”属性:

  1. 红色加绿色会得到黄色
  2. 蓝色加红色会得到品红
  3. 蓝色加绿色会得到青色
  4. 三种原色加在一起得到白色

因此,如前所述,RGB 颜色模型中,特定颜色可以由红、绿和蓝值分量合成表示,将像素值表示为 RGB 三元组 (r, g, b)。典型的 RGB 颜色选择器如下图所示:

颜色选择器
分辨率为 800×1200 的图像是一个包含800列和1200行的网格,每个网格就是称为一个像素,因此其中包含 800×1200=96 万像素。应当注意,图像中有多少像素并不表示其物理尺寸(一个像素不等于一毫米)。相反,像素的大小取决于为该图像设置的每英寸像素数 (Pixels Per Inch, PPI)。图像的 PPI 一般设置在 [200-400] 范围内。
计算PPI的基本公式如下:

  1. PPI=宽度(像素) / 图像宽度(英寸)
  2. PPI=高度(像素) / 图像高度(英寸)

例如,一个4×6英寸图像,图像分辨率为 800×1200,则PPI是200。

图像描述

图像可以描述为2D函数

f

(

x

,

y

)

f(x, y)

f(x,y),其中

(

x

,

y

)

(x, y)

(x,y) 是空间坐标,而

f

(

x

,

y

)

f(x, y)

f(x,y) 是图像在点

(

x

,

y

)

(x, y)

(x,y) 处的亮度或灰度或颜色值。另外,当f(x, y)和(x, y)值都是有限离散量时,该图像也被称为数字图像,此时:

  1. x

[

0

,

h

1

]

x∈ [0, h-1]

x∈[0,h−1],其中

h

h

h 是图像的高度
2. y

[

0

,

w

1

]

y∈ [0, w-1]

y∈[0,w−1],其中

w

w

w 是图像的宽度
3. f

(

x

,

y

)

[

0

L

1

]

f(x, y)∈ [0,L-1]

f(x,y)∈[0,L−1],其中

L

=

256

L=256

L=256 (对于8位灰度图像)

彩色图像也可以用同样的方式表示,只是我们需要定义三个函数来分别表示红色、绿色和蓝色值。这三个单独的函数中的每一个都遵循与为灰度图像定义的

f

(

x

,

y

)

f(x, y)

f(x,y) 函数相同的公式。我们将这三个函数的子索引 R、G 和 B 分别表示为

f

R

(

x

,

y

)

f_R(x, y)

fR​(x,y)、

f

G

(

x

,

y

)

f_G(x, y)

fG​(x,y) 和

f

B

(

x

,

y

)

f_B(x, y)

fB​(x,y)。
同样,黑白图像也可以表示为相同的形式,其仅需要一个函数来表示图像,且

f

(

x

,

y

)

f(x, y)

f(x,y) 只能取两个值。通常,0 表示黑色、1 表示白色。
下图显示了三种不同类型的图像(彩色图像、灰度图像和黑白图像):
不同类型图像示例
数字图像可以看作是真实场景的近似,因为

f

(

x

,

y

)

f(x, y)

f(x,y) 值是有限的离散量。此外,灰度和黑白图像每个点只对应有一个值,彩色图像每个点需要三个函数对应于图像的红色、绿色和蓝色分量。

图像文件类型

尽管在 OpenCV 中处理的图像时,可以将图像看作 RGB 三元组的矩阵(在 RGB 图像模型情况下),但它们不一定是以这种格式创建、存储或传输的。有许多不同的文件格式,如GIF、PNG、位图或JPEG,使用不同形式的压缩(无损或有损)来更有效地表示图像。
下表列示了 OpenCV 支持的文件格式及其关联的文件扩展名:

文件格式文件扩展名
Windows bitmaps*.bmp和*.dib
JPEG files*.JPEG、*.jpg 和 *.jpe
JPEG 2000 files*.jp2
Portable Network Graphics*.png
Portable image format*.pbm、*.pgm 和 *.ppm
TIFF files*.TIFF 和 *.tif

对图像应用无损或有损压缩算法,可以得到比未压缩图像占据存储空间小的图像。其中,在无损压缩算法中,得到的图像与原始图像等价,也就是说,经过反压缩过程后,得到的图像与原始图像完全等价(相同);而在有损压缩算法中,得到的图像并不等同于原始图像,这意味着图像中的某些细节会丢失,在许多有损压缩算法中,压缩级别是可以调整的。

OpenCV中的坐标系

为了更好的展示 OpenCV 中的坐标系以及如何访问各个像素,查看以下低分辨率图像为例:

低分辨率图片

这个图片的尺寸是 32×41 像素,也就是说,这个图像有 1312 个像素。为了进一步说明,我们可以在每个轴上添加像素计数,如下图所示:
添加像素计数

现在,我们来看看

(

x

,

y

)

(x, y)

(x,y) 形式的像素索引。请注意,像素索引起始值为零,这意味着左上角位于

(

0

,

0

)

(0, 0)

(0,0),而不是

(

1

,

1

)

(1, 1)

(1,1)。下面的图像,索引了 4 个单独的像素,图像的左上角是原点的坐标:
像素索引

单个像素的信息可以从图像中提取,方法与 Python 中引用数组的单个元素相同。

OpenCV中的通道顺序

在 OpenCV 使用中,使用的颜色通道顺序为 BGR 颜色格式而不是 RGB 格式。可以在下图中看到三个通道的顺序:

OpenCV通道顺序

BGR 图像的像素结构如下图所示,作为演示,图示详细说明了如何访问pixel(y=n, x=1):

像素访问

Tips:OpenCV 的最初开发人员选择了 BGR 颜色格式(而不是 RGB 格式),是因为当时 BGR 颜色格式在软件供应商和相机制造商中非常流行,因此选择 BGR 是出于历史原因。
此外,也有其他 Python 包使用的是 RGB 颜色格式(例如,Matplotlib 使用 RGB 颜色格式,Matplotlib 是最流行的 2D Python 绘图库,提供多种绘图方法,可以查看 Python-Matplotlib 可视化获取更多详细信息)。因此,我们需要知道如何将图像从一种格式转换为另一种格式。
当我们掌握了将图像从一种格式转换为另一种格式的方法后,就可以选择使用 OpenCV 进行图像处理,同时利用 Matplotlib 包提供的函数来显示图像,接下来,让我们看看如何处理两个库采用的不同颜色格式。
首先,我们使用 cv2.imread() 函数加载图像:

import cv2
img_OpenCV = cv2.imread('sigonghuiye.jpeg')

图像存储在 img_OpenCV 变量中,因为 cv2.imread() 函数以 BGR 顺序加载图像。然后,我们使用 cv2.split() 函数将加载的图像分成三个通道 (b, g, r) 。这个函数的参数就是我们要分割的图像:

b, g, r = cv2.split(img_OpenCV)

下一步是合并通道(以便根据通道提供的信息构建新图像),但合并时顺序与原图像不同。我们更改 b 和 r 通道的顺序以遵循 RGB 格式,即我们所需要的 Matplotlib 格式:

img_matplotlib = cv2.merge([r, g, b])



![在这里插入图片描述](https://img-blog.csdnimg.cn/20210511152217670.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poaWd1aWd1,size_16,color_FFFFFF,t_70)

**感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的:**



① 2000多本Python电子书(主流和经典的书籍应该都有了)

② Python标准库资料(最全中文版)

③ 项目源码(四五十个有趣且经典的练手项目及源码)

④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)

⑤ Python学习路线图(告别不入流的学习)




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里无偿获取](https://bbs.csdn.net/topics/618317507)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
  • 14
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV-Python是一个基于Python的计算机视觉库,它提供了许多用于图像处理和计算机视觉任务的函数和工具。在使用OpenCV-Python进行实战时,首先需要安装配套使用的opencv-contrib-python库,最好保持版本一致,可以使用以下命令进行安装:pip install opencv-contrib-python。 在实战中,可以通过OpenCV-Python进行图像的基本操作。例如,可以使用OpenCV-Python读取图像文件,可以使用cv2.imread函数来读取图像,如下所示:img = cv2.imread('image.jpg')。 另外,OpenCV-Python还可以用于处理视频文件。可以使用cv2.VideoCapture函数来打开视频文件,然后使用循环逐帧读取视频帧,并对每一帧进行处理。例如,可以将每一帧转换为灰度图像,并使用cv2.imshow函数显示处理结果。可以使用以下代码来实现视频文件的处理: ``` vc = cv2.VideoCapture('video.mp4') # 打开视频文件 while vc.isOpened(): ret, frame = vc.read() # 读取视频帧 if frame is None: break if ret == True: gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 将帧转换为灰度图像 cv2.imshow("result", gray) # 显示灰度图像 if cv2.waitKey(10) & 0xFF == 27: # 按下ESC键退出循环 break vc.release() cv2.destroyAllWindows() ``` 此外,OpenCV-Python还可以进行图像数据的截取,可以使用切片操作来截取图像的特定区域。例如,可以使用以下代码来截取图像的一部分数据:cat = img[0:50, 0:200],其中[0:50, 0:200]表示截取图像的高度为50像素,宽度为200像素的区域。 还可以使用OpenCV-Python提取图像的颜色通道。例如,可以使用以下代码来提取图像的蓝色通道:blue_channel = img[:, :, 0],其中[:, :, 0]表示提取图像的第0个通道,即蓝色通道。同样的方法可以用于提取其他颜色通道。 综上所述,OpenCV-Python提供了丰富的函数和工具,可以用于图像处理和计算机视觉任务的实战。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [基于pythonopencv的学习和实战](https://blog.csdn.net/weixin_44001965/article/details/112862177)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatgptT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值