python opencv旋转图片的使用方法


Posted in Python onJune 04, 2021

背景

在图像处理中,有的时候会有对图片进行角度旋转的处理,尤其是在计算机视觉中对于图像扩充,旋转角度扩充图片是一种常见的处理。这种旋转图片的应用场景也比较多,比如用户上传图片是竖着的时候,不好进行处理,也需要对其进行旋转,以便后续算法处理。常见的旋转处理有两种方式,一种是转化为numpy矩阵后,对numpy矩阵进行处理,另外一种是使用opencv自带的函数进行各种变换处理,以实现旋转角度的结果。

原始图像:

python opencv旋转图片的使用方法

opencv函数

旋转中常用的函数有以下几个函数

cv2.transpose: 对图像矩阵进行转置处理

img = cv2.imread(origin_img_path)
img_transpose = cv2.transpose(img)
cv2.imshow('transpose', img_transpose)
cv2.waitKey(0)

python opencv旋转图片的使用方法

cv2.flip : 对图像矩阵进行翻转处理,参数可以设置为1,0,-1,分别对应着水平翻转、垂直翻转、水平垂直翻转。

img = cv2.imread(origin_img_path)
img_flip = cv2.flip(img, 1)
cv2.imshow('flip', img_flip)
cv2.waitKey(0)

python opencv旋转图片的使用方法

cv2.getRotationMatrix2D: 构建旋转矩阵M,后续旋转时候只需要与旋转矩阵进行乘积即可完成旋转操作

旋转矩阵M

python opencv旋转图片的使用方法

img = cv2.imread(origin_img_path)
rows, cols = img.shape
# 这里的第一个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子
# 可以通过设置旋转中心,缩放因子以及窗口大小来防止旋转后超出边界的问题
M = cv2.getRotationMatrix2D((cols/2,rows/2),45,0.6)

cv2.warpAffine: 对图像进行仿射变换,一般进行平移或者旋转操作

img = cv2.imread(origin_img_path)
cv2.warpAffine(img, M,(lengh,lengh),borderValue=(255,255,255))  # M为上面的旋转矩阵

numpy函数

numpy实现旋转一般是使用numpy.rot90对图像进行90度倍数的旋转操作

官方介绍:

numpy.rot90(m, k=1, axes=(0, 1))[source]

Rotate an array by 90 degrees in the plane specified by axes.

Rotation direction is from the first towards the second axis.

k: Number of times the array is rotated by 90 degrees.

关键参数k表示旋转90度的倍数,k的取值一般为1、2、3,分别表示旋转90度、180度、270度;k也可以取负数,-1、-2、-3。k取正数表示逆时针旋转,取负数表示顺时针旋转。

旋转90度

逆时针

  • 使用opencv函数的转置操作+翻转操作实现旋转
  • 使用numpy.rot90实现
def rotateAntiClockWise90(img_file):  # 逆时针旋转90度
	img = cv2.imread(img_file)
    trans_img = cv2.transpose(img)
    img90 = cv2.flip(trans_img, 0)
    cv2.imshow("rotate", img90)
    cv2.waitKey(0)
    return img90
    
def totateAntiClockWise90ByNumpy(img_file):  # np.rot90(img, -1) 逆时针旋转90度
    img = cv2.imread(img_file)
    img90 = np.rot90(img, -1)
    cv2.imshow("rotate", img90)
    cv2.waitKey(0)
    return img90

python opencv旋转图片的使用方法

顺时针

def rotateClockWise90(self, img_file):
	img = cv2.imread(img_file)
    trans_img = cv2.transpose( img )
    img90 = cv2.flip(trans_img, 1)
    cv2.imshow("rotate", img90)
    cv2.waitKey(0)
    return img90

def totateClockWise90ByNumpy(img_file):  # np.rot90(img, 1) 顺时针旋转90度
    img = cv2.imread(img_file)
    img90 = np.rot90(img, 1)
    cv2.imshow("rotate", img90)
    cv2.waitKey(0)
    return img90

python opencv旋转图片的使用方法

旋转180度、270度

使用numpy.rot90实现旋转180度、270度

180度

img180 = np.rot90(img, 2)
cv2.imshow("rotate", img180)
cv2.waitKey(0)

python opencv旋转图片的使用方法

270 度

img270 = np.rot90(img, 3)
cv2.imshow("rotate", img270)
cv2.waitKey(0)

python opencv旋转图片的使用方法

旋转任意角度,以任意色值填充背景

import cv2
from math import *
import numpy as np
 
