机器视觉学习(五)—— 图像的几何

一、图像的几何变化

图像的几何变化指的是通过改变图像的位置、尺寸和方向等参数来实现的图像变换。常见的图像几何变化包括平移、旋转、缩放和翻转等。

  1. 平移:将图像在平面上按照指定的平移距离水平或垂直移动。

  2. 旋转:按照指定的角度将图像绕中心或其他指定点进行旋转。

  3. 缩放:按照指定的比例增大或缩小图像的尺寸。

  4. 翻转:在水平或垂直方向上反转图像,得到镜像效果。

除了上述基本的几何变换,还可以进行透视变换、扭曲变换、仿射变换等复杂的图像变换,实现更加丰富的效果。

1.1 图像的翻转

在OpenCV中,可以使用函数cv2.flip()来实现图像的翻转。该函数接受三个参数:

  • src:要翻转的输入图像。
  • flipCode:指定翻转的方式。可以是以下三个值之一:
    • 0:沿x轴翻转(垂直翻转)。
    • 1:沿y轴翻转(水平翻转)。
    • -1:同时沿x轴和y轴翻转(同时水平和垂直翻转)。
  • dst:可选参数,指定输出图像。如果不提供,则函数会在原始图像上进行翻转。

下面是一个使用cv2.flip()函数来对图像进行翻转的示例:

python 复制代码
import cv2

# 加载图像
image = cv2.imread('image.png')            # 在运行代码时将image.png替换为您的图像文件路径

# 垂直翻转图像
flipped_image = cv2.flip(image, 0)

# 水平翻转图像
flipped_image = cv2.flip(image, 1)

# 同时水平和垂直翻转图像
flipped_image = cv2.flip(image, -1)

# 显示原始图像和翻转后的图像
cv2.imshow('Original', image)              # 显示图像
cv2.imshow('Flipped', flipped_image)
cv2.waitKey(0)                             # 等待用户按下任意键
cv2.destroyAllWindows()                    # 关闭窗口

1.2 图像的仿射变化

cv2.warpAffine()是OpenCV中的一个函数,用于对图像进行仿射变换。仿射变换是一种线性变换,可以用来旋转、平移、缩放和剪切图像。

函数原型如下: dst = cv2.warpAffine(src, M, dsize, dst\[, flags\[, borderMode\[, borderValue]]])

参数解释:

  • src:输入图像。
  • M:仿射变换的3x2变换矩阵。可以通过cv2.getRotationMatrix2D()、cv2.getAffineTransform()等函数获得。
  • dsize:输出图像的大小。
  • dst(可选):输出图像。
  • flags(可选):插值方法的标志。默认值为cv2.INTER_LINEAR,可选的插值方法有:
    • cv2.INTER_NEAREST:最近邻插值。
    • cv2.INTER_LINEAR:双线性插值。
    • cv2.INTER_CUBIC:双三次插值。
    • cv2.INTER_LANCZOS4:Lanczos插值。
  • borderMode(可选):边界填充模式。默认为cv2.BORDER_CONSTANT,可选的边界填充模式有:
    • cv2.BORDER_CONSTANT:边界填充为常数,默认为黑色。
    • cv2.BORDER_REPLICATE:边界复制。
    • cv2.BORDER_REFLECT:边界反射。
    • cv2.BORDER_REFLECT_101:边界反射101。
    • cv2.BORDER_WRAP:边界包裹。
  • borderValue(可选):边界填充的值,当borderMode为cv2.BORDER_CONSTANT时生效。

函数返回值:

  • dst:仿射变换后的图像。

变换矩阵是一个2x3的矩阵,可以通过cv2.getAffineTransform()函数来计算。变换矩阵需要三个点的坐标作为输入,分别是原始图像中的三个点和目标图像中的三个点。

下面是一个使用OpenCV进行仿射变换的示例代码:

python 复制代码
import cv2
import numpy as np

