OpenCV-Python学习(20)—— OpenCV 图像几何变换之图像旋转(cv.warpAffine、cv.getRotationMatrix2D、cv.rotate、np.rot90)

这篇具有很好参考价值的文章主要介绍了OpenCV-Python学习(20)—— OpenCV 图像几何变换之图像旋转(cv.warpAffine、cv.getRotationMatrix2D、cv.rotate、np.rot90)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 学习目标

  1. 学习旋转矩阵;
  2. 学习使用 OpenCV 的 cv.warpAffine 函数进行图片的旋转;
  3. 学习使用 OpenCV 的 cv.getRotationMatrix2D 来计算不同旋转中心的不同角度的 MAR 旋转变换矩阵;
  4. 学习使用 OpenCV 的 cv.rotate 进行特殊角度的旋转(90,180,270 度)。

2. 不同中心的旋转矩阵计算

2.1 图像以原点 (0, 0) 为中心

图像以原点 (0, 0) 为中心、顺时针旋转角度 θ 进行旋转的计算公式:

逆时针为负数,顺时针为正数

OpenCV-Python学习(20)—— OpenCV 图像几何变换之图像旋转(cv.warpAffine、cv.getRotationMatrix2D、cv.rotate、np.rot90)

2.2 图像以任意点 (x0, y0) 为旋转中心

图像以任意点 (x0, y0) 为旋转中心、顺时针旋转角度 θ 的旋转操作,可以先将原点平移到旋转中心 (x0, y0) ,然后按照原点旋转,最后再平移回坐标原点的计算公式:

逆时针为负数,顺时针为正数
OpenCV-Python学习(20)—— OpenCV 图像几何变换之图像旋转(cv.warpAffine、cv.getRotationMatrix2D、cv.rotate、np.rot90)
逆时针为正数,顺时针为负数
OpenCV-Python学习(20)—— OpenCV 图像几何变换之图像旋转(cv.warpAffine、cv.getRotationMatrix2D、cv.rotate、np.rot90)

计算公式结果参考:cv2.getRotationMatrix2D的旋转矩阵的正确形式!!!

3. 图像旋转函数

3.1 cv.warpAffine() 函数使用
cv.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) → dst
3.2 参数说明
参数 说明
src 表示输入图像。
M 表示变换矩阵,2行3列。
dsize 表示输出图像的大小,二元元组 (width, height)。
dst 表示变换操作的输出图像,可选项。
flags 表示插值方法,整型(int),可选项。
borderMode 表示边界像素方法,整型(int),可选项,默认值为 cv.BORDER_REFLECT。
borderValue 表示边界填充值,可选项,默认值为 0(黑色填充)。
3.3 flags 值说明
说明
cv.INTER_LINEAR 表示双线性插值(默认方法)。
cv.INTER_AREA 表示使用像素区域关系重采样,缩小图像时可以避免波纹出现。
cv.INTER_NEAREST 表示最近邻插值。
cv.INTER_CUBIC 表示 4x4 像素邻域的双三次插值。
cv.INTER_LANCZOS4 表示 8x8 像素邻域的Lanczos插值。

4. 以原点(0,0)旋转任意角度实例

4.1 旋转实例

逆时针为负数,顺时针为正数

import cv2 as cv
import numpy as np

# 图像旋转(以原点(0,0)为中心旋转)
def image_rotate(src, rotate=0):
  h,w,c = src.shape
  cos_val = np.cos(np.deg2rad(rotate))
  sin_val = np.sin(np.deg2rad(rotate))
  M = np.float32([[cos_val, -sin_val, 0], [sin_val, cos_val, 0]])
  img = cv.warpAffine(src, M, (w,h))
  return img

if __name__ == "__main__":
  img = cv.imread("./images/lena.jpg")
  cv.imshow("origin", img)
  cv.imshow("img_rotate_30", image_rotate(img,30))
  cv.imshow("img_rotate_45", image_rotate(img,45))
  cv.waitKey(0)
  cv.destroyAllWindows()
4.2 旋转效果

