让你开始接触计算机视觉的基本OpenCV函数
计算机视觉是人工智能的一个领域,它可以训练计算机解释和理解视觉世界。因此,许多项目涉及使用来自相机和视频的图像,并使用一些技术,如图像处理和深度学习模型。
OpenCV是一个为解决常见的计算机视觉问题而设计的库,它在该领域的人中超级受欢迎,而且它非常适合学习和在生产中使用。该库有多种语言的接口,包括Python、Java和C++。
在这篇文章中,我们将介绍OpenCV中不同的(常见的)函数,它们的应用,以及你如何开始使用每个函数。尽管我将在Python中提供例子,但这些概念和函数对于不同的支持语言都是一样的。
我们今天到底要学什么?
- 读取、写入和显示图像
- 改变颜色空间
- 调整图像的大小
- 图像旋转
- 边缘检测
读取、写入和显示图像
在我们能够用计算机视觉做任何事情之前,我们需要能够阅读和理解计算机是如何处理图像的。计算机能够处理的唯一信息是二进制信息(0和1),这包括文本、图像和视频。
计算机是如何处理图像的
为了理解计算机是如何 "理解 "图像的,你可以想象一个图像大小的矩阵,在每个单元格上,你分配一个值,代表该位置上的图像的颜色。
让我们举一个灰度图像的例子。
在这种特殊情况下,我们可以给图像中的每个块(或像素)分配一个数字值(可以解释为二进制)。这个数值可以是任何范围的,尽管习惯上用0代表黑色,255代表白色,以及中间的所有整数来表示强度。
当我们处理彩色图像时,事情会变得有点不同,这取决于库和我们选择如何表示颜色。我们将在后面的文章中更多地讨论这个问题,然而,它们都有一个或多或少相同的想法,那就是使用不同的通道来表示颜色,RGB(红、绿、蓝)是最流行的选择之一。使用RGB,我们需要3个通道来建立每个像素,所以我们的2D矩阵现在是一个深度为3的3D矩阵,其中每个通道是一个特定颜色的强度,当混合时我们得到像素的最终颜色。
使用OpenCV处理图像
现在让我们跳到代码中来执行处理图像时的3个最重要的功能,即读取、显示和保存。
import cv2
import matplotlib.pyplot as plt
# Reading the image
image = cv2.imread('sample1.jpg')
# Showing the image
plt.imshow(image)
plt.show()
# Saving the image
cv2.imwrite('sample1_output.jpg', image)
如果你运行我们的代码,现在你会得到一张保存在磁盘上的图像,以及另一张作为绘图结果的图像。
左边的图片是我们绘制的图片,右边的图片是保存在磁盘上的图片。除了尺寸上的差异(由于绘图的原因),左边的图像看起来很奇怪,看起来偏蓝,但为什么会有不同?(顺便说一下,右边的图像是正确的)。
左边的图像看起来颜色很奇怪的原因与OpenCV默认读取图像的方式有关。OpenCVimread() 函数将使用BGR通道来读取图像,而不是绘图函数使用的RGB。这对OpenCV来说是正常的,有一些方法可以解决这个问题,我们接下来会讨论。
改变颜色空间
什么是颜色空间?在我们之前的例子中,我们看到了计算机是如何处理图像的,我们看到为了表示颜色,我们需要使用通道,当这些通道组合在一起时,就得到了图像的最终颜色。设置这些通道的配置就是色彩空间。不知不觉中,我们在之前的代码片段中已经涵盖了两个不同的色彩空间,我们使用了RGB和BGR,但还有更多的色彩空间具有非常特别和有趣的特性。其他一些流行的颜色空间包括LAB、YCrCb、HLS和HSV。由于每个颜色空间都有自己的属性,一些算法或技术在一个空间中可能比其他空间效果更好,所以在这些颜色空间之间改变图像是很重要的,感谢OpenCV为我们提供了一个非常容易使用的函数,正是为了这个目的。
来看看cvtColor,让我们看看如何使用它来修复我们上面的图。
import cv2
import matplotlib.pyplot as plt
# Reading the image
image = cv2.imread('sample1.jpg')
# Change color space
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# Showing the image
plt.imshow(image)
plt.show()
现在我们得到了一只漂亮的棕色狗。
让我们来探索一些其他的颜色空间。
import cv2
import matplotlib.pyplot as plt
# Reading the image
original = cv2.imread('sample1.jpg')
fig = plt.figure(figsize=(8, 2))
axarr = fig.subplots(1, 3)
# Change color space
image = cv2.cvtColor(original, cv2.COLOR_BGR2RGB)
axarr[0].imshow(image)
image = cv2.cvtColor(original, cv2.COLOR_BGR2GRAY)
axarr[1].imshow(image)
image = cv2.cvtColor(original, cv2.COLOR_BGR2LAB)
axarr[2].imshow(image)
plt.show()
调整图像大小
现在我们已经能够加载、显示和改变图像的颜色空间了,接下来我们需要关注的是调整大小。在计算机视觉中调整图像的大小是很重要的,因为,ML中的学习模型是以固定大小的输入来工作的。尺寸将取决于模型,但为了确保我们的图像能在模型上工作,我们需要相应地调整它们的尺寸。
OpenCV提供了一个实用的方法来做这件事,叫做resize,让我们看看如何使用它的例子。
import cv2
# Reading the image
original = cv2.imread('sample1.jpg')
# Resize
resized = cv2.resize(original, (200, 200))
print(original.shape)
print(resized.shape)
其中输出
(1100, 1650, 3)
(200, 200, 3)
图像旋转
训练模型的一个关键部分是我们将用来训练它的数据集。如果数据集没有足够的样本,以及分布良好的样本,训练出来的模型很可能会失败。但有时我们算不上有足够大的数据集,或者我们没有所有我们想训练模型的情况,所以我们运行改变我们拥有的图像的过程,以生成新的图像。有很多情况下,将图像旋转到不同的角度可以帮助我们获得模型的效率,但我们不会在这里涵盖所有的情况。相反,我想告诉你如何使用OpenCV来旋转图像。
让我们来看看OpenCV中的旋转功能的例子
import cv2
import matplotlib.pyplot as plt
# Reading the image
image = cv2.imread('sample1.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image = cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE)
plt.imshow(image)
plt.show()
尽管这种方法超级容易使用,但它也限制了我们的几个选项,我们不能以任何角度进行旋转。为了对旋转有更多的控制,我们可以使用getRotationMatrix2D和warpAffine代替。
import cv2
import matplotlib.pyplot as plt
# Reading the image
image = cv2.imread('sample1.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
rows, cols = image.shape[:2]
deg = 45
# (col/2,rows/2) is the center of rotation for the image
# M is the coordinates of the center
M = cv2.getRotationMatrix2D((cols/2, rows/2), deg, 1)
image = cv2.warpAffine(image, M, (cols, rows))
plt.imshow(image)
plt.show()
边缘检测
边缘是图像中亮度急剧变化或有不连续性的点。这种不连续性通常对应于。
- 深度上的不连续
- 表面方向的不连续
- 材料属性的变化
- 场景照度的变化
边缘是图像的一个非常有用的特征,可以作为ML管道的一部分,我们已经看到一些例子,说明边缘如何帮助我们检测道路上 的形状或线条。
CV2为我们提供了Canny函数来完成这个任务,下面是如何使用它。
import cv2
import matplotlib.pyplot as plt
# Reading the image
original = cv2.imread('sample2.jpg')
fig = plt.figure(figsize=(6, 2))
axarr = fig.subplots(1, 2)
axarr[0].imshow(cv2.cvtColor(original, cv2.COLOR_BGR2RGB))
threshold1 = 50
threshold2 = 200
grey = cv2.cvtColor(original, cv2.COLOR_BGR2GRAY)
image = cv2.Canny(original, threshold1, threshold2)
axarr[1].imshow(image, cmap='gray')
plt.show()
总结
OpenCV是一个处理图像和视频的很好的库,它提供了大量有用的工具和函数来处理从最简单到最复杂的情况。我们今天回顾的功能只是其中的一部分。如果你有兴趣探索这个库的文档,可以看看样本,里面有很多东西,从简单的图像处理,如转置,到更先进的功能,如轮廓检测,特征检测,甚至人脸检测。