处理图像处理和操作的最常用的库之一是 Python 的 OpenCV。对于图像分类、目标检测或光学字符识别,在人工智能领域与图像相关的任何工作大多数时候都需要某种形式的图像处理和操作。
在本教程中,我们将专注于 OpenCV 的一些基本功能。这些功能基础且有时非常有用。我们将通过示例学习它们。在开始之前,这是我们今天将要使用的库。
import cv2
import matplotlib.pyplot as plt
我们将从如何移动或平移图像开始,本教程将使用一个简单的笑脸图像。在这行代码中,使用 `cv2.imread` 函数读取图像并将其存储为数组。
image = cv2.imread('smiley.jpg')
如果你对OpenCV完全不了解,这是‘image’变量的样子:
array([[[255, 255, 255],
[255, 255, 255],
[255, 255, 255],
...,
[255, 255, 255],
[255, 255, 255],
[255, 255, 255]],
[[255, 255, 255],
[255, 255, 255],
[255, 255, 255],
...,
[255, 255, 255],
[255, 255, 255],
[255, 255, 255]],
[[255, 255, 255],
[255, 255, 255],
[255, 255, 255],
...,
[255, 255, 255],
[255, 255, 255],
[255, 255, 255]],
...,
[[255, 255, 255],
[255, 255, 255],
[255, 255, 255],
...,
[255, 255, 255],
[255, 255, 255],
[255, 255, 255]],
[[255, 255, 255],
[255, 255, 255],
[255, 255, 255],
...,
[255, 255, 255],
[255, 255, 255],
[255, 255, 255]],
[[255, 255, 255],
[255, 255, 255],
[255, 255, 255],
...,
[255, 255, 255],
[255, 255, 255],
[255, 255, 255]]], dtype=uint8)
可以使用`.imshow()`函数显示图像。Matplotlib和OpenCV库都有`.imshow`函数。
plt.imshow(image)
平移或移动
我们将从如何移动或平移图像开始。本教程将使用一个简单的笑脸图像。定义如何移动图像并将其保存在一个名为`move`的变量中。让我们将图像向右移动100像素,向下移动30像素。因此,`move`变量将如下所示:
move = np.float32([[1, 0, 100], [0, 1, 30]])
在这里,1和0是固定的。[0, 2] 位置上的100将使图像向右移动,[1, 2] 位置上的30将使图像向下移动。
shift = cv2.warpAffine(image, move, (image.shape[1], image.shape[0]))
plt.imshow(shift)
如果要将图像向左和向上移动,只需使用负号:
move = np.float32([[1, 0, -100], [0, 1, -30]])
shift = cv2.warpAffine(image, move, (image.shape[1], image.shape[0]))
plt.imshow(shift)
使用 imutils 库也可以实现相同的效果。以下是语法:
import imutils
moved = imutils.translate(image, -100, -30)
它将生成与上一个图像完全相同的图像。正如您所见,使用 imutils 简单一些。
调整大小
调整大小操作在图像预处理中非常常见。我们根据需要增加或减小图像的高度和宽度。以下是在 OpenCV 中调整大小的语法:
resized = cv2.resize(image, image_shape, interpolation=cv2.INTER_AREA)
我使用 'interpolation' 作为 cv2.INTER_AREA。还有其他选项。稍后我们将讨论它们。让我们从 image_shape 开始。注意要注意纵横比,以确保图像看起来不失真。为此,需要将输出图像的纵横比保持为输入图像的纵横比。如果我们希望输出图像的高度为500,那么输出图像的图像形状需要是:
rsz = 500.0 / image.shape[1]
image_shape = (500, int(image.shape[0] * rsz))
同样,如果我们需要输出图像的宽度为300,我们计算输出图像的高度。
rsz = 300.0 / image.shape[0]
image_shape = (int(image.shape[1] * rsz), 300)
resized = cv2.resize(image, image_shape, interpolation=cv2.INTER_AREA)
第三个参数 'interpolation' 有几个不同的选项。以下是它们的名称:
cv2.INTER_LINEAR
cv2.INTER_NEAREST
cv2.INTER_CUBIC
cv2.INTER_LANCZOS4
如果您不提供任何 'interpolation' 方法,OpenCV 使用的默认方法是 cv2.INTER_LINEAR 方法,提供双线性插值。
imutils 库使这一切变得更容易。它为我们计算了纵横比。它只需要高度或宽度。它会自行计算宽度或高度。以下是语法:
im = imutils.resize(image, width=300)
在这里,我们提供了宽度和高度将自动计算,以保持纵横比不变。
裁剪
如果您曾经使用过图像,那么您肯定以某种方式执行过裁剪。裁剪图像的一种常见方法是简单地使用数组的切片。正如我们在开头讨论的那样,图像只是一个NumPy数组。这里我在这里裁剪笑脸:
part = image[0:600, 0:600]
plt.imshow(part)
这样,它取了顶部600个像素和左侧600个像素。以下是另一个例子:
part = image[100:600, 100:600]
plt.imshow(part)
这次我们从顶部和左侧都从第100个像素开始。因此,这里我们从顶部的第100个像素到第599个像素,还有从左侧的第100个像素到第599个像素。请随时尝试其他范围。
· END ·
HAPPY LIFE
本文仅供学习交流使用,如有侵权请联系作者删除