(03)python-opencv图像处理——图像的几何变换

前言

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博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欲游山河十万里

你的鼓励是我们创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值