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

目录
  • 前言
  • 使用 OpenCV 旋转图像
  • 使用 OpenCV 顺时针旋转图像
  • 围绕任意点旋转图像
  • 使用 Imutils 旋转图像
  • 总结

前言

本文,将描述使用 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图像旋转内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python imutils包基本概念及使用

    1.imutils功能简介 imutils是在OPenCV基础上的一个封装,达到更为简结的调用OPenCV接口的目的,它可以轻松的实现图像的平移,旋转,缩放,骨架化等一系列的操作. 安装方法: pip install imutils 在安装前应确认已安装numpy,scipy,matplotlib和opencv. 如果出现缺失包错误 可以使用下面安装命令,会把所有包安装 pip install NumPy SciPy opencv-python matplotlib imutils 2.imut

  • 超详细注释之OpenCV旋转图像任意角度

    上一篇博客介绍了 如何使用Python,OpenCV上下左右(或任意组合)平移图像.这篇博客将介绍如何使用OpenCV旋转图像任意角度.并演示如何使用imutils库中的两个函数imutils.rotate和imutils.rotate_bound不丢失细节的旋转图像. 使用OpenCV应用图像旋转时,有3种方法实现: cv2.getRotationMatrix2D 和 cv2.warpAffine: imutils.rotate 同方法1(可能局部丢失): imutils.rotate_bou

  • opencv实现图像旋转效果

    本文实例为大家分享了opencv实现图像旋转效果的具体代码,供大家参考,具体内容如下 图像旋转: 在opencv中首先根据旋转角度和中心获取旋转矩阵,然后根据旋转矩阵进行变换 参数: 实现代码: import numpy as np import cv2 as cv import matplotlib.pyplot as plt # 中文显示配置 plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.

  • Python imutils 填充图片周边为黑色的实现

    代码 import imutils import cv2 image = cv2.imread('') # translate the image x=25 pixels to the right and y=75 pixels up translated = imutils.translate(image, -75, 75) cv2.imshow('original image',image) cv2.imshow('translated',translated) cv2.waitKey(0)

  • python opencv旋转图像(保持图像不被裁减)

    本文实例为大家分享了python opencv旋转图像的具体代码,保持图像不被裁减,供大家参考,具体内容如下 # -*- coding:gb2312 -*- import cv2 from math import * import numpy as np img = cv2.imread("3-2.jpg") height,width=img.shape[:2] degree=45 #旋转后的尺寸 heightNew=int(width*fabs(sin(radians(degree)

  • OpenCV图像旋转Rotate的详细介绍

    目录 功能函数 getRotationMatrix2D函数原型 getRotationMatrix2D参数说明 warpAffine函数原型 warpAffine参数说明 C++测试代码 测试效果 功能函数 // 图像旋转 void Rotate(const cv::Mat &srcImage, cv::Mat &dstImage, double angle, cv::Point2f center, double scale) { cv::Mat M = cv::getRotationMa

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

    目录 前言 使用 OpenCV 旋转图像 使用 OpenCV 顺时针旋转图像 围绕任意点旋转图像 使用 Imutils 旋转图像 总结 前言 本文,将描述使用 OpenCV 和 Imutils 围绕任意点旋转指定角度的图像所需的步骤. 使用 OpenCV 旋转图像 使用 OpenCV 旋转图像: 1.使用 OpenCV 的 imread 函数加载所需的图像. 脚本:加载并显示原始图像 # import required library import cv2 # load image from d

  • python opencv对图像进行旋转且不裁剪图片的实现方法

    最近在做深度学习时需要用到图像处理相关的操作,在度娘上找到的图片旋转方法千篇一律,旋转完成的图片都不是原始大小,很苦恼,于是google到歪果仁的网站扒拉了一个方法,亲测好用,再次嫌弃天下文章一大抄的现象,虽然我也是抄歪果仁的. 废话不多说了,直接贴代码了. def rotate_bound(image, angle): # grab the dimensions of the image and then determine the # center (h, w) = image.shape[

  • Python OpenCV对图像像素进行操作

    目录 遍历并修改图像像素值 图像的加减乘除运算 遍历并修改图像像素值 在使用opencv处理图像时,有时需要对图像的每个像素点进行处理,比如取反.修改值等操作,就需要通过h和w遍历像素.依然以下图为例: 具体代码: import cv2 as cv import numpy as np def image_pixel(image_path: str): img = cv.imread(image_path, cv.IMREAD_COLOR) cv.imshow('input', img) h,

  • python实现图像外边界跟踪操作

    share一些python实现的code #!/usr/bin/env python #coding=utf-8 import cv2 img = cv2.imread("trace_border2.bmp") [img_h, img_w, img_channel] = img.shape trace = [] start_x = 0 start_y = 0 gray = img[:,:,1] for h in range(img_h): for w in range(img_w):

  • 基于OpenCV和C++ 实现图片旋转

    图片旋转,本质上是对旋转后的图片中每个像素点计算在原图的位置.然后照搬过来就好. (多说一句,如果计算出来在原图中的位置不是整数而是小数,因为像素点个数都是整数,就需要小数到整数的转换.这个转换过程是有讲究的,需要用到插值:最近邻插值.双线性插值等等.这里我使用的是最简单的最近邻插值,即对小数四舍五入成整数,C/C++ 实现四舍五入见 这里 ) 图形图像课上一般会介绍旋转变换矩阵,其中 t 为需要旋转的角度,[x'; y']是变换后坐标(其中分号表示上下关系): 即表示为:[x'; y'] =

  • opencv图片的任意角度旋转实现示例

    目录 一 旋转角度坐标的计算 二 旋转任意角度的步骤 三 实现 一 旋转角度坐标的计算 1.如果O点为圆心,则点P绕点O旋转redian弧度之后,点P的坐标变换为点Q的计算公式为: Q.x=P.x*cos(redian)-P.y*sin(redian) Q.y=P.x*sin(redian)+P.y*cos(redian) redian表示的为弧度 弧度与角度的变换公式为: redian=pi*180/angle 2. 如果O点不是圆心,则点P绕点O旋转redian弧度之后,点P的坐标变换为Q的

  • python使用OpenCV模块实现图像的融合示例代码

    可以通过OpenCV函数cv.add()或简单地通过numpy操作添加两个图像,res = img1 + img2.两个图像应该具有相同的深度和类型,或者第二个图像可以是标量值. 三种融合 注意融合时,一般来说两个图像的尺寸是一样大小的,如果大小不一样,需要把大的图像的某一部分先截出来,与小的图先融合,再作为整体替换掉原来大图中抠出的小图部分. """ # @Time : 2020/4/3 # @Author : JMChen """ impor

  • 使用Nibabel库对nii格式图像的读写操作

    因为后期主要的研究方向是医学图像处理,而现有手头的大部分数据都是nii格式或者是hdr,img格式的数据,所以首先第一步我们需要解决图像的读写问题. 其实使用OpenCV也可以方便的进行图像读取,但是这里暂时只学习Nibabel这个库,后面有时间的话再研究OpenCV在python中的使用. Nibabel的安装 可以通过pip进行安装 pip install nibabel 简单的图像读取和存储操作 import os import nibabel as nib # 读取图像 path='C:

  • 利用OpenCV中对图像数据进行64F和8U转换的方式

    在OpenCV中很多对数据的运算都需要转换为64F类型,比如伽玛变换,这个很明显要求幂的底数是double类型~ 而cvShowImage()又要求是U8才能显示,否则显示出来是一片空白! 所以经常要进行转换,怎么做呢?看了下面的几行代码你就知道了! IplImage *pSrcImage = cvLoadImage("pout.jpg", CV_LOAD_IMAGE_UNCHANGED); IplImage *pGrayImage_8U = cvCreateImage(cvGetSi

  • OpenCV识别提取图像中的水平线与垂直线

    本文实例为大家分享了OpenCV识别提取图像中的水平线与垂直线,供大家参考,具体内容如下 1).原理 图像形态学操作时候,可以通过自定义的结构元素实现结构元素 对输入图像一些对象敏感.另外一些对象不敏感,这样就会让敏感的对象改变而不敏感的对象保留输出.通过使用两个最基本的形态学操作 – 膨胀与腐蚀,使用不同的结构元素实现对输入图像的操作.得到想要的结果. -膨胀,输出的像素值是结构元素覆盖下输入图像的最大像素值 -腐蚀,输出的像素值是结构元素覆盖下输入图像的最小像素值 常见的形状:矩形.园.直线

随机推荐