电子商务网站开发的目的是什么,室内设计专业公司排名,广州正规网站建设,宁波seo咨询《数字图像处理-OpenCV/Python》连载#xff08;41#xff09;图像的旋转 本书京东优惠购书链接#xff1a;https://item.jd.com/14098452.html 本书CSDN独家连载专栏#xff1a;https://blog.csdn.net/youcans/category_12418787.html 第 6 章 图像的几何变换 几何变换分…《数字图像处理-OpenCV/Python》连载41图像的旋转 本书京东优惠购书链接https://item.jd.com/14098452.html 本书CSDN独家连载专栏https://blog.csdn.net/youcans/category_12418787.html 第 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θ0−sinθ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 WrotwcosθhsinθHrothcosθ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 pltif __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.0MAR0 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.0MAR2 cv.getRotationMatrix2D((x0,y0), theta, scale) # 逆时针旋转 30 度缩放比例 scaleimgRot2 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通过矩阵转置实现。 *图6-3 图像的旋转 版权声明 youcansxupt 原创作品转载必须标注原文链接(https://blog.csdn.net/youcans/article/details/134317103) Copyright 2023 youcans, XUPT Crated2023-11-11
欢迎关注本书CSDN独家连载专栏 《数字图像处理-OpenCV/Python》连载: https://blog.csdn.net/youcans/category_12418787.html