Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >经验 | OpenCV图像旋转的原理与技巧

经验 | OpenCV图像旋转的原理与技巧

作者头像
OpenCV学堂
发布于 2020-12-18 02:16:01
发布于 2020-12-18 02:16:01
3K00
代码可运行
举报
运行总次数:0
代码可运行
01

引言

初学图像处理,很多人遇到的第一关就是图像旋转,图像旋转是图像几何变换中最具代表性的操作,包含了插值、背景处理、三角函数等相关知识,一个变换矩阵跟计算图像旋转之后的大小公式就让很多开发者最后直接调用函数了事,但是其实这个东西并没有这么难懂,可以说主要是之前别人写的公式太吓人,小编很久以前第一次接触的也是被吓晕了!所以决定从程序员可以接受的角度从新介绍一下图像旋转基本原理与OpenCV中图像旋转函数操作的基本技巧。

图像旋转基本原理

旋转涉及到两个问题,一个是图像旋转之后的大小会发生改变,会产生背景,通过背景填充方式都是填充黑色,此外旋转还是产生像素的位置迁移,新的位置像素需要通过插值计算获得,常见的插值方式有最近邻、线性插值、立方插值等。

首先看旋转之后的图像宽高变化,如下图所示:

这个是正常的平面坐标系中的旋转矩阵,可以简写为:

是一个2x3的矩阵,但是在图像中左上角是原点,要实现围绕图像的中心位置旋转,M就要重新计算,所以OpenCV中的图像旋转矩阵为:

其中scale是表示矩阵支持旋转+放缩,这里可以把Scale=1。第三列是图像旋转之后中心位置平移量。

函数支持

OpenCV中支持图像旋转的函数有两个,一个是直接支持旋转的函数,但是它支持的是90,180,270这样的特殊角度旋转。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void cv::rotate   (
    InputArray    src,
    OutputArray dst,
    int rotateCode
)

其中rotateCode参数必须为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ROTATE_180,
ROTATE_90_CLOCKWISE
ROTATE_90_COUNTERCLOCKWISE 

函数warpAffine支持任意角度的旋转,通过定义M矩阵实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void cv::warpAffine(
         InputArray      src, // 输入图像
         OutputArray dst, // 输出图像
         InputArray      M, // 旋转矩阵
         Size         dsize, // 输出图像大小
         int   flags = INTER_LINEAR, // 像素插值方式
         int   borderMode = BORDER_CONSTANT, // 背景填充默认为常量
         const Scalar &        borderValue = Scalar() // 填充颜色默认为黑色
)

但是M如何生成与获取,OpenCV中提供了一个函数根据输入的参数自动生成旋转矩阵M,该函数为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Mat cv::getRotationMatrix2D(
         Point2f   center,
         double    angle,
         double    scale
)

代码演示

原图

使用自定义的M矩阵实现图像旋转

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
h, w, c = src.shape
# 定义矩阵
M = np.zeros((2, 3), dtype=np.float32)
# 定义角度
alpha = np.cos(np.pi / 4.0)
beta = np.sin(np.pi / 4.0)
print("alpha : ", alpha)
# 初始化矩阵
M[0, 0] = alpha
M[1, 1] = alpha
M[0, 1] = beta
M[1, 0] = -beta
cx = w / 2
cy = h / 2
tx = (1-alpha)*cx - beta*cy
ty = beta*cx + (1-alpha)*cy
M[0,2] = tx
M[1,2] = ty
# 执行旋转
dst = cv.warpAffine(src, M, (w, h))
cv.imshow("rotate-center-demo", dst)

重新计算旋转之后的图像大小,实现无Crop版本的图像旋转

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
h, w, c = src.shape
M = np.zeros((2, 3), dtype=np.float32)
alpha = np.cos(np.pi / 4.0)
beta = np.sin(np.pi / 4.0)
print("alpha : ", alpha)

# 初始旋转矩阵
M[0, 0] = alpha
M[1, 1] = alpha
M[0, 1] = beta
M[1, 0] = -beta
cx = w / 2
cy = h / 2
tx = (1-alpha)*cx - beta*cy
ty = beta*cx + (1-alpha)*cy
M[0,2] = tx
M[1,2] = ty

# change with full size
bound_w = int(h * np.abs(beta) + w * np.abs(alpha))
bound_h = int(h * np.abs(alpha) + w * np.abs(beta))

# 添加中心位置迁移
M[0, 2] += bound_w / 2 - cx
M[1, 2] += bound_h / 2 - cy
dst = cv.warpAffine(src, M, (bound_w, bound_h))
cv.imshow("rotate without cropping", dst)

