Python和OpenCV中的基本图像操作:缩放、旋转和剪裁

在开始代码前需要先安装Python2.7和Opencv2/Opencv3。具体安装方式可以看OpenCV官网,或者百度。这里不做详细介绍。

我们使用侏罗纪公园视频的一张截图为例子:

《Python和OpenCV中的基本图像操作:缩放、旋转和剪裁》 图1 侏罗纪公园截图

首先我们加载图像并将其显示在屏幕上:

# 导入需要的包
import cv2

# 载入图像并显示
image = cv2.imread("jurassic-park-tour-jeep.jpg")
cv2.imshow("win", image)
cv2.waitKey(0)

执行这段代码,我们可以看到这样的结果:

《Python和OpenCV中的基本图像操作:缩放、旋转和剪裁》 图2 载入并显示图片

分析下上面的代码:

  • 第2行:告诉Python解释器导入Opencv包
  • 第5行:从磁盘加载图像。imread函数将返回一个Numpy数组,表示图像本身
  • 第6行和第7行:imshow函数在屏幕显示图像。第一个参数是一个字符串,是显示图像窗口的名称。第二个参数是图像的引用。最后,调用waitKey函数暂停脚本执行,直到我们按下键盘上的一个键。参数“0”表示无限期等待,也可以给一个其他的值,表示以毫秒为单位的等待时长,比如“5000”,那代码将等待5秒后继续执行。
# 输出图像尺寸
print image.shape

执行该代码,我们看到(388,647,3)输出到控制台。这表示这个图像有388行,647列以及3个颜色通道(RGB)。

提示:当我们获取图像尺寸时,获取的是(行,列,颜色通道)这样的值。但是我们在指定图像尺寸时,我们应该给出(列,行)这样的值,顺序是有差别的。这可能会造成一些混乱,我们自己要记清楚。

现在我们知道图像的宽度是647像素,我们将宽度调整为100像素:

# 保持图片的宽高等比例缩放,以保证图片显示不变形
# 计算新图片相对于旧图片的比例
r = 100.0/image.shape[1]
dim = (100, int(image.shape[0]*r))

# 执行图片缩放,并显示
resized = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)
cv2.imshow("resized", resized)
cv2.waitKey(0)

执行代码,我们看到新的图像只有100像素宽:

《Python和OpenCV中的基本图像操作:缩放、旋转和剪裁》 图3 将图像调整为100像素宽

分析下代码:

  • 第3行和第4行:为了防止变形,我们必须保持图像的长宽比。为了让图像调整为100像素宽,我们计算出新宽度与旧宽度的比值r,然后,我们用比值r乘以旧高度,得到新高度。
  • 第7行:实际调整图像尺寸是在这行,第一个参数是原始图像,第二个参数是目标图像的尺寸(宽,高),第三个参数是调整图像尺寸时,使用的算法函数,现在我们不用关心具体实现细节。

接下来,我们旋转图片:

# 获取图片尺寸并计算图片中心点
(h, w) = image.shape[:2]
center = (w/2, h/2)

# 将图像旋转180度
M = cv2.getRotationMatrix2D(center, 180, 1.0)
rotated = cv2.warpAffine(image, M, (w, h))
cv2.imshow("rotated", rotated)
cv2.waitKey(0)

运行结果:

《Python和OpenCV中的基本图像操作:缩放、旋转和剪裁》 图4 图片被翻转180度

我们看下代码:

  • 第2行:为了方便使用,我们获取图像的宽度和高度,并保存到相应变量中
  • 第3行:计算图像的中心点,这里我们简单的将宽度和高度各除以2
  • 第6行:计算用于旋转图像的矩阵。第一个参数是旋转的中心点,这里我们让它绕图片中心点进行旋转,当然也可以围绕其它点旋转。第二个参数是旋转的角度,以度为单位。第三个参数是缩放比例,这是是1.0,就是保持图像尺寸不变。如果我们希望旋转后的图像减半,我们使用0.5。
  • 第7行:通过提供图像、旋转矩阵和输出尺寸执行实际的旋转。
  • 第8行和第9行:显示旋转后的图像。

我们再来做一个图像的部分截图:

# 使用numpy数组切片对图像进行剪裁
cropped = image[70:170, 440:540]
cv2.imshow("cropped", cropped)
cv2.waitKey(0)

执行后的效果:

《Python和OpenCV中的基本图像操作:缩放、旋转和剪裁》 图5 对图像进行剪裁

在OpenCV中进行图像剪裁非常简单,我们所作的就是切片数组。在Y轴上给出startY和endY,在X轴上给出startX和endX,然后切面。
最后一个例子,我们将剪裁的图像保存到磁盘,并保存为PNG格式(原图是JPG格式):

# 将剪切后的图片以PNG格式保存至磁盘
cv2.imwrite("thumbnail.png", cropped)

这里,我们提供的第一个参数是文件的路径,第二个参数是要保存的图像。OpenCV会根据我们给出的文件后缀名,自动生成保存的文件格式。

    原文作者:luohuayong
    原文地址: https://www.jianshu.com/p/40206f0a6658
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