OpenCV+Imutils实现图像的旋转操作

 更新时间:2022年05月16日 09:15:50   作者:woshicver  
imutils是在OPenCV基础上的一个封装,达到更为简结的调用OPenCV接口的目的,它可以轻松的实现图像的平移,旋转,缩放,骨架化等一系列的操作。本文将用其实现图像的旋转操作,感兴趣的可以学习一下

前言 

本文,将描述使用 OpenCV 和 Imutils 围绕任意点旋转指定角度的图像所需的步骤。

使用 OpenCV 旋转图像

使用 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。注意图像是逆时针方向旋转的吗?我们还可以通过在旋转矩阵中传递旋转角度的负值来顺时针旋转图像。

使用 OpenCV 顺时针旋转图像

脚本:

# 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 包提供了使用简单易用的旋转辅助函数沿任意点和任意角度旋转图像的简单步骤。

脚本:使用 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 包围绕中心或任何其他任意点以顺时针或逆时针方向旋转图像所需的步骤。还展示了如何旋转图像以保留完整视图,而不裁剪任何部分。

到此这篇关于OpenCV+Imutils实现图像的旋转操作的文章就介绍到这了,更多相关OpenCV Imutils图像旋转内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python进行常见图像形态学处理操作的示例代码

    Python进行常见图像形态学处理操作的示例代码

    这篇文章主要为大家详细介绍了如何使用Python进行常见的图像形态学处理,例如腐蚀、膨胀、礼帽、黑帽等,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • TensorFlow实现自定义Op方式

    TensorFlow实现自定义Op方式

    今天小编就为大家分享一篇TensorFlow实现自定义Op方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • matplotlib作图添加表格实例代码

    matplotlib作图添加表格实例代码

    这篇文章主要介绍了matplotlib作图添加表格实例代码,实例绘制了一个简单的折线图,并且在图中添加了一个表格,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • 用python基于appium模块开发一个自动收取能量的小助手

    用python基于appium模块开发一个自动收取能量的小助手

    大家都有了解过蚂蚁森林吧,本篇文章带给你自动收取蚂蚁森林能量的思路与方法,基于appium模块开发一个自动收取能量的小助手,本文给大家介绍的非常详细,对大家的学习或工作具有一定的价值
    2021-09-09
  • 使用pyqt5 实现ComboBox的鼠标点击触发事件

    使用pyqt5 实现ComboBox的鼠标点击触发事件

    这篇文章主要介绍了使用pyqt5 实现ComboBox的鼠标点击触发事件,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Python简单删除目录下文件以及文件夹的方法

    Python简单删除目录下文件以及文件夹的方法

    这篇文章主要介绍了Python简单删除目录下文件以及文件夹的方法,涉及Python使用shutil模块操作文件的相关技巧,需要的朋友可以参考下
    2015-05-05
  • Python 中 and, or, &, |, ^ 的使用小结

    Python 中 and, or, &, |, ^ 

    这篇文章主要介绍了Python 中 and, or, &, |, ^ 的使用小结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • 将Python的Django框架与认证系统整合的方法

    将Python的Django框架与认证系统整合的方法

    这篇文章主要介绍了将Python的Django框架与认证系统整合的方法,包括指定认证后台和编写认证后台等内容,需要的朋友可以参考下
    2015-07-07
  • python-parser.parse_args()解析参数问题

    python-parser.parse_args()解析参数问题

    这篇文章主要介绍了python-parser.parse_args()解析参数问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Python Unittest原理及基本使用方法

    Python Unittest原理及基本使用方法

    这篇文章主要介绍了Python Unittest原理及基本使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11

最新评论