21. Scipy Tutorial-图像旋转变换

scipy的misc模块里提供了很多的内建图像数据,例如lena、face、ascent等,可供在scipy里直接访问这些图像数据并使用scipy提供的一些算法处理;scipy的ndimage模块里也有一些函数可以对scipy图像数据进行操作例如旋转函数rotate可以以任意角度旋转图像。无论怎样,图像数据在scipy、opencv里等都是一数组的形式存在,灰度图是二维的,而彩色图像数据是三维的,所以图像在scipy、numpy或者python里都是数组,那么在之前的章节NumPy矩阵的旋转研究了用自己的办法去旋转矩阵或者方阵,那么在scipy、Numpy里图像本质是数组,那么也可用NumPy矩阵的旋转章节里的方式去旋转图像!

本章简要介绍scipy.ndimage里的rotate函数,去旋转图像,本章还想再次尝试NumPy矩阵的旋转一章里的方法去旋转图像,看行不行?

21.1 ndimage.rotate旋转图像

scipy.ndimage里的rotate函数能旋转图像,功能挺强!

scipy.ndimage.rotate(input, angle, axes=(1, 0), reshape=True, output=None, order=3, mode='constant', cval=0.0, prefilter=True)

参数很多,angle需要说明,正数逆时针(向左)旋转,负数时顺时针(向右)旋转。

#coding:utf-8

from scipy import misc, ndimage

import matplotlib.pyplot as plt

import scipy

print "scipy version is:", scipy.__version__

src = misc.face()

misc.imsave('faceRGB.png', src)

img = ndimage.imread("faceRGB.png", mode = "L")

misc.imsave('faceGray.png', img)

plt.gray()

plt.subplot(221, title = "org"); plt.imshow(img)

plt.subplot(222, title = "right 90"); plt.imshow(ndimage.rotate(img, -90))

plt.subplot(223, title = "left 90"); plt.imshow(ndimage.rotate(img, 90))

plt.subplot(224, title = "rotate 180"); plt.imshow(ndimage.rotate(img, 180))

plt.show()

scipy.ndimage.rotate函数的牛A之处在于可以任意角度旋转!很厉害!

21.2 矩阵旋转图像

参考章节NumPy矩阵的旋转里提及的方法,对矩阵左乘、右乘一个负对角线为1,其他为0的方阵(记作为:$E^{-1}$),可以实现对图像数据的行列、旋转的变化,但此处的图像的数据不一定是方阵,在章节NumPy矩阵的旋转里提出了一个办法即先将图像扩充方阵、旋转、切片得到最后原数据的旋转数据,方法有点笨,其实有更一般的办法,和Numpy部分的13.2 Python实现方阵的旋转各节标题一致。更一般的规则如下:

$\bigotimes\ $对矩阵$A$左乘$E^{-1}$行交换,左乘需满足矩阵乘法规则即可,即矩阵$A_{m\times n}$左乘的$E^{-1}$的行列均应为$m$,即$E_{m\times m}^{-1}$。

$\bigotimes\ $对矩阵$A$右乘$E^{-1}$列交换,右乘需满足矩阵乘法规则即可,即矩阵$A_{m\times n}$右乘的$E^{-1}$的行列均应为$n$,即$E_{n\times n}^{-1}$。

$\bigotimes\ $对矩阵$A$的转置$A^{T}$左乘$E^{-1}$实现逆时针旋转$90^{\circ}$,左乘需满足矩阵乘法规则即可,即矩阵$A_{m\times n}$的转置$A_{n\times m}^{T}$左乘的$E^{-1}$的行列均应为$n$,即$E_{n\times n}^{-1}$。

$\bigotimes\ $对矩阵$A$的转置$A^{T}$右乘$E^{-1}$实现顺时针旋转$90^{\circ}$,右乘需满足矩阵乘法规则即可,即矩阵$A_{m\times n}$的转置$A_{n\times m}^{T}$右乘的$E^{-1}$的行列均应为$n$,即$E_{m\times m}^{-1}$。

$\bigotimes\ $对矩阵$A$左右各乘一个$E^{-1}$实现$180^{\circ}$的旋转,则矩阵$A_{m\times n}$左乘的$E^{-1}$的行列均应为$m$,即$E_{m\times m}^{-1}$。矩阵$A_{m\times n}$右乘的$E^{-1}$的行列均应为$n$,即$E_{n\times n}^{-1}$。

$\circ\ $这样需要获得矩阵的行列数,然后用这行列数构造两个$E^{-1}$分别为$E_{m\times m}^{-1}$和$E_{n\times n}^{-1}$,然后即可实现对图像的旋转和镜像了。

