任务描述
相关知识
使用OpenCV进行图片扩展缩放
使用OpenCV进行图片平移
使用OpenCV进行图片旋转
编程要求
测试说明
任务描述
本关任务:使用OpenCV编写程序,完成图片的缩放、平移和旋转。
相关知识
为了完成本关任务,你需要掌握:使用OpenCV对图片进行缩放、平移和旋转。
使用OpenCV进行图片扩展缩放
OpenCV提供了方便的接口函数使得我们可以快速地进行数据处理,使用OpenCV或简单的矩阵变换就能对一幅图像的形状和感兴趣区域实现各种操作。这里我们通过可以使用cv2.resize()实现图片两种形式的缩放。
扩展缩放
缩放 推荐使用 cv2.INTER_AREA,基于局部像素的重采样,
扩展 推荐使用 cv2.INTER_CUBIC,基于4x4像素邻域的3次插值法和 cv2.INTER_LINEAR,双线性插值法(默认)。
cv2.resize(src, dst,fx,fy, interpolation=CV_INTER_LINEAR)。
其中参数dst和参数 (fx, fy) 不能同时为 0。interpolation是插值方法,有以下5种:
INTER_NEAREST,最近邻插值法;
INTER_LINEAR,双线性插值法;
INTER_AREA,基于局部像素的重采样;
INTER_CUBIC, 基于 4x4 像素邻域的 3 次插值法;
INTER_LANCZOS4,基于 8x8 像素邻域的 Lanczos 插值。
下面给出示例,第一种缩放我们直接指定输出大小为(512,512):
import cv2
# 读取图片
color_lane = cv2.imread('./lane.jpg')
# 将图片放缩为512*512大小
resize_512_lane = cv2.resize(color_lane, (512, 512),interpolation=cv2.INTER_LINEAR)
图1-2-1 原图及放缩为512 * 512的车道线图片
除了指定固定大小进行缩放,我们还可以进行比例缩放,其中 fx 和 fy 用于指定缩放比例为0.5,则长宽都为原来一半:
import cv2
# 读取图片
color_lane = cv2.imread('./lane.jpg')
# 将图片长宽缩放为原来的1/2
resize_half_lane = cv2.resize(color_lane, (0, 0), fx=0.5, fy=0.5, interpolation=cv2.INTER_NEAREST)
图1-2-2 放缩为0.5倍后的车道线图片
使用OpenCV进行图片平移
OpenCV 提供了两个变换函数,cv2.warpAffine 和 cv2.warpPerspective,使用这两个函数你可以实现所有类型的变换。
cv2.warpAffine 接收的参数是2 × 3 的变换矩阵,而 cv2.warpPerspective 接收的参数是 3 × 3 的变换矩阵。
cv2.warpAffine(src, M, dsize, dst, flags, borderMode, borderValue)
其中:
src - 输入图像;
M - 变换矩阵;
dsize - 输出图像的大小,它的格式是图像的(宽,高);
flags - 插值方法,默认双线性插值;
borderMode - 边界像素模式;
borderValue - 边界填充值; 默认情况下,它为0,以黑色填充;
这里通过矩阵的取值操作实现裁减。
import cv2
import numpy as np
img = cv2.imread('../fodder/lane.jpg')
height, width, channel = img.shape
M = np.float32([[1, 0, 30], [0, 1, 60]]) # 构建移动矩阵,x轴左移30个像素,y轴下移60个
shifted = cv2.warpAffine(img, M, (width, height))
cv2.imshow('res', shifted)
cv2.waitKey(0)
cv2.destroyAllWindows()
使用OpenCV进行图片旋转
OpenCV 提供了一个函数:cv2.getRotationMatrix2D,可以图像旋转。参数包括旋转中心,旋转角度,缩放因子。
import cv2
import numpy as np
img = cv2.imread('../fodder/lane.jpg')
cv2.imshow('img', img)
rows, cols, depth = img.shape
M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 45, 0.6) # 旋转中心,旋转角度,缩放因子,这里缩放因子的作用是变为原来的0.6倍
dst = cv2.warpAffine(img, M, (cols, rows)) # M放射变换矩阵。(cols,rows)是旋转中心,可以通过旋转中心来调节dst大小。
cv2.imshow('res', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
编程要求
根据提示,在右侧编辑器补充代码,根据注释要求,对图片进行图片的扩展放缩、平移和旋转并保存图片。
测试说明
平台会对你编写的代码进行测试。
开始你的任务吧,祝你成功!
import cv2
import numpy as np
img = cv2.imread('str/step1/image/lane.jpg')
l, w, h = img.shape
# 放大图像至原来的两倍,使用双线性插值法
########## Begin ##########
resized_img = cv2.resize(img, (0, 0), fx=2, fy=2, interpolation=cv2.INTER_LINEAR)
########## End ##########
height, width, channel = resized_img.shape
# 构建移动矩阵, x轴左移 30 个像素,y轴下移 60 个像素
########## Begin ##########
M = np.float32([[1, 0, 30], [0, 1, 60]])
shifted = cv2.warpAffine(resized_img, M, (width, height))
########## End ##########
# 构建矩阵,旋转中心坐标为处理后图片长宽的一半,旋转角度为45度,缩放因子为1
########## Begin ##########
center = (width // 2, height // 2)
angle = 45
scale = 1
M = cv2.getRotationMatrix2D(center, angle, scale)
rotated = cv2.warpAffine(shifted, M, (width, height))
########## End ##########
cv2.imwrite('str/step1/out/out.png', rotated)