Python OpenCV图像处理与深度学习:Python OpenCV图像几何变换入门
图像变换:掌握OpenCV中的几何变换
学习目标
通过本课程,学员们将能够理解图像的几何变换原理,包括缩放、旋转和平移,并能够使用Python和OpenCV库实现这些变换。本课程将通过理论讲解与实践操作相结合的方式,帮助学员们掌握图像处理的基础技能。
相关知识点
- Python OpenCV图像变换
学习内容
1 Python OpenCV图像变换
1.1 图像缩放
图像缩放是图像处理中最基本的操作之一,它涉及到改变图像的大小。在OpenCV中,可以使用cv2.resize()
函数来实现图像的缩放。缩放图像时,可以指定新的图像尺寸,也可以指定缩放比例。缩放比例可以是放大也可以是缩小,这取决于比例系数的大小。
1.1.1 理论知识
图像缩放的基本原理是通过插值算法来估计新图像中每个像素的值。插值算法的选择会影响缩放后的图像质量。常见的插值算法包括最近邻插值、双线性插值和双三次插值。最近邻插值算法简单快速,但可能会导致图像质量下降;双线性插值和双三次插值算法虽然计算复杂度较高,但能够提供更好的图像质量。
在OpenCV中,cv2.resize()
函数的参数包括源图像、目标图像的尺寸以及插值方法。插值方法可以通过指定interpolation
参数来选择,例如cv2.INTER_NEAREST
(最近邻插值)、cv2.INTER_LINEAR
(双线性插值)、cv2.INTER_CUBIC
(双三次插值)等。
1.1.2 实践操作
执行以下指令获取测试图片。
wget https://model-community-picture.obs.cn-north-4.myhuaweicloud.com/ascend-zone/notebook_datasets/27ef5b722fa911f09b27fa163edcddae/example.jpg
下面是一个使用OpenCV进行图像缩放的示例代码:
import cv2
import matplotlib.pyplot as plt# 读取图像
image = cv2.imread('example.jpg')# 定义缩放比例
scale_percent = 50 # 缩小到50%
width = int(image.shape[1] * scale_percent / 100)
height = int(image.shape[0] * scale_percent / 100)
dim = (width, height)# 缩放图像
resized = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)
# 显示原始图像和缩放后的图像
# 将 BGR 格式转换为 RGB 格式,以适配 matplotlib 的显示
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
resized = cv2.cvtColor(resized, cv2.COLOR_BGR2RGB)
# 创建画布和子图(1行2列)
# 显示第一张图像
plt.subplot(1, 2, 1) # 1行2列,第1个位置
plt.imshow(image)
plt.title('Original Image')
# 显示第二张图像
plt.subplot(1, 2, 2) # 1行2列,第2个位置
plt.imshow(resized)
plt.title('Resized Image')
plt.tight_layout() # 自动调整布局
plt.show()
1.2 图像旋转
图像旋转是指将图像绕着某个点(通常是图像的中心点)旋转一定的角度。在OpenCV中,可以使用cv2.getRotationMatrix2D()
函数来获取旋转矩阵,然后使用cv2.warpAffine()
函数来应用旋转矩阵,实现图像的旋转。
1.2.1 理论知识
图像旋转的基本原理是通过旋转矩阵来变换图像中的每个像素。旋转矩阵是一个2x3的矩阵,其中前两列表示旋转和平移,第三列表示平移。旋转矩阵的计算公式为:
R=[cos(θ)−sin(θ)0sin(θ)cos(θ)0001]R = \begin{bmatrix} \cos(\theta) & -\sin(\theta) & 0 \\ \sin(\theta) & \cos(\theta) & 0 \\ 0 & 0 & 1 \end{bmatrix}R=cos(θ)sin(θ)0−sin(θ)cos(θ)0001
其中,θ\thetaθ 是旋转角度。为了确保旋转后的图像不会被裁剪,通常需要计算旋转后的图像尺寸,并在旋转矩阵中加入平移部分。
1.2.2 实践操作
下面是一个使用OpenCV进行图像旋转的示例代码:
import cv2
import numpy as np# 读取图像
image = cv2.imread('example.jpg')# 获取图像的中心点
(h, w) = image.shape[:2]
center = (w // 2, h // 2)# 定义旋转角度和缩放比例
angle = 45 # 旋转45度
scale = 1.0 # 保持原大小# 获取旋转矩阵
M = cv2.getRotationMatrix2D(center, angle, scale)# 应用旋转矩阵
rotated = cv2.warpAffine(image, M, (w, h))
# 显示原始图像和旋转后的图像
# 将 BGR 格式转换为 RGB 格式,以适配 matplotlib 的显示
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
rotated = cv2.cvtColor(rotated, cv2.COLOR_BGR2RGB)
# 创建画布和子图(1行2列)
# 显示第一张图像
plt.subplot(1, 2, 1) # 1行2列,第1个位置
plt.imshow(image)
plt.title('Original Image')
plt.axis('off')
# 显示第二张图像
plt.subplot(1, 2, 2) # 1行2列,第2个位置
plt.imshow(rotated)
plt.title('Rotated Image')
plt.axis('off')
plt.tight_layout() # 自动调整布局
plt.show()
1.3 图像平移
图像平移是指将图像中的所有像素沿水平和垂直方向移动一定的距离。在OpenCV中,可以使用cv2.warpAffine()
函数来实现图像的平移。平移矩阵是一个2x3的矩阵,其中前两列表示平移距离,第三列表示平移。
1.3.1 理论知识
图像平移的基本原理是通过平移矩阵来变换图像中的每个像素。平移矩阵的计算公式为:
T=[10tx01ty001] T = \begin{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{bmatrix} T=100010txty1
其中,txt_xtx 和 tyt_yty 分别是水平和垂直方向的平移距离。平移矩阵可以直接用于cv2.warpAffine()
函数,实现图像的平移。
1.3.2 实践操作
下面是一个使用OpenCV进行图像平移的示例代码:
import cv2
import numpy as np# 读取图像
image = cv2.imread('example.jpg')# 定义平移距离
tx = 100 # 水平方向平移100像素
ty = 50 # 垂直方向平移50像素# 构建平移矩阵
M = np.float32([[1, 0, tx], [0, 1, ty]])# 应用平移矩阵
translated = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
# 显示原始图像和平移后的图像
# 将 BGR 格式转换为 RGB 格式,以适配 matplotlib 的显示
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
translated = cv2.cvtColor(translated, cv2.COLOR_BGR2RGB)
# 创建画布和子图(1行2列)
# 显示第一张图像
plt.subplot(1, 2, 1) # 1行2列,第1个位置
plt.imshow(image)
plt.title('Original Image')
plt.axis('off')
# 显示第二张图像
plt.subplot(1, 2, 2) # 1行2列,第2个位置
plt.imshow(translated)
plt.title('Translated Image')
plt.axis('off')
plt.tight_layout() # 自动调整布局
plt.show()