《数字图像处理-OpenCV/Python》连载(41)图像的旋转

这篇具有很好参考价值的文章主要介绍了《数字图像处理-OpenCV/Python》连载(41)图像的旋转。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

《数字图像处理-OpenCV/Python》连载(41)图像的旋转


本书京东优惠购书链接:https://item.jd.com/14098452.html
本书CSDN独家连载专栏:https://blog.csdn.net/youcans/category_12418787.html

《数字图像处理-OpenCV/Python》连载(41)图像的旋转,《数字图像处理-OpenCV》连载,opencv,python,图像处理,计算机视觉


第 6 章 图像的几何变换


几何变换分为等距变换、相似变换、仿射变换和投影变换,是指对图像的位置、大小、形状和投影进行变换,将图像从原始平面投影到新的视平面。OpenCV图像的几何变换,本质上是将一个多维数组通过映射关系转换为另一个多维数组。


本章内容概要

  • 介绍仿射变换,学习使用仿射变换矩阵实现图像的仿射变换。
  • 学习使用函数实现图像的平移、缩放、旋转、翻转和斜切。
  • 介绍投影变换,学习使用投影变换矩阵实现图像的投影变换。
  • 介绍图像的重映射,学习使用映射函数实现图像的自定义变换和动态变换。

6.1 图像的旋转

旋转变换属于等距变换,变换后图像的长度和面积不变。
图像以左上角(0,0)为旋转中心、以旋转角度 θ 顺时针旋转,可以构造旋转变换矩阵 MAR,通过函数 cv.warpAffine 计算旋转变换图像。

[ x ~ y ~ 1 ] = M A R [ x y 1 ] , M A R = [ c o s θ − s i n θ 0 s i n θ c o s θ 0 0 0 1 ] \begin{bmatrix} \tilde{x}\\ \tilde{y}\\ 1 \end{bmatrix} = M_{AR} \begin{bmatrix} x\\ y\\ 1 \end{bmatrix} ,\hspace{1em} M_{AR} = \begin{bmatrix} cos \theta &-sin \theta &0\\ sin \theta &cos \theta &0\\ 0 &0 &1 \end{bmatrix} x~y~1 =MAR xy1 ,MAR= cosθsinθ0sinθcosθ0001

图像以任意点(x,y)为旋转中心、以旋转角度 顺时针旋转,可以先将原点平移到旋转中心(x,y),再对原点进行旋转处理,最后反向平移回坐标原点。

OpenCV中的函数cv.getRotationMatrix2D可以计算以任意点为中心的旋转变换矩阵。

函数原型

cv.getRotationMatrix2D(center, angle, scale) → M

函数cv.getRotationMatrix2D能根据旋转中心和旋转角度计算旋转变换矩阵M:

M = [ α β ( 1 − α ) x − β y − β α β x + ( 1 − α ) y ] M = \begin{bmatrix} \alpha & \beta &(1-\alpha)x-\beta y\\ -\beta &\alpha &\beta x +(1-\alpha) y \end{bmatrix} M=[αββα(1α)xβyβx+(1α)y]

参数说明

  • center:旋转中心坐标,格式为元组(x,y)。
  • angle:旋转角度,角度制,以逆时针方向旋转。
  • scale:缩放系数,是浮点型数据。
  • M:旋转变换矩阵,是形状为(2,3)、类型为np.float32的Numpy数组。

注意问题

  • (1)函数可以直接获取以任意点为中心的旋转变换矩阵,不需要额外进行平移变换。

  • (2) 如果旋转图像的尺寸与原始图像的尺寸相同,则四角的像素会被切除(见图6-3(2))。为了保留原始图像的内容,需要在旋转的同时对图像进行缩放,或将旋转图像的尺寸调整为:

W r o t = w c o s θ + h s i n θ H r o t = h c o s θ + w s i n θ W_{rot} = w cos \theta+ h sin \theta \\ H_{rot} = h cos \theta+ w sin \theta Wrot=wcosθ+hsinθHrot=hcosθ+wsinθ
式中,w、h分别为原始图像的宽度与高度; 、 分别为旋转图像的宽度与高度。

  • (3) 缩放系数scale在旋转的同时能进行缩放,但水平、垂直方向必须使用相同的缩放比例。

函数cv.rotate用于直角旋转,旋转角度为90度、180度或270度。该方法通过矩阵转置实现,运行速度极快。

函数原型

cv.rotate(src, rotateCode[, dst]) → dst

参数说明

  • src:输入图像,是Numpy数组。
  • dst:输出图像,类型与src相同,图像尺寸由旋转角度确定。
  • rotateCode:旋转标志符。
    • ROTATE_90_CLOCKWISE:顺时针旋转90度。
    • ROTATE_180:顺时针旋转180度。
    • ROTATE_90_COUNTERCLOCKWISE:顺时针旋转270度。

