参考链接:http://www.echojb.com/image/2016/11/14/258268.html

一、首先来说一下关于像素旋转一定角度后的对应位置:

(1)旋转中心为左上角原点

旋转有一个绕什么转的问题。我们先来看最简单的,绕第一个像素转,则旋转的情况会像这样:

令旋转前有

旋转a角度后有

以矩阵形式表示为

(2)旋转中心为图像中心

当图片较大时,计算会很慢。主要是判断和计算太多了这里只讨论图像处理,程序的优化暂时放一边运行结果如下:

我们能看到,旋转后的图像有很多“蜂窝煤”。主要是点转换后要取整。导致原图中有些点映射到同一个点,而生成的图中有些点在原图中没有点映射到它。所以出现了很多“蜂窝煤”。果然理论还只是理论啊 下面我们来看看更通常一点的做法:以图像的中心为圆心进行旋转。这里涉及到一个坐标系的转换问题。看下图:

在矩阵中我们的坐标系通常是AB和AC方向的,而传统的笛卡尔直角坐标系是DE和DF方向的。令图像表示为M×N的矩阵,对于点A而言,两坐标系中的坐标分别是(0,0)和(-N/2,M/2)矩阵中点(x',y')转换为笛卡尔坐标系(x,y)的转换关系为:

逆变换为

于是我们得到图像以中心旋转的思路

  • 将矩阵坐标上点(原谅我这样称呼它)转换为笛卡尔坐标系
  • 将该点旋转a度。旋转公式前面已经给出了
  • 将旋转后的点再转换为矩阵坐标

于是得到最后结果

python中numpy有矩阵运算能力,但这里我们直接进行数值计算就可以了。用方程表示如下:

二、关于图像旋转:

M = cv2.getRotationMatrix2D(crop_center, (a * (-1)), 1.0)  #顺时针旋转
tar_img = cv2.warpAffine(crop_img, M, (crop_width, crop_height))  #旋转后的图片

如上,首先使用getRotationMatrix2D获取旋转矩阵,然后再使用warpAffine利用这个矩阵进行旋转;

总结:计算像素旋转的核心算法其实就是像平面坐标系和笛卡尔坐标系之间的转换,因为直接旋转像平面坐标系不太好计算旋转之后的像素的位置,但是基于笛卡尔坐标系下计算像素旋转后的位置却很容易,因此这里引入了笛卡尔坐标系作为一个辅助坐标系,这种思想很重要的!比如在摄影测量学中,为了建立像平面上的点和对应的大地坐标下的点的对应关系,引入了像空坐标系,像辅坐标系,这样一来通过像平面坐标系-》像空坐标系-》像辅坐标系-》大地坐标系,就建立了对应关系。所以通过构建辅助坐标系在计算空间关系时特别有用!!!

注意:像素旋转中使用到的公式针对的是逆时针旋转,而图像旋转中使用到的是顺时针旋转!!!所以在同时使用的时候要特别注意这一点(可能要乘一个-1)!

 

放上一段我自己写的代码,用到了这两个旋转:

def rotation(src_img_size , crop_img , src_box_info , src_pts , angle):  #返回旋转后的pts坐标和boc框src_height = int(src_img_size[0])  #原始大图片的尺寸src_width = int(src_img_size[1])crop_height = crop_img.shape[0]  #截取的图片尺寸crop_width = crop_img.shape[1]tar_pts = np.zeros((4 , 2) , dtype = int)tar_box_info = np.zeros((2 , 2) , dtype = int)  #存储缩放后的box框a = random.randint(0 , angle)angle_pi = a * math.pi / 180.0#crop_img进行旋转============================================================================crop_center = (crop_width / 2 , crop_height / 2)  #旋转中心设为图片中心M = cv2.getRotationMatrix2D(crop_center, (a * (-1)), 1.0)  #顺时针旋转tar_img = cv2.warpAffine(crop_img, M, (crop_width, crop_height))  #旋转后的图片#============================================================================================for i in range(len(src_pts) / 2):tar_pts[i][0] = int(int(src_pts[2 * i]) * math.cos(angle_pi) - int(src_pts[2 * i + 1]) * math.sin(angle_pi) - 0.5 * src_width * math.cos(angle_pi) + 0.5 * src_height * math.sin(angle_pi) + 0.5 * src_width)tar_pts[i][1] = int(int(src_pts[2 * i]) * math.sin(angle_pi) + int(src_pts[2 * i + 1]) * math.cos(angle_pi) - 0.5 * src_width * math.sin(angle_pi) - 0.5 * src_height * math.cos(angle_pi) + 0.5 * src_height)for i in range(len(src_box_info) / 2):tar_box_info[i][0] = int(int(src_box_info[2 * i]) * math.cos(angle_pi) - int(src_box_info[2 * i + 1]) * math.sin(angle_pi) - 0.5 * src_width * math.cos(angle_pi) + 0.5 * src_height * math.sin(angle_pi) + 0.5 * src_width)tar_box_info[i][1] = int(int(src_box_info[2 * i]) * math.sin(angle_pi) + int(src_box_info[2 * i + 1]) * math.cos(angle_pi) - 0.5 * src_width * math.sin(angle_pi) - 0.5 * src_height * math.cos(angle_pi) + 0.5 * src_height)return tar_img , tar_box_info , tar_pts

