本期将了解图像的几何变换。几何变换是指改变图像的几何结构,例如大小、角度和形状等,让图像呈现出缩放、翻转、映射和透视的效果。
完成本期内容,你可以:
- 了解几何变换的定义
- 掌握几何变换的原理和使用
若要运行案例代码,你需要有:
-
操作系统:Ubuntu 16 以上 或者 Windows10
-
工具软件:VScode 或者其他源码编辑器
-
硬件环境:无特殊要求
-
核心库:python 3.6.13, opencv-contrib-python 3.4.11.39,opencv-python 3.4.2.16
点击下载源码
图像缩放
OpenCV中提供的图像缩放的函数是cv2.resize()。
函数原型: dst = cv2.resize(src, dsize, fx, fy, interpolation);
dst为变换后的图像。
参数描述如下:
参数 | 描述 |
---|---|
src | 原始图像 |
dsize | 输出图像的大小 |
fx | 可选参数,水平方向的缩放比例 |
fy | 可选参数,竖直方向的缩放比例 |
interpolation | 可选参数,缩放的插值方式,在图像缩小或放大时需要删减或补充像素,该参数可以指定使用哪种算法对像素进行增减。建议使用默认值。 |
仿射变换
仿射变换是一种仅发生在二维平面内的几何变换,变换之后的图像仍然可以保持直线的“平直性”和“平行性”,也就是说原来的直线变换之后还是直线,平行线变换之后还是平行线。常见的仿射变换包含:平移、旋转和倾斜。
OpenCV中提供的用于仿射变换的函数是cv2.warpAffine()。
函数原型: dst = cv2.warpAffine(src, M, dsize, flags, borderMode,borderValue);
dst为变换后的图像
参数描述如下:
参数 | 描述 |
---|---|
src | 原始图像 |
M | 矩阵,根据此矩阵的值变换原图中的像素位置 |
dsize | 输出图像的尺寸大小 |
flags | 可选参数,插值方式,建议使用默认值 |
borderMode | 可选参数,边界类型,建议使用默认值 |
borderValue | 可选参数,边界值,默认为0,建议使用默认值 |
平移
- 平移的仿射矩阵M
旋转
OpenCV中提供的用于获取旋转矩阵的函数是cv2.getRotationMatrix2D()。
函数原型: retval=cv2.getRotationMatrix2D(center, angle, scale)
retal为转换矩阵。
参数描述如下:
参数 | 描述 |
---|---|
center | 旋转的中心点 |
angle | 旋转角度,正数表示逆时针旋转、负数表示顺时针旋转 |
scale | 变换尺度(缩放大小) |
倾斜
OpenCV中提供的用于获取倾斜矩阵的函数是cv2.getPerspectiveTransform()。
函数原型: retval = cv2.getPerspectiveTransform( src, dst )
retal为转换矩阵。
参数描述如下:
参数 | 描述 |
---|---|
src | 输入图像的四个点坐标 |
dst | 输出图像的四个点坐标 |
具体步骤
1. 创建项目结构
创建项目名为使用几何变换让图像动起来
,项目根目录下新建code
文件夹储存代码,新建dataset
文件夹储存数据,项目结构如下:
使用几何变换让图像动起来 # 项目名称
├── code # 储存代码文件
├── dataset # 储存数据文件
注:如项目结构已存在,无需再创建。
2. 使用图像几何变换将图像缩小
- 在
code
文件夹下创建downsize.py
文件; - 读取
dataset
文件夹下的scenery.png
图片,并进行展示 ; - 将图像缩小一半;
- 将缩小后的图片保存至
dataset
文件夹,名为scenery1.png
- 无限等待用户输入按键,按下按键后销毁所有窗口。
代码实现
# 导入OpenCV
import cv2
# 读取图像
img = cv2.imread("../dataset/scenery.png")
# 将图像缩小一半
dst = cv2.resize(img, (0, 0),fx=0.5,fy=0.5)
# 保存缩小后的图像
cv2.imwrite('../dataset/scenery1.png',dst)
# 显示图像
cv2.imshow("img", img)
cv2.imshow("dst2", dst)
cv2.waitKey()
cv2.destroyAllWindows()
3. 使用几何变换进行图像平移
- 在
code
文件夹下创建pan.py
文件; - 读取
dataset
文件夹下的scenery.png
图片,并进行展示 ; - 将图像向右平移50像素,向下平移100像素,并进行展示;
- 无限等待用户输入按键,按下按键后销毁所有窗口。
代码实现
# 导入OpenCV、NumPy
import cv2
import numpy as np
# 读取图像
img = cv2.imread("../dataset/scenery.png") # 读取图像
# 获取图像尺寸
rows = img.shape[0] # 图像像素行数
cols = img.shape[1] # 图像像素列数
# 平移矩阵M
M = np.float32([[1, 0, 50], # 横坐标向右移动50像素
[0, 1, 100]]) # 纵坐标向下移动100像素
# 仿射变换
dst = cv2.warpAffine(img, M, (cols, rows))
cv2.imshow("img", img) # 显示原图
cv2.imshow("dst", dst) # 显示仿射变换效果
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 释放所有窗体
4. 使用几何变换将图像进行旋转
- 在
code
文件夹下创建rotate.py
文件; - 读取
dataset
文件夹下的scenery.png
图片,并进行展示 ; - 将图像以图像中心点为中心,逆时针旋转30度,缩小0.7倍,并进行展示;
- 无限等待用户输入按键,按下按键后销毁所有窗口。
代码实现
# 导入OpenCV
import cv2
# 读取图像
img = cv2.imread("../dataset/scenery.png")
# 获取像素尺寸,确定旋转中心点
rows = img.shape[0] # 图像像素行数
cols = img.shape[1] # 图像像素列数
center = (rows / 2, cols / 2) # 图像的中心点
# 图像旋转
M = cv2.getRotationMatrix2D(center, 30, 0.7) # 以图像为中心,逆时针旋转30度,缩放0.8倍
dst = cv2.warpAffine(img, M, (cols, rows)) # 按照M进行仿射
cv2.imshow("img", img) # 显示原图
cv2.imshow("dst", dst) # 显示仿射变换效果
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 释放所有窗体
图像的几何变换在图像预处理的过程中用到的很多,对于一些拍摄角度存在偏差的图像,进行角度的调整有这非常好的效果。
点击下载源码