查看原文
编程教程

Python中OpenCV的基础知识

The following article is from 深度学习与计算机视觉 Author 磐怼怼

点击上方小白学视觉”,选择加"星标"或“置顶
重磅干货,第一时间送达
从安装到基本图像处理
OpenCV 是一个流行的开源计算机视觉库,可用于不同的编程语言,例如 Python、C++ 和 JavaScript。它提供了一套丰富的工具来处理和分析图像和视频,让你可以从调整单张图片的大小到构建复杂的对象识别应用程序。
Python 编程语言除了被广泛用作大多数图像处理和计算机视觉应用程序的标准外,还允许以非常直接的方式将 OpenCV 安装在你的计算机中。
在本教程中,我将向你展示使用 OpenCV 安装、设置和对图像执行一些基本操作所需的步骤,重点介绍有关该库背后概念的重要基础知识。
值得一提的是,这些步骤是在基于 Linux 的操作系统中使用Python3执行的。因此,如果你使用不同的配置,则可能需要进行细微的更改。

设置虚拟环境

使用 Python 时,通常建议在虚拟环境中运行你的应用程序。这样做,你可以只安装运行应用程序所需的包,使其独立于系统的其余部分。如果你的计算机上仍然没有安装虚拟环境工具,我建议你安装以下工具。
python3 -m pip install virtualenv
安装后,你可以使用此工具创建新的虚拟环境。为此,导航到你想要的目录并运行以下命令。请注意,我为我的环境选择了名称 my_venv,但你可以选择任何你想要的名称。
python3 -m venv my_venv
最后,你只需要激活你的虚拟环境,以便你在此终端中运行的任何内容都将在其中完成。
source my_venv/bin/activate

安装 OpenCV

首先更新你的包管理器并为 Python3 安装 OpenCV。
sudo apt update
sudo apt install python3-opencv
然后,使用 pip 在你的虚拟环境中安装 OpenCV。
pip install opencv-python

打开图像

使用你最喜欢的 IDE,创建一个扩展名为 .py 的新文件,然后从导入 OpenCV 类开始。
import cv2
我们在这里做的第一件事是使用 imread() 方法加载图像并使用 imshow() 方法打开它。请将下面的路径替换为你的图片所在的路径。
image = cv2.imread("images/messi.jpg")
cv2.imshow("Original image", image)
原始图像
关于 OpenCV 如何解释图像的第一个有趣的点是,imread()返回一个n 维数组对象。对于 RGB 图像,例如本例中使用的图像,此数组具有以下形状:
[宽×高×通道数]
你可以通过打印图像形状来确认这一点。
print("Original image shape:", image.shape)

更改图像色彩空间

颜色空间是用于描述图像的光谱上的一系列颜色。尽管有多种颜色空间可用,但最常见的是 RGB 和灰度。OpenCV 包含一种特殊的颜色空间转换方法。为了将图像从 RGB 转换为灰度,你需要应用 cvtColor()方法。
image_grayscale = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow(“Grayscale image”, image_grayscale)
灰度图像
重要的是要注意,现在你的图像不再包含三个维度。那是因为对应于通道的第三维在灰度色彩空间中没有使用。
print("Grayscale image shape:", image_grayscale.shape)

编辑图像通道

返回到包含三个颜色通道的原始图像,你现在可以操纵每个通道的强度值,以抑制或突出显示特定通道。与通常假设的相反,RGB 通道的访问顺序与首字母缩写词中的顺序不同。在 OpenCV 中,通道实际上以 BGR 格式提供:
0 = B(蓝色)
1 = G(绿色)
2 = R(红色)
在下面的示例中,我检索前两个通道中的所有像素并将它们设为零,这样绿色和蓝色通道将不会对生成的图像产生任何影响,因此图像将呈现完全红色调。
image_red = image.copy()
image_red[:, :, :2] = 0 
cv2.imshow("Red image", image_red)
具有空蓝色和绿色通道的图像
打印红色图像形状时,请注意仍然存在第三维,否则生成的图像将被描述为灰度。
print("Red image shape:", image_red.shape)

旋转图像

除了颜色之外,还可以对图像形状进行操作,例如大小和方向。你可以从获取图像尺寸开始,就像 NumPy 对象一样。
width, height, _ = image.shape
然后可以通过取其宽度和高度的一半来计算图像的中心点。
center = (width//2, height//2)
为了旋转图像,你首先必须创建一个旋转矩阵,分别将中心点、所需的旋转度数和图像比例作为参数传递。使用不同于 1 的比例会改变图像大小。
rotation_matrix = cv2.getRotationMatrix2D(center, 45, 1.0) 
旋转矩阵对象本身不足以做我们想要的。它作为参数传递给 warpAffine() 方法,这是实际执行旋转的方法。
image_rotated = cv2.warpAffine(image, rotation_matrix, (width, height))
cv2.imshow(“Rotated image”, image_rotated)
旋转图像

调整图像大小

你可以使用之前获得的高度和宽度值来定义图像的新尺寸。在下面的示例中,我将它们设置为将图像缩小到其原始大小的三分之一。
new_size = (width//3, height//3)
负责调整图像大小的方法是resize(),它分别需要原始图像对象、所需的新大小和插值方法作为参数。
image_resized = cv2.resize(image, new_size, interpolation=cv2.INTER_LINEAR)
cv2.imshow(“Resized image”, image_resized)
调整大小的图像
然后,你可以检查调整大小的图像的尺寸。
print(“Resized image shape:”, image_resized.shape)

将绘图插入图像

在某些应用程序中,可能需要向图像添加标记。OpenCV 类提供了多种在其上绘制线条和形状的方法。如下添加一行。这里的参数是原始图像、初始位置、最终位置、线条颜色 RGB 代码和线条宽度。
请注意,实际上使用的是原始图像的副本,因为绘图方法会影响原始图像。
image_line = cv2.line(image.copy(), (0, 0), (height//2, width//2), (0, 255, 255), 10)
cv2.imshow(“Image with line”, image_line)
带线条的图像
同样,在图像中绘制矩形也有特定的方法。在这种情况下,第二个和第三个参数是矩形相对顶点的位置(左上角和右下角)。
image_rectangle = cv2.rectangle(image.copy(), (500, 150), (900, 550), (0, 255, 255), 5)
cv2.imshow(“Image with rectangle”, image_rectangle)
带有矩形的图像
你还可以通过将圆的中心位置和半径分别指定为第二个和第三个参数来绘制一个圆。
image_circle = cv2.circle(image.copy(), (300, 300), 200, (0, 255, 255), 5)
cv2.imshow(“Image with circle”, image_circle)
带圆的图像

完整的脚本

本教程生成的脚本可在以下地址获取。
https://github.com/lfgodoi/tutorials/tree/main/fundamentals-of-opencv-in-python
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群


欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存