前面我们提到了图像的缩放变换,可以用矩阵乘法的形式来表达变换后的像素位置映射关系。

那么,对于旋转变换呢?我们可以同样将其想象成二维平面上矢量的旋转。如下图所示,矢量[x1,y1][x_1,y_1][x1​,y1​]逆时针旋转θθθ度到了[x2,y2][x_2,y_2][x2​,y2​]。


设定矢量的长度为s,根据坐标系定义,我们可以得到:
x2=s•cos⁡βy2=s•sin⁡β\begin{aligned} x2=s• cos⁡β\\ y2=s• sin⁡β \end{aligned} x2=s•cos⁡βy2=s•sin⁡β​

根据上面的图形,有:
β=α+θβ=α+θ β=α+θ

因此:
x2=s•cos⁡(α+θ)y2=s•sin⁡(α+θ)x2=s• cos⁡(α+θ) \\ y2=s• sin⁡(α+θ) x2=s•cos⁡(α+θ)y2=s•sin⁡(α+θ)

根据初中所学的三角函数公式:
sin⁡(α+θ)=sinα•cosθ+cosα•sinθcos⁡(α+θ)=cosα•cosθ−sinα•sinθsin⁡(α+θ)=sinα•cosθ+cosα•sinθ \\ cos⁡(α+θ)=cosα•cosθ-sinα•sinθ sin⁡(α+θ)=sinα•cosθ+cosα•sinθcos⁡(α+θ)=cosα•cosθ−sinα•sinθ

于是:
x2=s•cosα•cosθ−s•sinα•sinθy2=s•sinα•cosθ+s•cosα•sinθx2=s•cosα•cosθ-s•sinα•sinθ\\ y2=s•sinα•cosθ+s•cosα•sinθ x2=s•cosα•cosθ−s•sinα•sinθy2=s•sinα•cosθ+s•cosα•sinθ

由于:
x1=s•cos⁡αy1=s•sin⁡αx1=s• cos⁡α\\ y1=s• sin⁡α x1=s•cos⁡αy1=s•sin⁡α

因此:
x2=x1•cosθ−y1•sinθy2=x1•sinθ+y1•cosθx2=x1•cosθ-y1•sinθ\\ y2=x1•sinθ+y1•cosθ x2=x1•cosθ−y1•sinθy2=x1•sinθ+y1•cosθ

于是,上式写成矩阵乘法的形式如下:
[x2y2]=[cosθ−sinθsinθcosθ][x1y1]\begin{aligned} { \left[ \begin{array}{ccc} x2\\ y2\\ \end{array} \right ]}={ \left[ \begin{array}{ccc} cosθ& -sinθ\\ sinθ & cosθ\\ \end{array} \right ]}{ \left[ \begin{array}{ccc} x1\\ y1\\ \end{array} \right ]} \end{aligned} [x2y2​]=[cosθsinθ​−sinθcosθ​][x1y1​]​

我们来看看一个图像逆时针旋转180度的情况。

import cv2import numpy as np
import mathlenna = cv2.imread("lenna256.png", 0)
row, col = lenna.shapelenna_rotation = np.zeros_like(lenna)A = np.mat([[math.cos(math.pi), -math.sin(math.pi)], [math.sin(math.pi), math.cos(math.pi)]])for r in range(row):for l in range(col):v = np.dot(A.I, np.array([r, l]).T)lenna_rotation[r, l] = lenna[int(v[0, 0]), int(v[0, 1])]cv2.imshow("lenna", lenna)
cv2.imshow("rotation", lenna_rotation)
cv2.waitKey()


上面的图像宽度和高度是一样的,而且旋转角度是180度,比较特殊。在一般情况下,我们需要注意的是2点:一是旋转图像一般要将旋转中心设置在图像的中心点位置;二是图像旋转后,可能越过了原来的图像边界范围。这些都比较麻烦,好在opencv已经做好了这一切。