# 旋转angle角度,缺失背景白色(255, 255, 255)填充
def rotate_bound_white_bg(image, angle):
    # grab the dimensions of the image and then determine the
    # center
    (h, w) = image.shape[:2]
    (cX, cY) = (w // 2, h // 2)
 
    # grab the rotation matrix (applying the negative of the
    # angle to rotate clockwise), then grab the sine and cosine
    # (i.e., the rotation components of the matrix)
    # -angle位置参数为角度参数负值表示顺时针旋转; 1.0位置参数scale是调整尺寸比例(图像缩放参数),建议0.75
    M = cv2.getRotationMatrix2D((cX, cY), -angle, 1.0)
    cos = np.abs(M[0, 0])
    sin = np.abs(M[0, 1])
 
    # compute the new bounding dimensions of the image
    nW = int((h * sin) + (w * cos))
    nH = int((h * cos) + (w * sin))
 
    # adjust the rotation matrix to take into account translation
    M[0, 2] += (nW / 2) - cX
    M[1, 2] += (nH / 2) - cY
 
    # perform the actual rotation and return the image
    # borderValue 缺失背景填充色彩,此处为白色,可自定义
    return cv2.warpAffine(image, M, (nW, nH),borderValue=(255,255,255))
    # borderValue 缺省,默认是黑色(0, 0 , 0)
    # return cv2.warpAffine(image, M, (nW, nH))
 
img = cv2.imread("dog.png")
imgRotation = rotate_bound_white_bg(img, 45)
 
cv2.imshow("img",img)
cv2.imshow("imgRotation",imgRotation)
cv2.waitKey(0)

45度

python opencv旋转图片的使用方法

60度

python opencv旋转图片的使用方法

参考

cv2.getRotationMatrix2D博客介绍

cv2.warpAffine 博客介绍

numpy.rot90

旋转任意角度

到此这篇关于python opencv旋转图片的使用方法的文章就介绍到这了,更多相关python opencv旋转图片内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python实现图片变亮或者变暗的方法
Jun 01 Python
详解Python的Twisted框架中reactor事件管理器的用法
May 25 Python
浅谈tensorflow1.0 池化层(pooling)和全连接层(dense)
Apr 27 Python
python之mock模块基本使用方法详解
Jun 27 Python
python字符串切割:str.split()与re.split()的对比分析
Jul 16 Python
python支付宝支付示例详解
Aug 22 Python
pandas-resample按时间聚合实例
Dec 27 Python
检测tensorflow是否使用gpu进行计算的方式
Feb 03 Python
python检查目录文件权限并修改目录文件权限的操作
Mar 11 Python
Django项目创建及管理实现流程详解
Oct 13 Python
只用Python就可以制作的简单词云
Jun 07 Python
python元组打包和解包过程详解
Aug 02 Python
Python还能这么玩之用Python修改了班花的开机密码
Anaconda安装pytorch及配置PyCharm 2021环境
python如何利用cv2模块读取显示保存图片
Jun 04 #Python
Python实现socket库网络通信套接字
Jun 04 #Python
python cv2图像质量压缩的算法示例
Jun 04 #Python
高考要来啦!用Python爬取历年高考数据并分析
单身狗福利?Python爬取某婚恋网征婚数据
You might like
使用sockets:从新闻组中获取文章(二)
2006/10/09 PHP
一个从别的网站抓取信息的例子(域名查询)
2006/10/09 PHP
PHP添加MySQL数据记录代码
2008/06/07 PHP
解析PHP提交后跳转
2013/06/23 PHP
CodeIgniter错误mysql_connect(): No such file or directory解决方法
2014/09/06 PHP
PHP 芝麻信用接入的注意事项
2016/12/01 PHP
javascript showModalDialog,open取得父窗口的方法
2010/03/10 Javascript
模仿百度三维地图的js数据分享
2011/05/12 Javascript
window.event快达到全浏览器支持了,以后使用就方便了
2011/11/30 Javascript
jQuery不兼容input的change事件问题解决过程
2014/12/05 Javascript
Jquery网页内滑动缓冲导航的实现代码
2015/04/05 Javascript
jquery 实现回车登录详解及实例代码
2016/10/23 Javascript
jQuery学习笔记——jqGrid的使用记录(实现分页、搜索功能)
2016/11/09 Javascript
jQuery动态生成表格及右键菜单功能示例
2017/01/13 Javascript
完美实现js选项卡切换效果(二)
2017/03/08 Javascript
理解 Node.js 事件驱动机制的原理
2017/08/16 Javascript
JS实现按钮颜色切换效果
2020/09/05 Javascript
vue2.0安装style/css loader的方法
2018/03/14 Javascript
vue+node实现图片上传及预览的示例方法
2018/11/22 Javascript
详解Vue底部导航栏组件
2019/05/02 Javascript
微信小程序实现发微博功能的示例代码
2020/06/24 Javascript
vue制作toast组件npm包示例代码
2020/10/29 Javascript
用Python从零实现贝叶斯分类器的机器学习的教程
2015/03/31 Python
python基于http下载视频或音频
2018/06/20 Python
pandas DataFrame 行列索引及值的获取的方法
2019/07/02 Python
德国最大的网上鞋店之一:Schuhe24.de
2017/06/10 全球购物
编辑个人求职信范文
2013/09/21 职场文书
初中物理教学反思
2014/01/14 职场文书
学习保证书
2015/01/17 职场文书
专家推荐信怎么写
2015/03/25 职场文书
餐厅服务员管理制度
2015/08/05 职场文书
离婚协议书范本(2016最新版)
2016/03/18 职场文书
考生诚信考试承诺书(2016版)
2016/03/25 职场文书
高考满分作文赏析(2篇)
2019/08/12 职场文书
七年级作文之环保作文
2019/10/17 职场文书
python获取带有返回值的多线程
2022/05/02 Python