转载于:https://www.cnblogs.com/zf-blog/p/8947800.html

关于图像旋转以及旋转后对应像素的位置相关推荐

  1. opencv 图像仿射变换 计算仿射变换后对应特征点的新坐标 图像旋转、缩放、平移...

    常常需要最图像进行仿射变换,仿射变换后,我们可能需要将原来图像中的特征点坐标进行重新计算,获得原来图像中例如眼睛瞳孔坐标的新的位置,用于在新得到图像中继续利用瞳孔位置坐标. 仿射变换在:http:// ...

  2. OpenCV——图像的平移旋转

    1.学习图像数据格式Mat 像素就是把图形分割成很多大小相等的小正方形,其中每一个都是一个像素.我们常见的800*600的图形,800代表宽度,600代表高度. 灰度图像就是黑白灰,只有这三种颜色,其 ...

  3. python如何移动图片_python之详细图像仿射变换讲解(图像平移、旋转、缩放、翻转),一文就够了,赶紧码住...

    仿射变换简介 什么是放射变换 图像上的仿射变换, 其实就是图片中的一个像素点,通过某种变换,移动到另外一个地方. 从数学上来讲, 就是一个向量空间进行一次线形变换并加上平移向量, 从而变换到另外一个向 ...

  4. MATLAB图像平移、旋转、缩放、裁剪

    版本: MATLAB R2019a 目录 (一)图像平移 (二)图像旋转 1.图像尺寸不变 2.图像信息不丢失 (三)图像缩放 (四)图像裁剪 (一)图像平移 使用MATLAB自带函数 transla ...

  5. matlab将图像用傅里叶旋转,用matlab实现数字图像处理几个简单例子.doc

    用matlab实现数字图像处理几个简单例子.doc 实验报告实验一 图像的傅里叶变换(旋转性质)实验二 图像的代数运算实验三 filter2 实现均值滤波实验四 图像的缩放朱锦璐04085122实验一 ...

  6. Python图像处理丨图像缩放、旋转、翻转与图像平移

    摘要:本篇文章主要讲解Python调用OpenCV实现图像位移操作.旋转和翻转效果,包括四部分知识:图像缩放.图像旋转.图像翻转.图像平移. 本文分享自华为云社区<[Python图像处理] 六. ...

  7. tensorflow 旋转图片_使用TensorFlow对图像进行随机旋转的实现示例

    https://www.jb51.net/article/178934.htm 在使用深度学习对图像进行训练时,对图像进行随机旋转有助于提升模型泛化能力.然而之前在做旋转等预处理工作时,都是先对图像进 ...

  8. 图像缩放、旋转、翻转、平移

    本文介绍几种常见的图像几何变换方法. 1. 图像缩放 图像缩放就是将源图像中的像素点经过算法映射到目标图像的像素点的过程,即找出目标图像中的像素点Pd(Xd,Yd)对应的源图像的像素点Ps(Xs,Ys ...

  9. matlab图像处理二,图像缩放、旋转、修剪

    图像的缩放 A = imresize(I, scale). I:原图像 scale:>1,放大:<1,缩小 A:缩放后的图像 I=imread('C:\Users\14372\Deskto ...

最新文章

  1. hdu1695(莫比乌斯)或欧拉函数+容斥
  2. 查看磁盤使用情况linux,在Linux系统下安装Filelight来查看磁盘使用情况
  3. linux 更改 引导分区,Linux系统引导过程及引导修复
  4. 搞不定的C语言--extern的作用
  5. 普通的测试员和牛逼的测试员有什么区别?完成这两次跨越,你也可以
  6. oracle实现主键自增长及自动生成策略
  7. 「代码随想录」70. 爬楼梯【动态规划】(完全背包解法)
  8. String类源码阅读
  9. JQuery Easyui/TopJUI 创建多级联动下拉框(纯HTML实现!!!)
  10. 搞懂差分密码分析,看这篇文章就够了!!
  11. AD转换及其相关背景知识
  12. 学习方法:坚持输出学习法
  13. Winedit 10的使用方法,网上修改注册表的已经不管用了。
  14. Python 第三方模块 科学计算 SymPy模块
  15. 【Pygame实战】末世来临,真正从零开始的残酷生存游戏,你能活多久?
  16. JS使用canvas实现(下雨天)特效
  17. 蓝桥杯练习 数的读法
  18. java中的math.abs_java – Math.abs(a – b)的更快实现 – Math.abs(c – d)?
  19. 给博客增加豆瓣观影和阅读
  20. 模电课程设计——信号发生器

热门文章

  1. Springer期刊 latex投稿经验分享(包含latex模板)
  2. 什么是linux内核
  3. .NET(C#)常用数据加密和解密方法汇总
  4. C++ 多线程:std::future
  5. ENVI遥感数字图像处理方法(一)
  6. Java实现 LeetCode 455 分发饼干
  7. 【单选题】为了侵入用屏蔽予网体系结构保护的内部网络,侵袭者必须要通过
  8. Web3D工程师(three.js)北京招聘
  9. 讲真的,千万别得罪会PS的人
  10. 图像处理就业(转)-----本人研究生正攻读本方向,不得不看看