原文链接:Basic Image Manipulations in Python and OpenCV: Resizing (scaling),Rotating, and Cropping - PyImageSearch
https://www.pyimagesearch.com/2014/01/20/basic-image-manipulations-in-python-and-opencv-resizing-scaling-rotating-and-cropping/
by Adrian Rosebrock on January 20, 2014 in Image Processing
你打算开始构筑你的第一个图象搜索引擎吗?别那么快!先让我们复习一些基本的图象处理和操作,这将在你的搜索引擎旅程中迟早有用。如果你已经是一名图象处理专家,本博客似乎让你厌烦,但仍然去读一读,你可能获得一两个技巧。
OpenCV 和 Python版本:本例子运行在Python 2.7 和 OpenCV 2.4.X/OpenCV 3.0+.
在本基本图象处理的介绍中,我假设你具有创建和执行 Python文本的基本知识,我也假设你已经安装了 OpenCV。要是你想要在安装 OpenCV方面得到帮助,就请看 OpenCV网站上的quick start guides。
继续我的侏罗纪公园之迷恋,让我们用侏罗纪公园旅行车作例子图象加以演示:
图1:示例图象-侏罗纪公园旅行吉普车
首先下载本图到你的计算机上。你必须用一些Python和 OpenCV 样本码开始演示。
准备好了吗?开始吧。
首先,让我们装入图象并在屏幕上显示:
1 2 3 4 5 6 7 |
# import the necessary packages importcv2
# load the image and show it image = cv2.imread("jurassic-park-tour-jeep.jpg") cv2.imshow("original",image) cv2.waitKey(0) |
执行此Python小段,在计算机上得到以下结果:
图2:.装入并显示侏罗纪公园旅行吉普车
如你所见,图象得到显示。首先让我们分解代码:
行1:第1行告诉 Python编辑器输入OpenCV 包。
行5:现在我们从磁盘上加载图象。读入图象功能 (imread
)返回一个NumPy阵列,表达图象本身。
行6和行7:调用imshow
在屏幕上显示图象。第一个参数是一个字符,即我们的窗口的“名字”。第二个参数对第
5
行所装图象的参照。最后,调用
waitKey
暂停文本的执行,直到我们压下键盘上的一个键。利用“0”参数指示任何键都能暂停执行。
光是装入并显示一幅图象意思不大,让我们改变图象尺寸,使之更小。我们利用图象的形状属性检查图象的尺寸,因为图象终究是一个 NumPy array阵列。
1 |
Printimage.shape |
当执行此码时,我们看到(388, 647, 3)输出到我们的终端上。这意味着图象具有388行,647列,以及3通道(RGB元件)。
当我们写矩阵时,通常以行数X列数(# of rows x # of columns)的格式来写,即与你在NumPy中规定矩阵大小的方法是相同的。
当然,用图象工作时,这可能会些许混淆,因为通常定义图象的术语是宽X高。
看矩阵的形状,我们可能认为我们的图象是388像素宽和647像素高。当然,这是不正确的。
我们的图象实际是647像素宽和388像素高,意味着高是形状的第一条目,宽则是第二条目。
如果刚开始使用OpenCV,这里有点混淆,应当记住。
因为我们知道我们的图象是647像素宽,让我们改变其大小,使其为100像素宽:
1 2 3 4 5 6 7 8 9 10 |
# 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像素宽:
图3 :我们有了改变大小的图象,为100像素宽。
让我们分解代码并加以检查:
行4和行5:记住我们必须保持图象的纵横比,即图象的宽高比不能改变。
这样,我们改变图象大小到宽为100像素,我们需要计算r
, 即新的宽度与老的宽度之比。然后,我们以100像素宽构成新的尺寸,并采用 r X老的高度尺寸。
行8-10:实际图象大小改变在这里发生。
第一个参数是我们想要改变尺寸的原始图象的参数,第二个参数是我们新图象的计算尺寸。
第三个参数告诉我们在改变尺寸时所用的算法。现在不必担心,我们显示图象并等候一个键的压下。
改变一幅图象的大小并非那么糟糕。现在让我们假装我们是来自侏罗纪公园电影的雷克斯霸王龙,让我们上下翻转吉普车:
1 2 3 4 5 6 7 8 9 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) |
现在看看吉普车怎样了?你猜一下--掀翻了。
.图4:吉普车被掀翻。我们也可以任何角度旋转吉普车
这是我们看到的最复杂的例子,让我们分解它:
行3:为了便利,我们抓住图象的宽度和高度并存储在各自的变量中。
行4:计算图象的中心--我们简单地对宽和高除以2.
行 7: 计算一个矩阵,可用于图象旋转(以及大小改变)。
第一个参数是我们计算出的中心点。如果你想要围绕某个任意点旋转,你在这里提供那个点的参数。
第二个参数是旋转角度(单位度)。
第三个参数是是放大系数--本例是1.0。因我们想要维持图象的原始比例。如果我们需要图象大小减半,就用0.5。同样,如果你想要二倍图象尺寸,则用2.0。
行8:通过提供图象,旋转矩阵,以及输出尺寸,执行实际旋转。
行9-10:显示旋转图象
旋转一幅图象肯定是今为止我们所做的最复杂的图象处理技术。
让我们继续裁剪图象,取得一幅格兰特特写:
1 2 3 4 5 |
# 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) |
Take alook at Grant. Does he look like he sees a sick Triceratops?
图5:用Python and OpenCV做裁剪是简单的--我们就是切割 NumPy矩阵
按 Dennis Nedry所言,在 Python and OpenCV中,裁剪是呆板的。我们所做的只是切断阵列。
首先我们提供startY and endY坐标,再提供 startX and endX坐标,以便进行切断。于是我们裁剪了图象!
作为最后的例子,让我们保存裁剪后的图象到磁盘,其格式为PNG(原始格式为JPG):
1 2 |
# write the cropped image to disk in PNG format cv2.imwrite("thumbnail.png",cropped) |
这里我们做的是提供文件通道(第一参数)以及我们想要保存的图象(第二参数)。就是这么简单。
图6:我们现在将thumbnail.png存盘
如你所见,OpenCV满足我们改变格式的需求。
总之,在 Python and OpenCV中做基本图象处理!你自已动手写代码,试试你喜欢的侏罗纪图片。
如果你有问题,或是在评论中留言,或是给我发邮件--我很乐意帮忙。