#coding:utf-8

import numpy as np

from scipy import misc, ndimage

import matplotlib.pyplot as plt

import scipy

print "scipy version is:", scipy.__version__

src = misc.face()

misc.imsave('faceRGB.png', src)

img = ndimage.imread("faceRGB.png", mode = "L")

misc.imsave('faceGray.png', img)

r, c = img.shape

print r, c

e_1_r = np.eye(r)[:,::-1]

print e_1_r

e_1_c = np.eye(c)[:,::-1]

print e_1_c

plt.gray()

plt.subplot(231, title = "org"); plt.imshow(img)

plt.subplot(236, title = "clockwise 90$^\circ \curvearrowright$"); plt.imshow(img.T.dot(e_1_r))

plt.subplot(233, title = "anti-clockwise 90$^\circ\curvearrowleft$"); plt.imshow(e_1_c.dot(img.T))

plt.subplot(232, title = "horizontal mirror $\leftrightarrow$"); plt.imshow(img.dot(e_1_c))

plt.subplot(234, title = "vertical mirror $\updownarrow$"); plt.imshow(e_1_r.dot(img))

plt.subplot(235, title = "rotate 180$^\circ \circlearrowleft$"); plt.imshow(e_1_r.dot(img).dot(e_1_c))

plt.show()

程序执行结果如下:

解析一下程序:

(1). 获得图片的行列数

r, c = img.shape

本图图像img的行r为768、列c为1024。并构造两个$E^{-1}$即$E_{768\times 768}^{-1}$和$E_{1024\times 1024}^{-1}$。

e_1_r = np.eye(r)[:,::-1]

e_1_c = np.eye(c)[:,::-1]

(2). 图像$img_{768\times 1024}$左乘$E_{768\times 768}^{-1}$可以得到垂直镜像的$vertical\ mirror$图像。

plt.subplot(234, title = "vertical mirror $\updownarrow$")

plt.imshow(e_1_r.dot(img))

(3). 图像$img_{768\times 1024}$右乘$E_{1024\times 1024}^{-1}$可以得到水平镜像的$horizontal\ mirror$图像。

plt.subplot(232, title = "horizontal mirror $\leftrightarrow$")

plt.imshow(img.dot(e_1_c))

(4). 图像$img_{768\times 1024}$左乘$E_{768\times 768}^{-1}$、右乘$E_{1024\times 1024}^{-1}$可以得到水平镜像的$rotate\ 180^\circ$图像。

plt.subplot(235, title = "rotate 180$^\circ \circlearrowleft$")

plt.imshow(e_1_r.dot(img).dot(e_1_c))

(5). 图像$img_{768\times 1024}$的转置$img_{1024\times 768}^{T}$左乘$E_{1024\times 1024}^{-1}$可以得到逆时针$90^{\circ}$旋转的$anti-clockwise\ 90^{\circ\curvearrowleft}$图像。

plt.subplot(233, title = "anti-clockwise 90$^\circ\curvearrowleft$")

plt.imshow(e_1_c.dot(img.T))

(6). 图像$img_{768\times 1024}$的转置$img_{1024\times 768}^{T}$右乘$E_{768\times 768}^{-1}$可以得到顺时针旋转$90^{\circ}$的$clockwise 90^\circ \curvearrowright$图像。

plt.subplot(236, title = "clockwise 90$^\circ \curvearrowright$")

plt.imshow(img.T.dot(e_1_r))

21.3 图像变换总结

$\bigotimes\ $对$A$左乘$E^{-1}$行换(垂直镜像)、右乘$E^{-1}$列换(水平镜像),左右乘$E^{-1}$旋转$ 180^\circ$。

$\bigotimes\ $对$A$的转置$A^{T}$左乘$E^{-1}$逆时针旋转$90^{\circ}$、右乘$E^{-1}$顺时针旋转$90^{\circ}$,左右乘$E^{-1}$负对角线镜像。

$\bigotimes\ $看来《线性代数》和《矩阵分析》得好好再学一下!

