在开始代码前需要先安装Python2.7和Opencv2/Opencv3。具体安装方式可以看OpenCV官网,或者百度。这里不做详细介绍。
我们使用侏罗纪公园视频的一张截图为例子:
首先我们加载图像并将其显示在屏幕上:
# 导入需要的包
import cv2
# 载入图像并显示
image = cv2.imread("jurassic-park-tour-jeep.jpg")
cv2.imshow("win", image)
cv2.waitKey(0)
执行这段代码,我们可以看到这样的结果:
分析下上面的代码:
- 第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像素宽:
分析下代码:
- 第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)
运行结果:
我们看下代码:
- 第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)
执行后的效果:
在OpenCV中进行图像剪裁非常简单,我们所作的就是切片数组。在Y轴上给出startY和endY,在X轴上给出startX和endX,然后切面。
最后一个例子,我们将剪裁的图像保存到磁盘,并保存为PNG格式(原图是JPG格式):
# 将剪切后的图片以PNG格式保存至磁盘
cv2.imwrite("thumbnail.png", cropped)
这里,我们提供的第一个参数是文件的路径,第二个参数是要保存的图像。OpenCV会根据我们给出的文件后缀名,自动生成保存的文件格式。