背景随便变化+无Crop版本的图像旋转动态演示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
degree = 1.0
d1 = np.pi / 180.0
while True:
    alpha = np.cos(d1*degree)
    beta = np.sin(d1*degree)
    M[0, 0] = alpha
    M[1, 1] = alpha
    M[0, 1] = beta
    M[1, 0] = -beta
    cx = w / 2
    cy = h / 2
    tx = (1 - alpha) * cx - beta * cy
    ty = beta * cx + (1 - alpha) * cy
    M[0, 2] = tx
    M[1, 2] = ty

    # change with full size
    bound_w = int(h * np.abs(beta) + w * np.abs(alpha))
    bound_h = int(h * np.abs(alpha) + w * np.abs(beta))
    M[0, 2] += bound_w / 2 - cx
    M[1, 2] += bound_h / 2 - cy
    red = np.random.randint(0, 255)
    green = np.random.randint(0, 255)
    blue = np.random.randint(0, 255)
    dst = cv.warpAffine(src, M, (bound_w, bound_h), borderMode=cv.BORDER_CONSTANT, borderValue=(blue, green, red))
    cv.imshow("rotate+background", dst)
    c = cv.waitKey(1000)
    if c == 27:
        break
    degree += 1
    print("degree", degree)
    if degree > 360:
        degree = degree % 360

君子藏器于身,待时而动

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python 调用 opencv 实现 图片文本倾斜校正
本项目为python项目需要安装python及python的opencv模块:opencv_python-4.0.1-cp37-cp37m-win32.whl 和 python的矩阵运算模块:numpy。
庞小明
2019/05/25
4.1K0
OpenCV系列之图像的几何变换 | 十四
OpenCV提供了两个转换函数cv.warpAffine和cv.warpPerspective,您可以使用它们进行各种转换。cv.warpAffine采用2x3转换矩阵,而cv.warpPerspective采用3x3转换矩阵作为输入。
磐创AI
2019/12/03
7900
计算机视觉:6.2~6.5 图像的基本变换与仿射变换
图像的基本变换与仿射变换 6.2 图像的翻转和旋转 图像的翻转 flip(src, flipCode) flipCode=0:上下翻转; flipCode>0:左右翻转; flipCode<0:上下 + 左右翻转; # 图像的翻转 import cv2 import numpy as np # 读取图片 doge = cv2.imread('./doge.jpg') new_doge1 = cv2.flip(doge, flipCode=0) new_doge2 = cv2.flip(doge, fl
DioxideCN
2022/08/05
7930
计算机视觉:6.2~6.5 图像的基本变换与仿射变换
二值图像分析案例精选
最近一直有人在知识星球上向我提问很多二值图像分析相关的问题,特别选择了两个典型的轮廓分析问题。进行分析与编码实现与演示,废话不多说,先看第一个问题。
OpenCV学堂
2019/05/31
7760
Task02 几何变换
该部分将对基本的几何变换进行学习,几何变换的原理大多都是相似,只是变换矩阵不同,因此,我们以最常用的平移和旋转为例进行学习。在深度学习领域,我们常用平移、旋转、镜像等操作进行数据增广;在传统CV领域,由于某些拍摄角度的问题,我们需要对图像进行矫正处理,而几何变换正是这个处理过程的基础,因此了解和学习几何变换也是有必要的。
致Great
2020/04/30
7570
OpenCV新手入门,如何用它平移缩放和旋转图片
它不仅能用来实现各种复杂的算法,还能够对图像进行预处理:包括图像的平移、旋转、缩放、翻转、裁剪。
量子位
2021/02/01
2K0
OpenCV新手入门,如何用它平移缩放和旋转图片
【OpenCV】Chapter3.图像的仿射变换
仿射变换其实包含了一系列的操作:平移,缩放,旋转等,不过所有的操作都可以通过这个仿射变换矩阵来实现。
zstar
2022/09/22
1.3K0
【OpenCV】Chapter3.图像的仿射变换
Python+OpenCV实现旋转文本校正
参考链接: python opencv 基础5 : putText() 为图像增加文本
用户7886150
2021/01/16
1.3K0
图像旋转矫正
11.0 uint8 3 0.017453292519943295 0.022727272727272728 0.022723360841641067 1.3019526725788753 -88.69804732742112
裴来凡
2022/05/29
7870
图像旋转矫正
OpenCV 几何变换-图像旋转
OpenCV提供了warpAffine函数实现图片仿射变换功能,我们可以利用这个函数实现图像旋转,函数原型为:
chaibubble
2022/05/07
2760
OpenCV 几何变换-图像旋转
图像旋转:getRotationMatrix2D详解--无损失旋转图片
使用opencv对图像进行旋转的代码随手一搜即得,但是有些旋转后图像会不完整,有些只给出代码并未解释其实现原理。本文会详细介绍如何使用opencv实现图像旋转得到完整图像,以及其中的实现原理。
languageX
2021/03/06
24.7K3
图像旋转:getRotationMatrix2D详解--无损失旋转图片
10、图像的几何变换——平移、镜像、缩放、旋转、仿射变换 OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(1)OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(2)数字图像
  图像几何变换又称为图像空间变换,它将一副图像中的坐标位置映射到另一幅图像中的新坐标位置。我们学习几何变换就是确定这种空间映射关系,以及映射过程中的变化参数。图像的几何变换改变了像素的空间位置,建立一种原图像像素与变换后图像像素之间的映射关系,通过这种映射关系能够实现下面两种计算:
