在Python and OpenCV中做图象处理:改变大小,旋转和裁剪(翻译)

Pythonand OpenCV中做图象处理:改变大小,旋转和裁剪(翻译)

 

原文链接: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中做基本图象处理!你自已动手写代码,试试你喜欢的侏罗纪图片。

如果你有问题,或是在评论中留言,或是给我发邮件--我很乐意帮忙。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值