openCV——几何变换

本文介绍了OpenCV中图像处理的基本操作,包括使用cv2.resize()进行图像缩放,通过cv2.flip()实现图像翻转,以及利用仿射变换cv2.warpAffine()进行图像的平移、旋转等操作。详细讲解了各函数的参数及应用场景,并给出了相应的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

几何变换

openCV中读入的图像数据是以(h,w,c)的顺序构建数据的。并且数据的类型都为uint8.通道顺序为BGR!!!

import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline 
def cvshow(name, image):
    cv2.imshow(name, image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

缩放

dst = cv2.resize( src, dsize[, fx[, fy[, interpolation]]] )

  • dst代表输出的目标图像,该图像的类型与 src 相同,其大小为 dsize(当该值非零时),或者可以通过 src.size()、fx、fy 计算得到。
  • src代表需要缩放的原始图像
  • dsize 代表输出图像大小
  • fx 代表水平方向的缩放比例
  • fy 代表垂直方向的缩放比例
  • interpolation 代表插值方式,如下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zFq4UUAc-1650529848601)(attachment:image-2.png)]

cv2.resize()函数中,目标图像的大小可以通过“参数 dsize”或者“参数 fx 和 fy”二者之一来指定

  • 情况 1:通过参数 dsize 指定:如果指定参数 dsize 的值,则无论是否指定了参数 fx 和 fy 的值,都由参数 dsize 来决定目标图像的大小。dsize 内第 1 个参数对应缩放后图像的宽度(width,即列数 cols,与参数 fx 相关),第 2 个参数对应缩放后图像的高度(height,即行数 rows,与参数 fy 相关)
  • 情况 2:通过参数 fx 和 fy 指定:只需要指定缩放比例
lena = cv2.imread("lena.jpg")
print(lena.shape)
tar = cv2.resize(lena, dsize=None, fx=2, fy=0.5)
cvshow("tar", tar)
print(tar.shape)
(263, 263, 3)
(132, 526, 3)

可以看出,fx对列数变换,fy对行数变换

翻转

OpenCV 中,图像的翻转采用函数 cv2.flip()实现,该函数能够实现图像在水平方向翻转、垂直方向翻转、两个方向同时翻转:

  • dst = cv2.flip( src, flipCode )
    • dst 代表和原始图像具有同样大小、类型的目标图像
    • src 代表要处理的原始图像
    • flipCode 代表旋转类型

在这里插入图片描述

x = cv2.flip(lena, -1)
cvshow("x", x)

仿射变换

仿射变换是指图像可以通过一系列的几何变换来实现平移、旋转等多种操作

dst = cv2.warpAffine( src, M, dsize[, flags[, borderMode[, borderValue]]] )

  • dst 代表仿射后的输出图像,该图像的类型和原始图像的类型相同。dsize 决定输出图像的实际大小
  • src 代表要仿射的原始图像
  • M 代表一个 2×3 的变换矩阵。使用不同的变换矩阵,就可以实现不同的仿射变换
  • dsize 代表输出图像的尺寸大小
  • flags 代表插值方法,默认为 INTER_LINEAR
  • borderMode 代表边类型, 默认为 BORDER_CONSTANT 。 当 该值为 BORDER_TRANSPARENT 时,意味着目标图像内的值不做改变,这些值对应原始图像内的异常
  • borderValue 代表边界值,默认是 0

忽略其可选参数后的语法格式为:dst = cv2.warpAffine( src , M , dsize )

在这里插入图片描述

平移

通过转换矩阵 M 实现将原始图像 src 转换为目标图像 dst:

  • dst(𝑥, 𝑦) = src(𝑀11𝑥 + 𝑀12𝑦 + 𝑀13, 𝑀21𝑥 + 𝑀22𝑦 + 𝑀23)

将原始图像 src 向右侧移动 100 个像素、向下方移动 200 个像素,则其对应关系为:dst (x, y) = src (x + 100, y + 200) 即:

  • dst (x, y) = src (1·x + 0·y + 100, 0·x + 1·y + 200)

所以:M11=1,M12=0,M13=100,M21=0,M22=1,M23=200

height, width = lena.shape[:2]
M = np.array([[1, 0, 50], [0, 1, 100]], np.float32)
res = cv2.warpAffine(lena, M, (height, width))
res.shape
con = np.hstack((lena, res))
cvshow("con", con)
旋转

在使用函数 cv2.warpAffine()对图像进行旋转时,可以通过函数 cv2.getRotationMatrix2D()获取转换矩阵。

retval=cv2.getRotationMatrix2D(center, angle, scale)

  • center 为旋转的中心点
  • angle 为旋转角度,正数表示逆时针旋转,负数表示顺时针旋转
  • scale 为变换尺度(缩放大小)
height, width = lena.shape[:2]
matrix = cv2.getRotationMatrix2D((height/2, width/2), 45, 0.88)
res = cv2.warpAffine(lena, matrix, (height, width))
wer = np.hstack((lena, res))
cvshow("wer", wer)

更复杂的仿射变换

对于更复杂仿射变换,OpenCV 提供了函数 cv2.getAffineTransform()来生成仿射函数 cv2.warpAffine()所使用的转换矩阵 M

retval=cv2.getAffineTransform(src, dst)

  • src 代表输入图像的三个点坐标
  • dst 代表输出图像的三个点坐标

在该函数中,其参数值 src 和 dst 是包含三个二维数组(x, y)点的数组。上述参数通过函数cv2.getAffineTransform()定义了两个平行四边形。src 和 dst 中的三个点分别对应平行四边形的左上角、右上角、左下角三个点。函数 cv2.warpAffine()以函数 cv2.getAffineTransform()获取的转换矩阵 M 为参数,将 src 中的点仿射到 dst 中。函数 cv2.getAffineTransform()对所指定的点完成映射后,将所有其他点的映射关系按照指定点的关系计算确定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值