OpenCV-Python学习(20)—— OpenCV 图像几何变换之图像旋转(cv.warpAffine、cv.getRotationMatrix2D、cv.rotate、np.rot90)

5. 逆时针为正数,顺时针为负数

5.1 旋转实例
import cv2 as cv
import numpy as np

# 图像旋转(以原点(0,0)为中心旋转)
def image_rotate(src, rotate=0):
  h,w,c = src.shape
  cos_val = np.cos(np.deg2rad(rotate))
  sin_val = np.sin(np.deg2rad(rotate))
  M = np.float32([[cos_val, sin_val, 0], [-sin_val, cos_val, 0]])
  img = cv.warpAffine(src, M, (w,h))
  return img

if __name__ == "__main__":
  img = cv.imread("./images/lena.jpg")
  cv.imshow("origin", img)
  cv.imshow("img_rotate_30", image_rotate(img,30))
  cv.imshow("img_rotate_45", image_rotate(img,45))
  cv.waitKey(0)
  cv.destroyAllWindows()
5.2 旋转效果

OpenCV-Python学习(20)—— OpenCV 图像几何变换之图像旋转(cv.warpAffine、cv.getRotationMatrix2D、cv.rotate、np.rot90)

6. 以任意点为中心旋转任意角度实例(逆时针为正数,顺时针为负数)

6.1 旋转实例
import cv2 as cv
import numpy as np

# 计算旋转变换矩阵
def handle_rotate_val(x,y,rotate):
  cos_val = np.cos(np.deg2rad(rotate))
  sin_val = np.sin(np.deg2rad(rotate))
  return np.float32([
      [cos_val, sin_val, x * (1 - cos_val) - y * sin_val],
      [-sin_val, cos_val, x * sin_val + y * (1 - cos_val)]
    ])