lenna = cv2.imread("lenna256.png", 0)
row, col = lenna.shape
M = cv2.getRotationMatrix2D((col // 2, row // 2), 70, 0.5)
dst = cv2.warpAffine(lenna, M, (col, row))
cv2.imshow("rotation", dst)
cv2.waitKey()

转载自:https://blog.csdn.net/saltriver/article/details/79680189

数字图像处理--图像旋转变换的推导相关推荐

  1. 数字图像处理--图像二阶导数的推导

    前面我们介绍过了图像的梯度,以及图像的几个梯度算子. 这些本质上都是一阶导数,或一阶微分.就是求图像灰度变化的导数,能够突出图像中的对象边缘.那有一阶导数,有没有二阶导数呢?求导数的导数,这对灰度变化 ...

  2. 数字图像处理图像反转的实现_使用8086微处理器反转16位数字

    数字图像处理图像反转的实现 Problem statement: 问题陈述: Write an assembly language program in 8086 microprocessor to ...

  3. 数字图像处理图像反转的实现_反转8位数字| 8085微处理器

    数字图像处理图像反转的实现 Problem statement: 问题陈述: To reverse 8 bits number using 8085 microprocessors. 使用8085微处 ...

  4. 数字图像处理课设图像的锐化_数字图像处理图像锐化处理.ppt

    数字图像处理图像锐化处理 4.7.2 灰度级到彩色转换 灰度级到彩色转换(例) 在HSI彩色空间的直方图均衡强度均衡处理没有改变图像的色调和饱和度值,但它的确影响了整体图像的彩色感观. 向量分量可以用 ...

  5. matlab 求其骨架,数字图像处理图像的骨架生成和提取(Matlab)三种方法

    [实例简介] 数字图像处理图像的骨架生成和提取(Matlab),有三种方法,推荐给大家! [实例截图] [核心代码] Programe ├── Programe1 │   ├── 00.JPG │   ...

  6. Matlab数字图像处理——图像的空间变换

    Matlab空间变换函数 imtransform Matlab空间变换函数 imtransform 可以实现图像仿射变换(如 平移.旋转.剪切.缩放).投影变换, 该函数可与 maketform 配合 ...

  7. 计算机图像进行滤波的函数,数字图像处理图像滤波.ppt

    数字图像处理图像滤波 图像滤波 图像处理中所用到的图像往往含有噪声,需要用图像滤波的方法去除噪声. 内容框架 像素基础知识介绍 算术和逻辑运算 直方图 直方图均衡算法,用于图像锐化. 图像增强基本方法 ...

  8. 《opencv 数字图像处理 图像基础》

    <opencv 数字图像处理 图像基础> 矩阵 通道分离和合并 彩色图像转灰度图像 灰度图转二值化图像 图像运算 矩阵 定义一个显示图像的函数,对于灰度图,里面添加了vmin=0,vmax ...

  9. 数字图像处理——图像退化与复原

    图像退化与复原 内容简介 1.图像退化与复原的原理 1.1 图像退化的数学模型 1.2 图像退化的原理 1.3 图像复原的原理 2. 图像去噪 2.1 噪声模型 2.2 噪声参数的估计 2.3 针对噪 ...

最新文章

  1. [给12306支招]取消车票预订-采用全额预售(充值)
  2. java基础学习总结——接口
  3. 《JavaScript面向对象编程指南》——1.3 分析现状
  4. oracle 查阻塞日志,通过Oracle补充日志,找到锁阻塞源头的SQL
  5. sata接口测试软件,方便用户,技嘉放出6系列主板SATA接口检测软件
  6. 使用命令行建立Zend Framework项目
  7. mysql数据库集群 主主复制 原理_MySql搭建集群 之 主主复制(双主代从)MYSQL数据库...
  8. 春节健康膳食,合理配搭
  9. centos7 firewalld
  10. java简单小程序输出所有汉字代码实例
  11. GitHub上提交代码之写给小白
  12. 半监督学习:MixMatch
  13. 什么是虚拟主机?有什么用?
  14. matlab 函数 矩阵,MATLAB常用矩阵函数
  15. 逆向的大门已经打开,就算为此过敏体质 也值了
  16. kaggle平台介绍
  17. 如何调用浏览器的拾色器
  18. My Interview
  19. 阿里巴巴戛纳首秀,带去了天猫全域营销
  20. 1年时间业务量疯长40倍,谈人人车的平台架构演进之路

热门文章

  1. Spring Boot 构建RESTful Web服务
  2. Odoo快速部署 附Odoo的Docker启动脚本
  3. crontab -e 报错(E518: Unknown option: foldenable)
  4. 【Error】Less-loader 版本过高,TypeError: this.getOptions is not a function
  5. 【Java】计算8+88+888+8888+....前12项的和
  6. 【C语言】利用递归函数求n的阶乘
  7. sqlmap源码阅读_listTamperingFunctions和_setTamperingFunctions
  8. ci/cd heroku_在GitLab上设置CI / CD以在Heroku上部署Python Flask应用程序
  9. java 数据溢出和编译错误的差别
  10. 教你用Python 每日定时推送睡前小故事给你__的人