pyimagesearch-3 Python和OpenCV中的基本图像处理:调整大小(缩放),旋转和裁剪

原文链接

你准备好开始建立你的第一个图像搜索引擎吗?没那么快!让我们首先介绍一些基本的图像处理和操作,它们将在您的图像搜索引擎之旅中派​​上用场。如果你已经是一个图像处理专家,这篇文章对你来说似乎很无聊,但是给它一个非常简单的阅读 - 你可能会学会一两个技巧。

OpenCV和Python版本:
此示例将在Python 2.7和 OpenCV 2.4.X / OpenCV 3.0+上运行。

对于基本图像处理的介绍,我将假设您具有如何创建和执行Python脚本的基本知识。我也假设你已经安装了OpenCV。如果您在安装OpenCV时需要帮助,请查看OpenCV网站上的快速入门指南。

继续上一个例子让我们使用侏罗纪公园之旅吉普车作为我们的示例图像:
pyimagesearch-3 Python和OpenCV中的基本图像处理:调整大小(缩放),旋转和裁剪_第1张图片
Figure 1: Our example image — a Jurassic Park Tour Jeep.

继续将此图像下载到您的计算机。你需要它来开始玩一些Python和OpenCV示例代码。
准备?开始了。首先,让我们加载图像并将其显示在屏幕上:

# import the necessary packages
import cv2

# load the image and show it
image = cv2.imread("jurassic-park-tour-jeep.jpg")
cv2.imshow("original", image)
cv2.waitKey(0)

执行此Python代码段会在我的计算机上显示以下结果:
pyimagesearch-3 Python和OpenCV中的基本图像处理:调整大小(缩放),旋转和裁剪_第2张图片
如您所见,图像现在正在显示。让我们继续并分解代码:

  • 第2行:第一行只是告诉Python解释器导入OpenCV包。
  • 第5行:我们现在正在从磁盘上加载映像。imread函数返回一个NumPy数组,表示图像本身。
  • 第6行和第7行:对imshow的调用会在屏幕上显示图像。第一个参数是一个字符串,即窗口的“名称”。第二个参数是对我们在第5行从磁盘上加载的图像的引用。最后,对waitKey的调用会暂停脚本的执行,直到我们按下键盘上的某个键。使用参数“0”表示任何按键将取消暂停执行。

只是加载和显示图像不是很有趣。让我们调整这个图像的大小,使其缩小。我们可以通过使用图像的shape属性来检查图像的尺寸,因为图像是一个NumPy数组:

print image.shape

执行此代码时,我们看到(388,647,3)输出到我们的终端。这意味着图像有388行,647列和3个通道(RGB组件)。当我们编写矩阵时,通常以表格(行数x#列数)来编写它们 - 这与在NumPy中指定矩阵大小的方式相同。

但是,在处理图像时,这可能会有点混乱,因为我们通常按宽度x高度指定图像。看看矩阵的形状,我们可能会认为我们的图像宽388像素,高647像素。但是,这是不正确的。我们的图像实际上是647像素宽,388像素高,这意味着高度是形状中的第一个条目,宽度是第二个。如果您刚刚开始使用OpenCV,这一点可能会有点混乱,重要的是要记住。

由于我们知道我们的图像宽度为647像素,因此我们将其调整为100像素宽:

# we need to keep in mind aspect ratio so the image does
# not look skewed or distorted -- therefore, we calculate
# the ratio of the new image to the old image
r = 100.0 / image.shape[1]
dim = (100, int(image.shape[0] * r))

# perform the actual resizing of the image and show it
resized = cv2.resize(image, dim, interpolation = cv2.INTER_AREA)
cv2.imshow("resized", resized)
cv2.waitKey(0)

执行此代码,我们现在可以看到新调整大小的图像只有100像素宽:
pyimagesearch-3 Python和OpenCV中的基本图像处理:调整大小(缩放),旋转和裁剪_第3张图片
让我们分解代码并检查它:

  • 第4行和第5行:我们必须记住图像的纵横比,这是图像宽度和高度的比例关系。在这种情况下,我们将图像的大小调整为具有100像素宽度,因此,我们需要计算r,即新宽度与旧宽度的比率。然后,我们通过使用100个像素作为宽度来构造图像的新尺寸,并且r x是旧图像高度。这样做可以让我们保持图像的纵横比。
  • 第8-10行:图像的实际大小调整在这里发生。第一个参数是我们想要调整大小的原始图像,第二个参数是我们计算的新图像的尺寸。第三个参数告诉我们调整大小时使用的算法。暂时不要担心。最后,我们显示图像并等待按下按键。

调整图像大小并不是那么糟糕。现在,让我们假装我们是侏罗纪公园电影中的暴龙雷克斯 - 让我们翻转这辆吉普车:

# grab the dimensions of the image and calculate the center
# of the image
(h, w) = image.shape[:2]
center = (w / 2, h / 2)
 
# rotate the image by 180 degrees
M = cv2.getRotationMatrix2D(center, 180, 1.0)
rotated = cv2.warpAffine(image, M, (w, h))
cv2.imshow("rotated", rotated)
cv2.waitKey(0)

那吉普车现在看起来像什么?你猜对了 - 颠倒了。
pyimagesearch-3 Python和OpenCV中的基本图像处理:调整大小(缩放),旋转和裁剪_第4张图片
这是迄今为止我们所看到的最受关注的例子。让我们分解一下:

  • 第3行:为方便起见,我们获取图像的宽度和高度,并将它们存储在各自的变量中。
  • 第4行:计算图像的中心 - 我们简单地将宽度和高度除以2。
  • 第7行:计算可用于旋转(和缩放)图像的矩阵。第一个参数是我们计算的图像的中心。如果您想围绕任意点旋转图像,那么您可以在此处提供该点。第二个参数是我们的旋转角度(以度为单位)。第三个参数是我们的缩放因子 - 在本例中为1.0,因为我们希望保持图像的原始比例。如果我们想将图像的大小减半,我们将使用0.5。同样,如果我们想要将图像的大小加倍,我们将使用2.0。
  • 第8行:通过提供图像,旋转矩阵和输出尺寸来执行实际旋转。
  • 第9-10行:显示旋转的图像。

旋转图像绝对是我们迄今为止所做的最复杂的图像处理技术。让我们继续裁剪图像并抓住Grant的特写镜头:

# crop the image using array slices -- it's a NumPy array
# after all!
cropped = image[70:170, 440:540]
cv2.imshow("cropped", cropped)
cv2.waitKey(0)

看看格兰特。他看起来像是看到一个生病的三角龙吗?
pyimagesearch-3 Python和OpenCV中的基本图像处理:调整大小(缩放),旋转和裁剪_第5张图片
像Python和OpenCV的Dennis Nedry那样裁剪已经死了。我们所做的只是切片数组。我们首先提供startY和endY坐标,然后是切片的startX和endX坐标。而已。我们裁剪了这张照片!

作为最后一个例子,让我们将裁剪后的图像保存到磁盘,只有PNG格式(原版是JPG):

# write the cropped image to disk in PNG format
cv2.imwrite("thumbnail.png", cropped)

pyimagesearch-3 Python和OpenCV中的基本图像处理:调整大小(缩放),旋转和裁剪_第6张图片
如您所见,OpenCV负责为我们改变格式。现在你会了Python和OpenCV中的基本图像处理!来吧,自己玩代码,并尝试你最喜欢的侏罗纪公园图像。如果您有任何疑问,请将其留在评论中或给我发送电子邮件 - 我将很乐意为您提供帮助。

你可能感兴趣的:(翻译)