OpenCV+Imutils实现图像的旋转操作
作者:woshicver 发布时间:2021-07-25 20:39:42
前言
本文,将描述使用 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 辅助函数而不是旋转函数来确保图像的所有部分都在旋转后的图像中。
来源:https://blog.csdn.net/woshicver/article/details/124777279
猜你喜欢
- 最近,由于工作需要统计一下文本文档中的各种不同类字符的数量。将txt文本文档中包含的的中文、英文、数字等字符数量进行统计。这当然可以使用py
- 1. 实例描述通过爬虫获取网页的信息时,有时需要登录网页后才可以获取网页中的可用数据,例如获取 GitHub 网页中的注册号码时,就需要先登
- 本人电脑是windows系统,装了Python3.7版本,但目前tensorflow支持最新的python版本为3.6,遂想再安装Pytho
- 如何用Python搞到小姐姐私房照本文纯技术角度出发,教你如何用Python爬虫获取百度图库海量照片——技术无罪。学会获取小姐姐私房照同理可
- 使用Python过程中,经常需要对文件和目录进行操作。所有file类/os/os.path/shutil模块时每个Python程序员必须学习
- 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。Python 自1.5版本起增加了re 模块,它提供 Pe
- API的应用通常会处理json数据,刚好今天看到了json字符串和python字符串的区别,放一段代码,区别一下子就看出来,的确json 库
- 前言本篇和大家分享的是使用python简化对jar包操作命令,封装成简短关键字或词,达到操作简便的目的。最近在回顾和构思shell脚本工具,
- 使用MySQL,安全问题不能不注意。以下是MySQL提示的23个注意事项:1.如果客户端和服务器端的连接需要跨越并通过不可信任的网络,那么就
- 下面是具体的步骤,试用于pycharm2016(亲测)1. File-->settings-->editor--&g
- views.py中的修改增加相应的请求处理函数:def getdevjson(request): print 'get here
- 微软 Office 提供基于 COM 接口的编程。Python 通过 pywin32 可以方便地调用各组件。如果下载和安装 pywin32
- 要求存在一个文件夹内有若干张图像,需要计算每张图片的RGB均值,并计算全部图像的RGB均值。代码# -*- coding: utf-8 -*
- 一、原型模式原型是相对于复制、克隆而言的,但是不同于模板,模板创造出的东西是一模一样,而原型创造出的东西是允许存在差异化和个性化的。原型模式
- 因为要用到过滤一组中重复的数据,使之变成没有重复的一组数据的功能,百度了一下,居然有朋友乱写,而且比较多,都没有认真测试过,只对字符可以,但
- 本文实例为大家分享了python实现分页效果展示的具体代码,供大家参考,具体内容如下难点:清空Layout#!/usr/bin/python
- 在windows 2003下,在运行web应用程序的时候出现一下错误: 服务器无法处理请求,-->对路径“C:/temp/mytest.tx
- Supervisor 是基于 Python 的进程管理工具,只能运行在 Unix-Like 的系统上,也就是无法运行在 Windows 上。
- 今天主题是实现并发服务器,实现方法有多种版本,先从简单的单进程代码实现到多进程,多线程的实现,最终引入一些高级模块来实现并发TCP服务器。说
- 将有安全问题的SQL过程删除.比较全面.一切为了安全!删除了调用shell,注册表,COM组件的破坏权限MS SQL SERVER2000使