注意问题

旋转角度为180度时,输出图像的尺寸与输入图像的尺寸相同;旋转角度为90度或180度时,输出图像的高度和宽度分别等于输入图像的宽度和高度。


【例程0603】图像的旋转

本例程介绍以原点为旋转中心、以任意点为旋转中心旋转图像,以及图像的直角旋转。


# 【0603】图像的旋转
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

if __name__ == '__main__':
    img = cv.imread("../images/Fig0301.png")  # 读取彩色图像(BGR)
    height, width = img.shape[:2]  # 图像的高度和宽度

    # (1) 以原点为旋转中心
    x0, y0 = 0, 0  # 以左上角顶点 (0,0) 作为旋转中心
    theta, scale = 30, 1.0  # 逆时针旋转 30 度,缩放系数 1.0
    MAR0 = cv.getRotationMatrix2D((x0,y0), theta, scale)  # 旋转变换矩阵
    imgRot1 = cv.warpAffine(img, MAR0, (width, height))  

    # (2) 以任意点为旋转中心
    x0, y0 = width//2, height//2  # 以图像中心作为旋转中心
    angle = theta * np.pi/180  # 弧度->角度
    wRot = int(width * np.cos(angle) + height * np.sin(angle))  # 调整宽度
    hRot = int(height * np.cos(angle) + width * np.sin(angle))  # 调整高度
    scale = width/wRot  # 根据 wRot 调整缩放系数
    MAR1 = cv.getRotationMatrix2D((x0,y0), theta, 1.0)  # 逆时针旋转 30 度,缩放系数 1.0
    MAR2 = cv.getRotationMatrix2D((x0,y0), theta, scale)  # 逆时针旋转 30 度,缩放比例 scale
    imgRot2 = cv.warpAffine(img, MAR1, (height, width), borderValue=(255,255,255))  # 白色填充
    imgRot3 = cv.warpAffine(img, MAR2, (height, width))  # 调整缩放系数,以保留原始图像的内容
    print(img.shape, imgRot2.shape, imgRot3.shape, scale)

    # (3) 图像的直角旋转
    imgRot90 = cv.rotate(img, cv.ROTATE_90_CLOCKWISE)  # 顺时针旋转 90度
    imgRot180 = cv.rotate(img, cv.ROTATE_180)  # 顺时针旋转 180度
    imgRot270 = cv.rotate(img, cv.ROTATE_90_COUNTERCLOCKWISE)  # 顺时针旋转 270度

    plt.figure(figsize=(9, 6))
    plt.subplot(231), plt.title("1.Rotate around the origin"), plt.axis('off')
    plt.imshow(cv.cvtColor(imgRot1, cv.COLOR_BGR2RGB))
    plt.subplot(232), plt.title("2.Rotate around the center"), plt.axis('off')
    plt.imshow(cv.cvtColor(imgRot2, cv.COLOR_BGR2RGB))
    plt.subplot(233), plt.title("3.Rotate and resize"), plt.axis('off')
    plt.imshow(cv.cvtColor(imgRot3, cv.COLOR_BGR2RGB))
    plt.subplot(234), plt.title("4.Rotate 90 degrees"), plt.axis('off')
    plt.imshow(cv.cvtColor(imgRot90, cv.COLOR_BGR2RGB))
    plt.subplot(235), plt.title("5.Rotate 180 degrees"), plt.axis('off')
    plt.imshow(cv.cvtColor(imgRot180, cv.COLOR_BGR2RGB))
    plt.subplot(236), plt.title("6.Rotate 270 degrees"), plt.axis('off')
    plt.imshow(cv.cvtColor(imgRot270, cv.COLOR_BGR2RGB))
    plt.tight_layout()
    plt.show()


程序说明:
运行结果,图像的旋转如图6-3所示。
(1) 图6-3(1)~(3)用函数cv.getRotationMatrix2D计算旋转变换矩阵后,通过函数cv.warpAffine计算旋转变换图像。图6-3(1)以图像原点,即左上角为中心旋转,图6-3(2)和图6-3(3)围绕图像中心点旋转变换。
(2) 图像尺寸不变,中心旋转后四角像素被切除(见图6-3(2))。在计算旋转变换矩阵时使用了缩放系数,使旋转图像保留了原始图像的内容(见图6-3(3))。
(3) 图6-3(4)~(6)所示都是直角旋转,使用函数cv.rotate通过矩阵转置实现。


《数字图像处理-OpenCV/Python》连载(41)图像的旋转,《数字图像处理-OpenCV》连载,opencv,python,图像处理,计算机视觉

*图6-3 图像的旋转