# 图像旋转(以任意点为中心旋转)
def image_rotate(src, rotate=0):
  h,w,c = src.shape
  M = handle_rotate_val(w//2,h//2,rotate)
  img = cv.warpAffine(src, M, (w,h))
  return img

if __name__ == "__main__":
  img = cv.imread("./images/lena.jpg")
  cv.imshow("origin", img)
  cv.imshow("img_rotate_30", image_rotate(img,30))
  cv.imshow("img_rotate_45", image_rotate(img,45))
  cv.waitKey(0)
  cv.destroyAllWindows()
6.2 旋转效果

OpenCV-Python学习(20)—— OpenCV 图像几何变换之图像旋转(cv.warpAffine、cv.getRotationMatrix2D、cv.rotate、np.rot90)

7. cv.getRotationMatrix2D 函数

OpenCV 提供了 cv.getRotationMatrix2D 函数, 根据旋转角度和位移计算旋转变换矩阵 MAR。

7.1 cv.getRotationMatrix2D() 函数说明
cv.getRotationMatrix2D(center, angle, scale) → M
7.2 参数说明
参数 说明
center 表示旋转中心坐标,二元元组 (x0, y0)。
angle 表示旋转角度,单位为角度,逆时针为正数,顺时针为负数
scale 表示缩放因子。
7.3 使用 cv.getRotationMatrix2D 计算变换矩阵的实例
import cv2 as cv

# 图像旋转(以任意点为中心旋转)
def image_rotate(src, rotate=0):
  h,w,c = src.shape
  M = cv.getRotationMatrix2D((w//2,h//2),rotate,1)
  img = cv.warpAffine(src, M, (w,h))
  return img

if __name__ == "__main__":
  img = cv.imread("./images/lena.jpg")
  cv.imshow("origin", img)
  cv.imshow("img_rotate_30", image_rotate(img,30))
  cv.imshow("img_rotate_45", image_rotate(img,45))
  cv.waitKey(0)
  cv.destroyAllWindows()
7.4 旋转结果

OpenCV-Python学习(20)—— OpenCV 图像几何变换之图像旋转(cv.warpAffine、cv.getRotationMatrix2D、cv.rotate、np.rot90)

8. cv.rotate 函数

8.1 cv.rotate() 函数说明
cv.rotate( src, rotateCode[, dst] ) → dst
8.2 参数说明
参数 说明
src 表示变换操作的输入图像。
rotateCode 表示枚举,指定旋转角度。
dst 表示变换操作的输出图像,ndarray 多维数组。
8.3 rotateCode 值说明
说明
cv.ROTATE_90_CLOCKWISE 表示顺时针旋转 90 度。
cv.ROTATE_180 表示旋转 180 度。
cv.ROTATE_90_COUNTERCLOCKWISE 表示逆时针旋转 90 度。
8.4 cv.rotate 旋转实例
import cv2 as cv
import numpy as np

# 图像旋转(以特殊角度旋转)
def image_rotate(src):
  img_90 = cv.rotate(src,cv.ROTATE_90_CLOCKWISE)
  cv.imshow("ROTATE_90_CLOCKWISE", img_90)
  img_180 = cv.rotate(src,cv.ROTATE_180)
  cv.imshow("ROTATE_180", img_180)
  img_270 = cv.rotate(src,cv.ROTATE_90_COUNTERCLOCKWISE)
  cv.imshow("ROTATE_90_COUNTERCLOCKWISE", img_270)
  return img

if __name__ == "__main__":
  img = cv.imread("./images/lena.jpg")
  cv.imshow("origin", img)
  image_rotate(img)
  cv.waitKey(0)
  cv.destroyAllWindows()
8.5 旋转效果

OpenCV-Python学习(20)—— OpenCV 图像几何变换之图像旋转(cv.warpAffine、cv.getRotationMatrix2D、cv.rotate、np.rot90)

9. np.rot90 函数

9.1 np.rot90() 函数说明
np.rot90(src, k, axes)  → dst
9.2 参数说明
参数 说明
src 表示变换操作的输入图像。
k 表示阵列旋转90度的次数。
axes 表示 array 在轴定义的平面中旋转。 轴必须不同。
dst 表示变换操作的输出图像。
9.3 旋转实例
import cv2 as cv
import numpy as np

# 图像旋转(以特殊角度旋转)
def image_rotate(src):
  img_90 = np.rot90(src,1)
  cv.imshow("rot90", img_90)
  img_180 = np.rot90(src,2)
  cv.imshow("rot180", img_180)
  img_270 = np.rot90(src,3)
  cv.imshow("rot270", img_270)
  return img

if __name__ == "__main__":
  img = cv.imread("./images/lena.jpg")
  half_img = cv.resize(img,None,fx=0.5,fy=0.5)
  cv.imshow("origin", half_img)
  image_rotate(half_img)
  cv.waitKey(0)
  cv.destroyAllWindows()
9.4 旋转结果

OpenCV-Python学习(20)—— OpenCV 图像几何变换之图像旋转(cv.warpAffine、cv.getRotationMatrix2D、cv.rotate、np.rot90)文章来源地址https://www.toymoban.com/news/detail-490866.html

10. 总结

  1. cv.rotate 和 np.rot90 两个方法只能旋转特殊角度,只能是90度的整数倍数。
  2. cv.warpAffine 可以对图像进行任意角度旋转;
  3. 实现自定原点旋转,需要借助 cv.getRotationMatrix2D 计算变化矩阵;
  4. cv.getRotationMatrix2D 的实现原理需要注意旋转角度对应的顺【逆】时针旋转!!!
  5. 注意:cv.getRotationMatrix2D 的旋转角度【逆时针为正数,顺时针为负数】!!!

到了这里,关于OpenCV-Python学习(20)—— OpenCV 图像几何变换之图像旋转(cv.warpAffine、cv.getRotationMatrix2D、cv.rotate、np.rot90)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV-Python中的图像处理-傅里叶变换

    傅里叶变换经常被用来分析不同滤波器的频率特性。我们可以使用 2D 离散傅里叶变换 (DFT) 分析图像的频域特性。实现 DFT 的一个快速算法被称为快速傅里叶变换( FFT)。 对于一个正弦信号:x (t) = A sin (2πft), 它的频率为 f,如果把这个信号转到它的频域表示,我们会在频率

    2024年02月12日
    浏览(42)
  • Python-OpenCV中的图像处理-几何变换

    对图像进行各种几个变换,例如移动,旋转,仿射变换等。 cv2.resize() cv2.INTER_AREA v2.INTER_CUBIC v2.INTER_LINEAR res = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC) 或 height, width = img.shape[:2] res = cv2.resize(img, (2 width, 2 height), interpolation=cv2.INTER_CUBIC) OpenCV提供了使用函数cv2.warpAffine()实

    2024年02月13日
    浏览(92)
  • MATLAB图像处理之几何变换——平移与旋转

    可以发现,原图在原坐标基础上向X、Y方向分别平移了50和100个单位。但相应平移的部分也被遮挡了,显然这不符合一些场景的应用需求。 为此,MATLAB还提供了参数设置。在imtranslate函数中设置’OutputView’参数为’full’,即可防止遮挡平移的图像,如下图所示。 MATLAB在进行图

    2024年02月16日
    浏览(47)
  • 数字图像处理 matlab图像的几何运算 实验三 旋转 缩放 裁剪 镜像变换 平移

    原图: 读取原图(这里我的图片名字是atm.png): 我们先说原理,图像旋转的本质是向量的旋转。 矩阵乘法的实质是进行线性变换,因此对一个向量进行旋转操作也可以通过矩阵和向量相乘的方式进行。 因为图像都是通过二维矩阵存放的(单通道),所以对图像进行旋转时

    2024年02月07日
    浏览(55)
  • 【OpenCV • c++】图像几何变换 | 图像仿射变换

    🚀 个人简介:CSDN「 博客新星 」TOP 10 , C/C++ 领域新星创作者 💟 作    者: 锡兰_CC ❣️ 📝 专    栏: 【OpenCV • c++】计算机视觉 🌈 若有帮助,还请 关注➕点赞➕收藏 ,不行的话我再努努力💪💪💪

    2024年02月16日
    浏览(52)
  • (opencv)图像几何变换——缩放

    图像缩放是指将图像的尺寸变小或变大的过程,也就是减少或增加源图像数据的像素个数。图像缩放一定程度上会造成信息的丢失,因此需要考虑适宜的方法进行操作。 下面介绍两种常用的图像缩放方法的原理及实现 1.基于等间隔提取图像缩放 等间隔提取图像缩放是通过对

    2024年02月16日
    浏览(39)
  • (opencv)图像几何变换——平移

    图像的平移操作是将图像的所有像素坐标进行水平或垂直方向移动,也就是将所有像素点按照给定的偏移量在水平方向沿x轴、垂直方向上沿y轴移动。平移变换分为两种类型:图像大小变化与图像大小不变。第一种类型保证图像平移的完整信息,第二种图像导致原始图像的部

    2024年02月08日
    浏览(46)
  • 【OpenCV • c++】图像几何变换 | 图像缩放

    🚀 个人简介:CSDN「 博客新星 」TOP 10 , C/C++ 领域新星创作者 💟 作    者: 锡兰_CC ❣️ 📝 专    栏: 【OpenCV • c++】计算机视觉 🌈 若有帮助,还请 关注➕点赞➕收藏 ,不行的话我再努努力💪💪💪

    2024年02月16日
    浏览(56)
  • 【OpenCV • c++】图像几何变换 | 图像平移

    🚀 个人简介:CSDN「 博客新星 」TOP 10 , C/C++ 领域新星创作者 💟 作    者: 锡兰_CC ❣️ 📝 专    栏: 【OpenCV • c++】计算机视觉 🌈 若有帮助,还请 关注➕点赞➕收藏 ,不行的话我再努努力💪💪💪

    2024年02月16日
    浏览(41)
  • 【OpenCV • c++】图像几何变换 | 图像坐标映射

    🚀 个人简介:CSDN「 博客新星 」TOP 10 , C/C++ 领域新星创作者 💟 作    者: 锡兰_CC ❣️ 📝 专    栏: 【OpenCV • c++】计算机视觉 🌈 若有帮助,还请 关注➕点赞➕收藏 ,不行的话我再努努力💪💪💪   图像的几何变换是指在不改变图像像素值的前提下对图像像素进

    2024年02月12日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包