原文链接
你准备好开始建立你的第一个图像搜索引擎吗?没那么快!让我们首先介绍一些基本的图像处理和操作,它们将在您的图像搜索引擎之旅中派上用场。如果你已经是一个图像处理专家,这篇文章对你来说似乎很无聊,但是给它一个非常简单的阅读 - 你可能会学会一两个技巧。
OpenCV和Python版本:
此示例将在Python 2.7和 OpenCV 2.4.X / OpenCV 3.0+上运行。
对于基本图像处理的介绍,我将假设您具有如何创建和执行Python脚本的基本知识。我也假设你已经安装了OpenCV。如果您在安装OpenCV时需要帮助,请查看OpenCV网站上的快速入门指南。
继续上一个例子让我们使用侏罗纪公园之旅吉普车作为我们的示例图像:
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代码段会在我的计算机上显示以下结果:
如您所见,图像现在正在显示。让我们继续并分解代码:
只是加载和显示图像不是很有趣。让我们调整这个图像的大小,使其缩小。我们可以通过使用图像的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像素宽:
让我们分解代码并检查它:
调整图像大小并不是那么糟糕。现在,让我们假装我们是侏罗纪公园电影中的暴龙雷克斯 - 让我们翻转这辆吉普车:
# 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)
那吉普车现在看起来像什么?你猜对了 - 颠倒了。
这是迄今为止我们所看到的最受关注的例子。让我们分解一下:
旋转图像绝对是我们迄今为止所做的最复杂的图像处理技术。让我们继续裁剪图像并抓住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)
看看格兰特。他看起来像是看到一个生病的三角龙吗?
像Python和OpenCV的Dennis Nedry那样裁剪已经死了。我们所做的只是切片数组。我们首先提供startY和endY坐标,然后是切片的startX和endX坐标。而已。我们裁剪了这张照片!
作为最后一个例子,让我们将裁剪后的图像保存到磁盘,只有PNG格式(原版是JPG):
# write the cropped image to disk in PNG format
cv2.imwrite("thumbnail.png", cropped)
如您所见,OpenCV负责为我们改变格式。现在你会了Python和OpenCV中的基本图像处理!来吧,自己玩代码,并尝试你最喜欢的侏罗纪公园图像。如果您有任何疑问,请将其留在评论中或给我发送电子邮件 - 我将很乐意为您提供帮助。