python三维图旋转_SciPyTutorial-图像的矩阵旋转变换相关推荐

  1. python 三维图直方图_Python | 阶梯直方图

    python 三维图直方图 A histogram is a graphical technique or a type of data representation using bars of di ...

  2. python 三维图 背景_Python 绘制酷炫的三维图步骤详解

    通常我们用 Python 绘制的都是二维平面图,但有时也需要绘制三维场景图,比如像下面这样的: 这些图怎么做出来呢?今天就来分享下如何一步步绘制出三维矢量(SVG)图. 八面体 我们先以下面这个八面体 ...

  3. python三维图的坐标_六维图见过么?Python 画出来了

    作者 | Prasad Ostwal 译者 | 高级农民工 我们的大脑通常最多能感知三维空间,超过三维就很难想象了.尽管是三维,理解起来也很费劲,所以大多数情况下都使用二维平面. 来自维基百科 不过, ...

  4. python三维图的坐标_用Python 画个六维图,涨姿势了

    关注后你就是我的人了 我们的大脑通常最多能感知三维空间,超过三维就很难想象了.尽管是三维,理解起来也很费劲,所以大多数情况下都使用二维平面. 来自维基百科 不过,我们仍然可以绘制出多维空间,今天就来用 ...

  5. python三维图视角旋转_如何在python中旋转3d图? (或作为动画)使用鼠标旋转三维视图...

    我有这段代码,其中包含一个3D图.我在Spyder中运行代码;我想知道是否可以使这个绘图旋转(360度)并保存. 谢谢! P.s.对不起,如果这是一个愚蠢的问题,但我是Python的newby.如何在 ...

  6. python三维图视角旋转_在python-matplotlib-Jupyter Noteb中交互式旋转三维绘图

    我想知道怎样才能像this视频中描述的那样交互地旋转一个3D图(如果你决定从上面或下面,或者从右边或左边).我可以在spyder或jupyter笔记本中生成一个3D图,但之后它仍然是静态的,我无法与之 ...

  7. python 三维数组_NumPy处理图像不香吗?我用Python把秋日里最美的景色做成了这种效果~...

    不知不觉中秋天悄悄的来了,天气开始转凉,每天匆匆忙忙的在路上,顾不得身边的变化,一抬眼,竟因秋叶久久驻足,今天我用Python把秋日里最美的景色做成了这种效果:NumPy做图像处理不香吗?先上图↓ 一 ...

  8. python三维图如何标注曲面_(python)使用colormap作为第4维,x,y,z函数绘制3d曲面 - python...

    我正在尝试绘制3d曲面,其中三个维度中的每个维度都在单独的值数组中,并且每个坐标处的曲面着色是x,y,z的函数.一种numpy.pcolormesh,但是是4D而不是3D的. 3D图由下式给出: fr ...

  9. python三维图能画地图_Python数据可视化:3D动态图,让你的足迹实现在地图上

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 以下文章来源于python数据分析之禅 ,作者小dull鸟 今天给大家带来一篇3 ...

最新文章

  1. PgSQL · 实战经验 · 如何预测Freeze IO风暴
  2. DedeCMS筛选简单实现方法不改后台源文件
  3. 运维工程师必备技能:网络排错
  4. RGB to HSB or RGB to HSL
  5. 主流mes厂商_工业软件:一文讲透国内外MES/MOM市场格局,主流厂商及其优势行业...
  6. 【线段树】扇形面积并(P3997)
  7. [Leetcode][第109题][JAVA][有序链表转换二叉搜索树][分治][快慢指针][中序遍历]
  8. noi 7627 鸡蛋的硬度
  9. POJ3752 字母旋转游戏【水题】
  10. c++排序算法之 快速排序
  11. 彼之蜜糖,我之砒霜;彼之敝履,吾之瑰宝
  12. linux机顶盒线刷工具,机顶盒刷机包通用版|PhoenixSuitpacket一键刷机工具 V1.10 官方最新版 下载_当下软件园_软件下载...
  13. 心理学在游戏设计中的作用
  14. 新浪实时股票数据接口http://hq.sinajs.cn/list=code
  15. android 虚拟按键自定义,Android手机底部栏虚拟按键的操作
  16. 我喜欢的LaTex编辑器
  17. 不要使用Python开发大型项目!
  18. 商城口碑颜值双高蓝牙耳机推荐,双11蓝牙耳机选购品牌排行榜
  19. 使用图嵌入方式检测异常日志
  20. 社会内卷的真正原因:华为内部论坛的这篇雄文火了

热门文章

  1. 无线网络会杀死固网? 不可能的事情
  2. 国办支持乡村医生建设 医疗信息化提速
  3. HDU 5411 CRB and Puzzle (2015年多校比赛第10场)
  4. poj-1031-fence(不是我写的,我只是想看着方便)
  5. 【原创翻译】如何命名变量
  6. Openfiler开启iSCSI服务(iSCSI Target)
  7. 分部类--重温篇[好处,示例]
  8. ucl 数据压缩开源库 简介
  9. linux shell脚本 报错dirname:无效选项 -- b 错误原因 解决方法
  10. python 安装库 报错 SSL: CERTIFICATE_VERIFY_FAILED 解决方法