05 -- OpenCV学习—图像旋转和变换

1.图像旋转

图像旋转是指图像按照某个位置转动一定角度的过程,旋转中图像仍保持这原始尺寸。图像旋转后图像的水平对称轴、垂直对称轴及中心坐标原点都可能会发生变换,因此需要对图像旋转中的坐标进行相应转换。
假设图像逆时针旋转θ,则根据坐标转换可得旋转转换为:

x′=rcos⁡(α−θ)
y′=rsin⁡(α−θ)

也可以写成:

x′=xcos⁡θ+ysin⁡θ
y′=−xsin⁡θ+ycos⁡θ

在OpenCV中图像旋转首先根据旋转角度和旋转中心获取旋转矩阵,然后根据旋转矩阵进行变换,即可实现任意角度和任意中心的旋转效果。
API:

cv2.getRotationMatrix2D(center, angle, scale)

参数:

  • center:旋转中心
  • angle:旋转角度
  • scale:缩放比例

返回:

  • M:旋转矩阵
    调用cv. warpAffine 完成图像的旋转
示例
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1读取图像
img=cv. imread("./images/a1.jpg")
# 2图像旋转
rows, cols = img. shape[:2]
# 2.1生成旋转矩阵
M = cv.getRotationMatrix2D((cols/2, rows/2), 90, 1)
# 2.2进行旋转变换
dst = cv. warpAffine(img, M, (cols, rows))
# 3图像展示
fig, axes = plt. subplots(nrows=1, ncols=2, figsize=(10, 8), dpi=100)
axes[0].imshow(img[:, :, ::-1])
axes[0].set_title("原图")
axes[1].imshow(dst[:, :, ::-1])
axes[1].set_title("旋转后结果")
plt.show()

结果如下:
在这里插入图片描述

2.仿射变换

图像的仿射变换涉及到图像的形状位置角度的变化,是深度学习预处理中常到的功能,仿射变换主要是对图像的缩放,旋转,翻转和平移等操作的组合。
示例:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1读取图像
img=cv.imread("./images/a1.jpg")
# 2仿射变换
rows, cols = img.shape[:2]
# 2.1创建变换矩阵
pts1 = np.float32([[50, 50], [200, 50], [50, 200]])
pts2 = np.float32([[100, 100], [200, 50], [100, 250]])
M=cv.getAffineTransform(pts1, pts2)
# 2.2完成仿射变换
dst=cv.warpAffine(img, M, (cols, rows))
# 3图像显示
fig,axes=plt. subplots(nrows=1, ncols=2, figsize=(10, 8), dpi=100)
axes[0].imshow(img[:, :, ::-1])
axes[0].set_title("原图")
axes[1].imshow(dst[:, :, ::-1])
axes[1].set_title("仿射后结果")
plt.show()

结果如下:在这里插入图片描述

3.透射变换

透射变换是视角变化的结果,是指利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。
示例:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1读取图像
img=cv.imread("./images/a1.jpg")
# 2透射变换
rows, cols = img.shape[:2]
# 2.1创建变换矩阵
pts1 = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]])
pts2 = np.float32([[100, 145], [300, 100], [80, 290], [310, 300]])
T = cv.getPerspectiveTransform(pts1, pts2)
# 2.2进行变换
dst = cv.warpPerspective(img, T, (cols, rows))
# 3图像显示
fig, axes=plt.subplots(nrows=1, ncols=2, figsize=(10, 8), dpi=100)
axes[0].imshow(img[:, :, ::-1])
axes[0].set_title("原图")
axes[1].imshow(dst[:, :, ::-1])
axes[1].set_title("透射变换结果")
plt.show()

结果如下:
在这里插入图片描述

4.图像金字塔

图像金字塔是图像多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构。
图像金字塔用于机器视觉和图像压缩,一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。
金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似,层级越高,图像越小,分辨率越低。
API

cv.pyrUp(img)#对图像进行上采样
cv.pyrDown(img)#对图像进行下采样

示例:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1读取图像
img=cv.imread("./images/a1.jpg")
# 2进行图像采样
up_img = cv.pyrUp(img)#上采样操作
img_1 = cv.pyrDown(img)#下采样操作
# 3图像显示
cv.imshow('enlarge', up_img)
cv.imshow('original', img)
cv.imshow('shrink', img_1)
cv.waitKey(0)
cv.destroyAllWindows()

结果如下:在这里插入图片描述

  • 8
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

衍生星球

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值