在本教程的第一部分,我们将讨论如何将 OpenCV 图像表示为 NumPy 数组。由于每个图像都是一个 NumPy 数组,我们可以利用 NumPy 数组切片来裁剪图像。
使用 OpenCV 和 NumPy 数组切片理解图像裁剪
当我们裁剪图像时,我们想要移除我们不感兴趣的图像的外部部分。我们通常将此过程称为选择我们的兴趣区域,或者更简单地说,我们的 ROI。
我们可以通过使用 NumPy 数组切片来完成图像裁剪。
让我们首先初始化一个NumPy列表,其值范围为[ 0,24 ]:
现在让我们将这个 1D 列表重塑为一个 2D 矩阵,假装它是一个图像:
现在,假设我要提取从x = 0,y = 0到x = 2,y = 3的“像素” 。这样做可以使用以下代码完成:
注意我们是如何提取三行 ( y = 3 ) 和两列 ( x = 2
现在,让我们提取从x = 1、y = 3开始到x = 5和y = 5结束的像素
你注意到这里的一个模式了吗?
将 NumPy 数组切片应用于图像时,我们使用以下语法提取 ROI:
roi = image[ startY : endY , startX : endX ]
这startY : endY 提供我们numpy数组中的的行(因为y轴是我们的行数)而 startX : endX 提供图像numpy数组中的列(因为x轴是列数)
看到这里如果不太明白,建议去看一篇numpy数组切片的博文: 点此链接.去理解数组切片!
通过博文末尾或此处的的代码下载.
下载本博文对应的代码项目,以下是下载解压后的
我们今天只有一个 Python 脚本, opencv_crop.py,这将加载输.png 图像,然后使用 NumPy 数组切片从图像中裁剪出面部和身体。
第 2 行和第 3 行导入我们需要的 Python 包,而第 6-9 行解析我们的命令行参数。
我们只需要一个命令行参数, - 图像,这是我们希望裁剪的输入图像的路径。对于这个例子,我们将默认- 图像 .png 文件在我们的项目目录中。
接下来,让我们从磁盘加载我们的图像:
第 12 和 13 行图像 然后将其显示到我们的屏幕上:
我们的目标是使用简单的裁剪方法从该区域中提取脸和身体。
我们通常会应用物体检测技术来检测图像中我的脸和身体。然而,由于我们在 OpenCV 教育课程中还处于早期阶段,我们将使用我们对图像的先验知识并手动提供身体和面部所在的 NumPy 数组切片。
同样,我们当然可以使用对象检测方法从图像中自动检测和提取人脸
我们用一行代码(第 20 行)从图像中提取我的脸。
我们提供 NumPy 数组切片来提取图像的矩形区域,从(85, 85)开始到(220, 250)结束。
我们为作物提供索引的顺序可能看起来违反直觉;但是,请记住,OpenCV 将图像表示为 NumPy 数组,高度在前(行数),宽度在后(列数)。
为了执行我们的裁剪,NumPy 需要四个索引:
同样,我们可以从图像中裁剪身体
裁剪身体是通过从原始图像的坐标(0, 90)开始裁剪到(290, 450)结束来完成的。
您可以在下面看到使用 OpenCV 进行裁剪的输出:
代码下载.