版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/134317103)
Copyright 2023 youcans, XUPT
Crated:2023-11-11

欢迎关注本书CSDN独家连载专栏
《数字图像处理-OpenCV/Python》连载: https://blog.csdn.net/youcans/category_12418787.html文章来源地址https://www.toymoban.com/news/detail-751393.html

到了这里,关于《数字图像处理-OpenCV/Python》连载(41)图像的旋转的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 《数字图像处理-OpenCV/Python》连载(4)图像的读取与保存

    本书京东优惠购书链接:https://item.jd.com/14098452.html 本书CSDN独家连载专栏:https://blog.csdn.net/youcans/category_12418787.html 为了方便初学者从零开始学习OpenCV-Python,本书从图像的读取、保存和显示等基本操作开始介绍,使读者可以循序渐进地使用和理解本书的每一个例程。 本章内容

    2024年02月09日
    浏览(57)
  • 《数字图像处理-OpenCV/Python》连载(10)图像属性与数据类型

    本书京东优惠购书链接:https://item.jd.com/14098452.html 本书CSDN独家连载专栏:https://blog.csdn.net/youcans/category_12418787.html 在Python语言中,OpenCV以Numpy数组存储图像,对图像的访问和处理都是通过Numpy数组的操作来实现的。 本章内容概要 介绍Python语言中OpenCV的数据结构,学习获取图像

    2024年02月07日
    浏览(78)
  • 《数字图像处理-OpenCV/Python》连载(22)绘制直线与线段

    本书京东优惠购书链接:https://item.jd.com/14098452.html 本书CSDN独家连载专栏:https://blog.csdn.net/youcans/category_12418787.html 本章介绍OpenCV的绘图功能和简单的鼠标交互处理方法。与Excel或Matplotlib中的可视化数据图不同,OpenCV中的绘图功能主要用于在图像的指定位置绘制几何图形。 本

    2024年02月02日
    浏览(92)
  • 《数字图像处理-OpenCV/Python》连载(26)绘制椭圆和椭圆弧

    本书京东优惠购书链接:https://item.jd.com/14098452.html 本书CSDN独家连载专栏:https://blog.csdn.net/youcans/category_12418787.html 本章介绍OpenCV的绘图功能和简单的鼠标交互处理方法。与Excel或Matplotlib中的可视化数据图不同,OpenCV中的绘图功能主要用于在图像的指定位置绘制几何图形。 本

    2024年02月06日
    浏览(69)
  • 《数字图像处理-OpenCV/Python》连载:空间滤波之高斯滤波器

    本书京东 优惠购书链接 https://item.jd.com/14098452.html 本书CSDN 独家连载专栏 https://blog.csdn.net/youcans/category_12418787.html 图像滤波是指在尽可能保留图像细节特征的条件下对目标图像的噪声进行抑制,是常用的图像处理方法。 空间滤波也称空间域滤波,滤波器规定了邻域形状与邻域

    2024年02月02日
    浏览(55)
  • 【Python_Opencv图像处理框架】信用卡数字识别项目

    本篇文章是opencv学习的第六篇文章,前面主要讲解了对图像的一些基本操作,这篇文章我们就开始大展身手,将前面所学的基础操作活学活用。既能复习基础操作,又能学到一些新的知识。作为初学者,我尽己所能,但仍会存在疏漏的地方,希望各位看官不吝指正🥰 我们通

    2024年02月03日
    浏览(51)
  • MATLAB【数字图像处理】 实验一:图像处理基本操作(平移、放大、缩小、旋转、插值)

    1、熟悉并掌握MATLAB工具的使用;  2、实现图像的读取、显示、存储、平移、镜像、放大、缩小及旋转操作; 3、掌握常用的插值方法,并了解其优缺点。 Matlab 2020B 1、读入一幅RGB图像,变换为灰度图像和二值图像,并在同一个窗口内分别显示RGB图像和灰度图像,注上文字标

    2024年02月06日
    浏览(46)
  • 数字图像处理二维码识别python+opencv实现二维码实时识别

    数字图像处理二维码识别 python+opencv实现二维码实时识别 特点: (1)可以实现普通二维码,条形码; (2)解决了opencv输出中文乱码的问题 (3)增加网页自动跳转功能 (4)实现二维码实时检测和识别 代码保证原创、无错误、能正常运行(如果电脑环境配置没问题) 送二维

    2024年01月16日
    浏览(64)
  • 数字图像处理(实践篇)二十七 Python-OpenCV 滑动条的使用

    目录 1 涉及的函数 2 实践 1 涉及的函数 ⒈ setWindowProperty()用于设置GUI应用程序的属性 参数 : ① 

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

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

    2024年02月07日
    浏览(52)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包