vv彭
2020/10/27
3.9K0
10、图像的几何变换——平移、镜像、缩放、旋转、仿射变换
    


OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(1)OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(2)数字图像
【图像篇】OpenCV图像处理(七)---图像平移VS图像旋转
牛顿第一运动定律:物体加速度的大小跟作用力成正比,跟物体的质量成反比,且与物体质量的倒数成正比;加速度的方向跟作用力的方向相同。该定律是由艾萨克·牛顿在1687年于《自然哲学的数学原理》一书中提出的。
用户5410712
2022/06/01
1.3K0
【图像篇】OpenCV图像处理(七)---图像平移VS图像旋转
OpenCV实现人脸对齐
OpenCV实现人脸对齐 一:人脸对齐介绍 在人脸识别中有一个重要的预处理步骤-人脸对齐,该操作可以大幅度提高人脸识别的准确率与稳定性,但是早期的OpenCV版本不支持人脸Landmark检测,因此一
OpenCV学堂
2018/04/24
4.3K2
OpenCV实现人脸对齐
基于FPGA的图像旋转设计
图像旋转是指图像按照某个位置转动一定角度的过程,旋转中图像仍保持这原始尺寸。图像旋转后图像的水平对称轴、垂直对称轴及中心坐标原点都可能会发生变换,因此需要对图像旋转中的坐标进行相应转换。
数字积木
2021/04/15
1.1K0
python opencv numpy旋转图片
在图像处理中,有的时候会有对图片进行角度旋转的处理,尤其是在计算机视觉中对于图像扩充,旋转角度扩充图片是一种常见的处理。这种旋转图片的应用场景也比较多,比如用户上传图片是竖着的时候,不好进行处理,也需要对其进行旋转,以便后续算法处理。常见的旋转处理有两种方式,一种是转化为numpy矩阵后,对numpy矩阵进行处理,另外一种是使用opencv自带的函数进行各种变换处理,以实现旋转角度的结果。
用户7886150
2021/01/05
4K0
OpenCV 畸变矫正映射
https://developer-public-1258344699.cos.ap-guangzhou.myqcloud.com/column/column/10335061/20230218-2d58b817.png
为为为什么
2023/02/18
1.6K0
OpenCV 畸变矫正映射
opencv(4.5.3)-python(十一)--图像的几何变换
OpenCV提供了两个变换函数,cv.warpAffine和cv.warpPerspective,用它们可以进行各种变换。cv.warpAffine需要一个2x3变换矩阵,而cv.warpPerspective需要一个3x3变换矩阵作为输入。
用户9875047
2022/12/07
7420
opencv(4.5.3)-python(十一)--图像的几何变换
OpenCV学习+常用函数记录①:图像的基本处理
默认使用的是双线性插值法,可以利用opencv提供的 resize 方法来进行图片的缩放
小黑鸭
2020/11/24
2K0
【说站】python opencv如何旋转图片
python opencv如何旋转图片 函数用法 (h,w)=img2.shape[:2] center=(w//2,h//2) M=cv2.getRotationMatrix2D(center,30,1.0) img3=cv2.warpAffine(img2,M,(w,h)) 参数详解 1、由于两个图像在匹配时需要保证两个图像的大小相同。 2、在旋转图像时不能简单地旋转,要找出图像的中心点,绕中心点旋转,填补空白。 找中心点 (h,w)=img2.shape[:2] center=(w//2,h//2
很酷的站长
2022/11/24
9070
【说站】python opencv如何旋转图片
相关推荐
python 调用 opencv 实现 图片文本倾斜校正
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档