前言
1、变换
2、缩放
3、平移变换
4、旋转
5、仿射变换
6、翻转
参考文献
前言
在本教程中:
- 你将会学到将不同的几何变换应用于图像,如平移、旋转、仿射变换等。
- 你会学到如下函数:cv.getPerspectiveTransform
图像的几何变换是图像处理和图像分析的基础内容之一。图像几何变换又称为图像空间变换, 它将一幅图像中的坐标位置映射到另一幅图像中的新坐标位置。几何变换的特点是改变图像像素的空间位置,而不改变像素灰度值。
图像的几何变换主要包括:
位置变换:图像的平移、镜像、旋转
形状变换:图像的缩放
仿射变换
1、变换
OpenCV 提供了两个变换函数, cv.warpAffine 和 cv.getPerspectiveTransform ,用这两个函数就可以完成所有类型的变换。 cv.warpAffine 输入为 2x3 的变换矩阵, cv.getPerspectiveTransform 输入为 2x3 的变换矩阵。
2、缩放
缩放是调整图片的大小。 OpenCV 使用 cv.resize() 函数进行调整。可以手动指定图像的大小,也可以指定比例因子。可以使用不同的插值方法。对于下采样(图像上缩小),最合适的插值方法是 cv.INTER_AREA 对于上采样(放大),最好的方法是 cv.INTER_CUBIC (速度较慢)和 cv.INTER_LINEAR (速度较快)。默认情况下,所使用的插值方法都是 cv.INTER_AREA 。你可以使用如下方法调整输入图片大小:
示例如下所示:
import cv2
# 读取图像
image = cv2.imread('images/demo2.png')
# 指定新的宽度和高度,使用 cv.INTER_LINEAR 插值进行放大
new_width = 200
new_height = 200
resized_image_linear = cv2.resize(image, (new_width, new_height), interpolation=cv2.INTER_LINEAR)
# 使用 cv.INTER_CUBIC 插值方法进行放大
resized_image_cubic = cv2.resize(image, (new_width, new_height), interpolation=cv2.INTER_CUBIC)
# 使用比例因子 0.5 对图像进行下采样,使用 cv.INTER_AREA 插值
scale_percent = 50 # 缩小 50%
width = int(image.shape[1] * scale_percent / 100)
height = int(image.shape[0] * scale_percent / 100)
resized_image_area = cv2.resize(image, (width, height), interpolation=cv2.INTER_AREA)
# 显示调整后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Resized Image (Linear)', resized_image_linear)
cv2.imshow('Resized Image (Cubic)', resized_image_cubic)
cv2.imshow('Resized Image (Area)', resized_image_area)
# 等待按键退出
cv2.waitKey(0)
cv2.destroyAllWindows()
- cv2.resize(): 该函数用于缩放图像。你可以指定新尺寸
(new_width, new_height)
,也可以用比例因子来缩放图像。 - 插值方法:
cv2.INTER_LINEAR
: 线性插值,适合放大图像时,速度较快。cv2.INTER_CUBIC
: 三次插值,质量较高,适合放大图像时,速度较慢。cv2.INTER_AREA
: 像素区域插值,适合下采样(缩小图像时),速度和效果较好。
3、平移变换
平移变换是物体位置的移动。如果知道 (x,y) 方向的偏移量,假设为 (t_x,t_y),则可以创建如下转换矩阵 M:
您可以将变换矩阵存为 np.float32 类型的 numpy 数组,并将其作为 cv.warpAffine 的第二个参数。请参见以下转换(100,50)的示例:
import cv2
import numpy as np
# 读取图像
image = cv2.imread('input_image.jpg')
# 图像尺寸
rows, cols = image.shape[:2]
# 定义平移矩阵,移动 100 个像素在 x 方向,50 个像素在 y 方向
M = np.float32([[1, 0, 100], [0, 1, 50]])
# 应用平移
shifted_image = cv2.warpAffine(image, M, (cols, rows))
# 显示原图像和平移后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Shifted Image', shifted_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
4、旋转
以
角度旋转图片的转换矩阵形式为:
但 Opencv 提供了可变旋转中心的比例变换,所以你可以在任意位置旋转图片,修改后的转换矩阵为:
其中:
为了找到这个转换矩阵,opencv 提供了一个函数, cv.getRotationMatrix2D 。请查看下面的示例,它将图像相对于中心旋转 90 度,而不进行任何缩放。
import cv2
import numpy as np
# 读取图像
image = cv2.imread('images/demo2.png')
# 获取图像的尺寸(行数和列数)
rows, cols = image.shape[:2]
# 获取旋转矩阵,旋转中心为图像的中心,旋转角度为 45 度,缩放比例为 1.0
center = (cols / 2, rows / 2)
angle = 45 # 旋转角度
scale = 1.0 # 缩放比例
M = cv2.getRotationMatrix2D(center, angle, scale)
# 使用仿射变换进行旋转,输出图像的尺寸与输入图像相同
rotated_image = cv2.warpAffine(image, M, (cols, rows))
# 显示原图像
cv2.imshow('Original Image', image)
# 显示旋转后的图像
cv2.imshow('Rotated Image', rotated_image)
# 等待用户按键关闭窗口
cv2.waitKey(0)
# 销毁所有窗口
cv2.destroyAllWindows()
5、仿射变换
在仿射变换中,原始图像中的所有平行线在输出图像中仍然是平行的。为了找到变换矩阵,我们需要从输入图像中取三个点及其在输出图像中的对应位置。然后 cv.getPerspectiveTransform 将创建一个 2x3 矩阵,该矩阵将传递给 cv.warpAffine 。
示例
假设我们有一张图像,我们想对其进行仿射变换,比如将图像旋转和缩放。我们将选择三个点,并定义它们在输入图像和输出图像中的对应位置。
import cv2
import numpy as np
# 读取输入图像
image = cv2.imread('images/demo2.png')
# 定义输入图像中的三个点 (x, y) 坐标
points_input = np.float32([[50, 50], [200, 50], [50, 200]])
# 定义输出图像中对应的三个点
points_output = np.float32([[10, 100], [200, 50], [100, 250]])
# 计算仿射变换矩阵
M = cv2.getAffineTransform(points_input, points_output)
# 使用仿射变换矩阵进行变换
rows, cols = image.shape[:2]
warped_image = cv2.warpAffine(image, M, (cols, rows))
# 显示原图像和变换后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Warped Image', warped_image)
# 等待用户按键关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
6、翻转
旋转和翻转的区别:
-
旋转是指以图形
某个点为中心
,发生角度的变化。注意在旋转过程中,是图形整体都发生了角度变化,而图形各元素之间的相对位置没有改变 -
翻转(也叫镜像)是指图形围
绕着翻转轴
,做空间180°的运动,可知翻转过后得到的图形与原图形关于翻转轴对称
import cv2
# 读取图像
image = cv2.imread('images/demo2.png')
# 翻转图像
# 0 表示围绕 x 轴翻转(垂直翻转)
flipped_image_vertical = cv2.flip(image, 0)
# 1 表示围绕 y 轴翻转(水平翻转)
flipped_image_horizontal = cv2.flip(image, 1)
# -1 表示同时围绕 x 轴和 y 轴翻转
flipped_image_both = cv2.flip(image, -1)
# 显示原图像和翻转后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Flipped Image (Vertical)', flipped_image_vertical)
cv2.imshow('Flipped Image (Horizontal)', flipped_image_horizontal)
cv2.imshow('Flipped Image (Both)', flipped_image_both)
cv2.waitKey(0)
cv2.destroyAllWindows()
参考文献
4. 图像处理 - 图像的几何变换 - 《OpenCV 中文文档 4.0.0》 - 书栈网 · BookStack
openCV学习笔记(四)--图像的几何变换Geometric Transformations of Images_opencv translation 理解-CSDN博客
基于OpenCv的图像几何变换-CSDN博客
2、OpenCV 图像的几何变换(Python 接口)_图像几何变换-CSDN博客
2、OpenCV 图像的几何变换(Python 接口)_图像几何变换-CSDN博客