# 读取图像
img = cv2.imread(image.png')      # 在运行代码时将image.png替换为您的图像文件路径

# 原始图像中的三个点
pts1 = np.float32([[50,50], [200,50], [50,200]])

# 目标图像中的三个点
pts2 = np.float32([[10,100], [200,50], [100,250]])

# 计算变换矩阵
M = cv2.getAffineTransform(pts1, pts2)

# 进行仿射变换
dst = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))

# 显示结果
cv2.imshow('Original Image', img)     # 名称可修改
cv2.imshow('Transformed Image', dst)     # 名称可修改
cv2.waitKey(0)
cv2.destroyAllWindows()

在上面的代码中,我们首先读取一张图像,然后定义了原始图像中的三个点和目标图像中的三个点。接下来,我们使用cv2.getAffineTransform()函数计算变换矩阵,然后使用cv2.warpAffine()函数进行变换。最后,我们将原始图像和变换后的图像显示出来。

运行上述代码后,你将会看到原始图像和进行了仿射变换后的图像。

1.3 图像的平移

上述中提到,我们可以使用cv2.warpAffine()函数。该函数可以根据指定的平移参数对图像进行平移操作。

以下是一个简单的例子,展示如何使用OpenCV对图像进行平移:

python 复制代码
import cv2
import numpy as np

# 读取图像
img = cv2.imread('image.jpg')    # 在运行代码时将image.jpg替换为您的图像文件路径

# 获取图像的高度和宽度
height, width = img.shape[:2]

# 定义平移矩阵
M = np.float32([[1, 0, 100], [0, 1, 50]])

# 使用平移矩阵进行图像平移
translated_img = cv2.warpAffine(img, M, (width, height))

# 显示原始图像和平移后的图像
cv2.imshow('Original Image', img)
cv2.imshow('Translated Image', translated_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中,我们先读取了一张图像,并使用img.shape[:2]获取图像的高度和宽度。然后,我们定义了一个2x3的平移矩阵M,其中M[0,2]表示水平平移量,M[1,2]表示垂直平移量。在本例中,我们将图像向右平移100个像素,向下平移50个像素。

最后,我们使用cv2.warpAffine()函数对图像进行平移操作,传入参数为原始图像、平移矩阵M以及输出图像的大小。平移后得到的图像存储在translated_img变量中,并通过cv2.imshow()函数显示出来。

注意:

平移后的图像可能会超出原始图像的边界,因此可以根据需要调整平移参数以确保图像不被裁剪。

相关推荐
YOLO数据集集合37 分钟前
风机叶片表面损伤检测数据集 | 风机叶片 表面损伤 污渍检测 无人机巡检 风电运维9119期
运维·人工智能·计算机视觉·目标跟踪·无人机·智慧城市·电力巡检
摆烂z1 小时前
多模态大模型微调笔记
笔记
胡二拉二胡2 小时前
抗遗忘单词表深度评测:FSRS 算法与学练考闭环实测
经验分享·笔记
用户14036058193832 小时前
Phase A · Step 2:预训练权重与 Pipeline 验证准备
笔记
小蒋观天下2 小时前
行业拆解|两轮车检测AI摄像头的核心技术迭代、产品演进及未来技术发展
大数据·人工智能·安全·计算机视觉·ai大模型
鬼手点金3 小时前
Claude Code示范案例-常用快捷命令
java·服务器·前端·计算机视觉·前向传播
旖旎夜光4 小时前
LeetCode 137 : 只出现一次的数字 II(位运算) —— 题解
c++·笔记·学习·算法·leetcode·力控
金色光环5 小时前
概率论笔记:连续型随机变量函数的分布与尺度变换 连续型随机变量函数的分布:定义法与公式法推导
笔记·概率论
维克兜率天6 小时前
【维克】均值回归:跌多了会涨,涨多了会跌
开发语言·笔记·python·算法·均值算法·回归·量化
zhangrelay6 小时前
ROS2 Lyrical实验5导航Nav2
linux·笔记·学习·ubuntu·机器人