day7 - 使用几何变换让图像动起来

本期将了解图像的几何变换。几何变换是指改变图像的几何结构,例如大小、角度和形状等,让图像呈现出缩放、翻转、映射和透视的效果。

完成本期内容,你可以:

  • 了解几何变换的定义
  • 掌握几何变换的原理和使用

若要运行案例代码,你需要有:

  • 操作系统: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. 使用图像几何变换将图像缩小

  1. code文件夹下创建downsize.py文件;
  2. 读取dataset文件夹下的scenery.png图片,并进行展示 ;
  3. 将图像缩小一半;
  4. 将缩小后的图片保存至dataset文件夹,名为scenery1.png
  5. 无限等待用户输入按键,按下按键后销毁所有窗口。

代码实现

# 导入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. 使用几何变换进行图像平移

  1. code文件夹下创建pan.py文件;
  2. 读取dataset文件夹下的scenery.png图片,并进行展示 ;
  3. 将图像向右平移50像素,向下平移100像素,并进行展示;
  4. 无限等待用户输入按键,按下按键后销毁所有窗口。

代码实现

# 导入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. 使用几何变换将图像进行旋转

  1. code文件夹下创建rotate.py文件;
  2. 读取dataset文件夹下的scenery.png图片,并进行展示 ;
  3. 将图像以图像中心点为中心,逆时针旋转30度,缩小0.7倍,并进行展示;
  4. 无限等待用户输入按键,按下按键后销毁所有窗口。

代码实现

# 导入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()  # 释放所有窗体

请添加图片描述

实验效果

图像的几何变换在图像预处理的过程中用到的很多,对于一些拍摄角度存在偏差的图像,进行角度的调整有这非常好的效果。

点击下载源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值