1、读取,写入和显示图像
在使用计算机视觉进行任何操作之前,我们需要理解计算机如何处理图像。计算机唯一可以处理的信息是二进制信息(0和1),其中包括文本,图像和视频。那么计算机如何处理图像呢?我们要知道计算机如何“理解”图像,可以对图像大小的矩阵进行拍照,在每个单元格上分配一个表示该位置图像颜色的值。让我们以灰度图像为例:
对于这种特殊情况,我们可以为图像中的每个块(或像素)分配一个数值(可以解释为二进制)。我们习惯上将0表示黑色,将255表示白色,以及介于两者之间的所有整数代表强度,但该数值可以在任何范围内。
当我们处理彩色图像时,根据库和我们选择表示颜色的方式,情况可能会有所不同。我们将在后面的文章中进一步讨论这一点,但是,它们或多或少都具有相同的想法,即使用不同的通道表示颜色,它们也是是RGB(红色,绿色和蓝色)最受欢迎的选项之一。使用RGB,我们需要3个通道来构建每个像素,因此我们的2d矩阵现在是深度为3的3d矩阵,其中每个通道都是特定颜色的强度,并且在混合时我们获得了像素的最终颜色。
2、使用OpenCV处理图像
现在,让我们跳入到代码中,以处理图像,读取,显示和保存时执行3个最重要的功能。
如果运行我们上面的代码,现在将获得一张图像保存到磁盘,另一张图像作为打印结果。
左边的图像是我们绘制的图像,而右边的图像是保存到磁盘的图像。抛开尺寸的不同,左侧的图像看起来很奇怪,看上去有点蓝色,但是为什么不同呢?(顺便说一句,右边的图像是正确的)。左侧图像看起来颜色奇怪的原因与OpenCV默认情况下读取图像的方式有关。OpenCV imread()函数将使用BGR通道读取图像,该图像应为绘图功能所使用的RGB。对于OpenCV,这是正常现象,我们将在下文中讲解如何修复它的方法。
3、改变色彩空间
什么是色彩空间?在前面的示例中,我们看到了计算机如何处理图像,并且看到了要表示颜色的颜色,我们需要使用通道,这些通道组合在一起后就可以得出图像的最终颜色。设置这些通道的配置是色彩空间。我们在先前的代码片段中已经覆盖了2个不同的颜色空间,我们使用了RGB和BGR,但是还有更多具有非常特殊和有趣特性的属性(一些流行的色彩空间包括LAB,YCrCb,HLS和HSV)。由于每个色彩空间都有其自身的属性,因此某些算法或技术在一个色彩空间中可能比其他色彩空间更好地工作,因此在这些色彩空间之间更改图像非常重要,而且值得庆幸的是,OpenCV为我们提供了一个非常易于使用的功能。让我们看看如何使用它来修复上面的图(使用cvtColor)
现在我们得到了一只漂亮的棕色狗:
让我们尝试其他的色彩空间:
4、调整图像大小
现在我们已经可以加载显示和更改图像的色彩空间,接下来我们需要注意的是调整大小。在计算机视觉中调整图像大小非常重要,因为ML中的学习模型可以使用固定大小的输入。大小将取决于模型,但是要确保我们的图像能在模型上工作,我们需要相应地调整它们的大小。而且OpenCV提供了一种实用的方法来执行此操作,称为resize,让我们看一个如何使用它。
输出:
5、旋转图像
在许多情况下,将图像旋转到不同角度可以帮助我们提高模型的效率,但是在这里我们不会全部介绍。相反,我只向你展示如何使用OpenCV旋转图像。OpenCV中rotate函数示例:
尽管此方法使用非常容易,但也将我们限制在几个选项中,我们无法以任何角度旋转。为了更好地控制旋转,我们可以改用getRotationMatrix2D和warpAffine。
6、边缘检测
边缘是图像亮度急剧变化或不连续的点。这种不连续通常对应于:
1、深度不连续
2、表面取向不连续
3、材料特性的变化
4、场景照明的变化
边缘是图像的非常有用的功能,可以用作ML管道的一部分,我们已经看到了一些有关边缘如何帮助我们检测道路上的形状或线条的示例。CV2为我们提供了Canny函数来完成此任务,下面是如何使用它:
7、最后
OpenCV是用于处理图像和视频的一个比较出色的库,它提供了大量有用的工具和功能,可以处理从最简单到最复杂的场景。我们今天讲述的功能只是图库中的一部分。如果你有兴趣浏览库文档,可以自行去查看样本,从简单的图像处理(如转置)到更高级的功能(如轮廓检测,特征检测甚至人脸检测),都有很多。
更多详细信息,请您微信关注“计算网”公众号: