如何用OpenCV和mutils做图像旋转效果,步骤包括什么
Admin 2022-09-02 群英技术资讯 317 次浏览
本文,将描述使用 OpenCV 和 Imutils 围绕任意点旋转指定角度的图像所需的步骤。
使用 OpenCV 旋转图像:
1.使用 OpenCV 的 imread 函数加载所需的图像。
脚本:加载并显示原始图像
# import required library import cv2 # load image from disk image = cv2.imread('eiffel_tower.jpg') # display image cv2.imshow('Original image', image) cv2.waitKey(0)
导入了 OpenCV 库并使用 imread 函数从工作目录加载了埃菲尔铁塔的图像,然后使用 imshow 函数显示图像。
请注意,如果图像不在工作目录中,则提供给 imread 函数的参数值应包含图像的路径。
输出:
2.获取图像的空间维度(高度、宽度、中心坐标)。
脚本:获取图像的高度、宽度和中心坐标。
# get the dimensions of the image and calculate the center of the # image height, width = image.shape[:2] centerX, centerY = (width // 2, height // 2)
image.shape属性的前两个值分别返回图像的高度和宽度。整数除法用于获取中心位置的值,因为旋转图像的函数只接受整数值。中心位置值对于围绕中心旋转图像很有用。
3.定义一个旋转矩阵以围绕所需的点和旋转角度旋转图像。
脚本:定义一个旋转矩阵以将图像围绕中心旋转 45⁰。
# # rotate our image by 45 degrees around the center of the image # get rotation matrix M = cv2.getRotationMatrix2D((centerX, centerY), 45, 1.0)
cv2.getRotationMatrix2D函数(顾名思义)定义了一个二维矩阵,用于根据传递的参数值旋转图像。
该函数采用旋转点参数(在此示例中,图像的中心由坐标(centerX , centerY)表示)、以度为单位的旋转角度(在本例中为45度)和浮点值(在本例中为1.0 )指定旋转图像相对于原始图像的比例。
我们示例中的1.0比例值将旋转后的图像缩放为与原始图像相同的尺寸。较高的比例值会扩大图像,而较低的值会缩小图像。
4.根据旋转矩阵对图像进行旋转,并显示旋转后的图像。
脚本:将图像围绕中心旋转 45⁰。
# rotate image rotated = cv2.warpAffine(image, M, (width, height)) # display image cv2.imshow("Rotated by 45 Degrees", rotated) cv2.waitKey(0)
旋转矩阵 (M) 被传递给cv2.warpAffine函数,该函数根据旋转矩阵中指定的值对图像应用旋转。该函数还将图像宽度和高度的元组作为参数。
输出:
图像围绕中心旋转 450。注意图像是逆时针方向旋转的吗?我们还可以通过在旋转矩阵中传递旋转角度的负值来顺时针旋转图像。
脚本:
# rotate the image by 90 degrees in clockwise direction M = cv2.getRotationMatrix2D((centerX, centerY), -90, 0.5) rotated = cv2.warpAffine(image, M, (width, height)) cv2.imshow("Rotated by -90 Degrees", rotated) cv2.waitKey(0)
输出:
让我们比较一下如果我们通过 90⁰(逆时针 90⁰ 旋转)作为旋转角度而不是 -90⁰ 的情况。
请注意,图像以逆时针方向旋转,还将图像比例缩小了一半(通过传递 0.5 作为比例值)。
虽然之前已经沿中心(centerX, centerY)旋转了图像,但可以使用前面提到的类似步骤围绕图像中的任意点旋转图像。
脚本:将图像围绕点 (15, 10) 旋转 30 度。
# rotate our image around an arbitrary point M = cv2.getRotationMatrix2D((15, 10), 30, 1.0) rotated = cv2.warpAffine(image, M, (width, height)) cv2.imshow("Rotated around an Arbitrary Point", rotated) cv2.waitKey(0)
输出:
旋转如何切断图像的某些部分?我将在本文后面展示如何避免这种情况。
就像移动图像一样,Imutils 包提供了使用简单易用的旋转辅助函数沿任意点和任意角度旋转图像的简单步骤。
脚本:使用 Imutils 将图像顺时针旋转 30⁰。
# rotate our image around an arbitrary point M = cv2.getRotationMatrix2D((15, 10), 30, 1.0) rotated = cv2.warpAffine(image, M, (width, height)) cv2.imshow("Rotated around an Arbitrary Point", rotated) cv2.waitKey(0)
调用 imutils.rotate函数,通过将图像和旋转角度作为参数传递,将图像沿所需方向旋转。
输出:
就像在前面的图像中一样,旋转会切断图像的某些部分,虽然这可能在某些用例中是有意的,但我们可以编写代码,确保图像的所有部分仍然在视图中。
脚本:将图像旋转 30⁰,同时确保整个图像都在视图中。
# rotate the image by 30 degrees, ensuring the # entire rotated image still views in the viewing area rotated = imutils.rotate_bound(image, -30) cv2.imshow("Rotated Without Cropping", rotated) cv2.waitKey(0)
输出:
这次使用 cv2.rotate_bound 辅助函数而不是旋转函数来确保图像的所有部分都在旋转后的图像中。
本文展示了使用OpenCV和imutil 包围绕中心或任何其他任意点以顺时针或逆时针方向旋转图像所需的步骤。还展示了如何旋转图像以保留完整视图,而不裁剪任何部分。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
内容介绍准备工作全球火山带的分布可视化全球火山带的分布可视化优化地图可视化实战在地图上打上标记也就在前几天,南太平洋岛国汤加发生火山喷发,有专门的专家学者分析,这可能是30年来全球规模最大的一次海底火
torchtext在文本数据预处理方面特别强大,但我们要知道ta能做什么、不能做什么,并如何将我们的需求用torchtext实现。虽然torchtext是为pytorch而设计的,但是也可以与keras、tensorflow等结合使用。
什么是运算符重载,就是让自定义的类生成的对象(实例)能够使用运算符进行操作,这篇文章主要给大家介绍了关于Python运算符重载的相关资料,需要的朋友可以参考下
这篇文章主要介绍了解决pytorch load huge dataset(大数据加载)的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
如何理解Python中if语句,语法是什么?下文的讲解详细,步骤过程清晰,对大家进一步学习和理解相关知识有一定的帮助。有这方面学习需要的朋友就继续往下看吧!
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008