在Python下利用OpenCV来旋转图像的教程


Posted in Python onApril 16, 2015

OpenCV是应用最被广泛的的开源视觉库。他允许你使用很少的代码来检测图片或视频中的人脸。

这里有一些互联网上的教程来阐述怎么在OpenCV中使用仿射变换(affine transform)旋转图片--他们并没有处理旋转一个图片里的矩形一般会把矩形的边角切掉这一问题,所以产生的图片需要修改。当正确的使用一点代码时,这是一点瑕疵。
 

def rotate_about_center(src, angle, scale=1.):
  w = src.shape[1]
  h = src.shape[0]
  rangle = np.deg2rad(angle) # angle in radians
  # now calculate new image width and height
  nw = (abs(np.sin(rangle)*h) + abs(np.cos(rangle)*w))*scale
  nh = (abs(np.cos(rangle)*h) + abs(np.sin(rangle)*w))*scale
  # ask OpenCV for the rotation matrix
  rot_mat = cv2.getRotationMatrix2D((nw*0.5, nh*0.5), angle, scale)
  # calculate the move from the old center to the new center combined
  # with the rotation
  rot_move = np.dot(rot_mat, np.array([(nw-w)*0.5, (nh-h)*0.5,0]))
  # the move only affects the translation, so update the translation
  # part of the transform
  rot_mat[0,2] += rot_move[0]
  rot_mat[1,2] += rot_move[1]
  return cv2.warpAffine(src, rot_mat, (int(math.ceil(nw)), int(math.ceil(nh))), flags=cv2.INTER_LANCZOS4)

从原始图像的中心到目标图像的中心,在旋转中的仿射变换必须结合 仿射变换的平移。一个在平面中(2D)的仿射变换是一个2x2的矩阵A和一个平移的向量a-它取得原始点p = (x,y)到目标:Ap + a.结合了两次变换Ap + a和Bp+b,先做A然后是B,软后得到了 B(Ap + a)+ b --另一个与矩阵BA和向量Ba + b的仿射变换。

在此情况下,我们正在把旋转功能与平移合并。作为相似变换的平移具有2x2矩阵I与运动矢量m的特征,所以,以Ip + m表示,我们想首先平移到新的中心,饭后旋转它,这样,在应用Ip + m 后我们旋转Rp + r,产生Rp + Rm + r,这解释了为什么我们不得不只增加两个系数。

附言:悲哀地说,如果numpy把输入的数据看作是矢量的矢量,而不是矩阵,那解释了乘法算子不是矩阵乘法,所以,我们必须明确地写入np.dot。

又附言:我们使用兰索斯插值,这一般对扩展有利而对把规模缩得非常小不利;考虑到应用方面,我们应该改编这个插值。

再附言:与Python的相互作用因cv2模块而改善很多,但是因为numpy的坐标不同于OpenCV,所以仍不可避免地有一些为完善之处。另外,因某个原因,OpenCV始终把各单元当作度数而不是弧度使用,等等。就numpy而言,图像阵列中的坐标是以[y,x]次序存取的,如首先垂直向下增加,接着水平向右增加一样。就OpenCV而言,大小用(宽度,高度)表示,次序正相反。

Python 相关文章推荐
Python多线程实例教程
Sep 06 Python
跟老齐学Python之正规地说一句话
Sep 28 Python
Python中文字符串截取问题
Jun 15 Python
Python的Django框架中的Context使用
Jul 15 Python
python万年历实现代码 含运行结果
May 20 Python
python数据结构链表之单向链表(实例讲解)
Jul 25 Python
Python wxPython库Core组件BoxSizer用法示例
Sep 03 Python
详解Python安装tesserocr遇到的各种问题及解决办法
Mar 07 Python
Django Python 获取请求头信息Content-Range的方法
Aug 06 Python
TensorFlow绘制loss/accuracy曲线的实例
Jan 21 Python
Python应用自动化部署工具Fabric原理及使用解析
Nov 30 Python
Python3.9.1中使用split()的处理方法(推荐)
Feb 07 Python
在Python中使用Neo4j数据库的教程
Apr 16 #Python
使用Python的Zato发送AMQP消息的教程
Apr 16 #Python
scrapy自定义pipeline类实现将采集数据保存到mongodb的方法
Apr 16 #Python
使用Python编写一个简单的tic-tac-toe游戏的教程
Apr 16 #Python
Python基于scrapy采集数据时使用代理服务器的方法
Apr 16 #Python
在Python的gevent框架下执行异步的Solr查询的教程
Apr 16 #Python
使用Python的Treq on Twisted来进行HTTP压力测试
Apr 16 #Python
You might like
Laravel使用memcached缓存对文章增删改查进行优化的方法
2016/10/08 PHP
PHP图像识别技术原理与实现
2016/10/27 PHP
doctype后如何获得body.clientHeight的方法
2007/07/11 Javascript
如何使用jquery动态加载js,css文件实现代码
2013/04/03 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
2014/04/08 Javascript
node.js中的require使用详解
2014/12/15 Javascript
jquery仅用6行代码实现滑动门效果
2015/09/07 Javascript
4种JavaScript实现简单tab选项卡切换的方法
2016/01/06 Javascript
AngularJS 工作原理详解
2016/08/18 Javascript
JavaScript实现向select下拉框中添加和删除元素的方法
2017/03/07 Javascript
基于jquery日历价格、库存等设置插件
2020/07/05 jQuery
JS实现评价的星星功能
2017/08/20 Javascript
浅谈react受控组件与非受控组件(小结)
2018/02/09 Javascript
详解Vue 全局引入bass.scss 处理方案
2018/03/26 Javascript
JavaScript实现简单的文本逐字打印效果示例
2018/04/12 Javascript
基于Vue自定义指令实现按钮级权限控制思路详解
2018/05/23 Javascript
JavaScript错误处理操作实例详解
2019/01/04 Javascript
基于Vue SEO的四种方案(小结)
2019/07/01 Javascript
浅析Vue中拆分视图层代码的5点建议
2019/08/15 Javascript
Vue组件间的通信pubsub-js实现步骤解析
2020/03/11 Javascript
vue 实现把路由单独分离出来
2020/08/13 Javascript
python实现简单socket通信的方法
2016/04/19 Python
如何将python中的List转化成dictionary
2016/08/15 Python
关于Python面向对象编程的知识点总结
2017/02/14 Python
python爬虫入门教程--优雅的HTTP库requests(二)
2017/05/25 Python
TF-IDF算法解析与Python实现方法详解
2017/11/16 Python
python+selenium 鼠标事件操作方法
2019/08/24 Python
浅谈tensorflow中Dataset图片的批量读取及维度的操作详解
2020/01/20 Python
使用Python爬取小姐姐图片(beautifulsoup法)
2021/02/11 Python
利用CSS3实现文本框的清除按钮相关的一些效果
2015/06/23 HTML / CSS
分解成质因数(如435234=251*17*17*3*2,据说是华为笔试题)
2014/07/16 面试题
移风易俗倡议书
2014/04/15 职场文书
商业街策划方案
2014/05/31 职场文书
学习计划书怎么写
2014/09/15 职场文书
高中物理教学反思
2016/02/19 职场文书
公文写作:教你写“建议书”
2019/05/07 职场文书