Python彩色图像旋转+平移变换数学原理及实现

2023-11-21 03:20

本文主要是介绍Python彩色图像旋转+平移变换数学原理及实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、引言

图像的几何变换在图像处理中被经常使用,其中图像旋转又是使用频率很高的变换,不仅应用于普通的图像的处理中,也会用于机器学习中的图像数据增强。图像旋转的数学原理很简单,就是简单的矩阵乘法。
本文给出了图像旋转的Python详细实现过程(纯手工),此外也给出了python内嵌函数roate的用法。

二、数学原理及公式

学过线性代数的童鞋都知道如下的矩阵表示旋转矩阵:
在这里插入图片描述
如果再加上平移,则可以用齐次坐标的表示形式:
在这里插入图片描述
假设旋转之前的坐标为(x,y),绕坐标原点旋转之后的坐标为(x*, y*),则旋转+平移变换公式的矩阵形式为:
在这里插入图片描述
对于图像旋转平移变换而言,其实就是像素的坐标旋转,像素跟着坐标走而已。

三、Python手工实现图像旋转+平移

1.单通道图像旋转平移变换
图像旋转是以图像中心为旋转轴,因此图像在旋转之前需要把像素坐标进行中心化,然后再进行变换,代码如下:

#im为单通道图像像素矩阵
#theta为旋转角度(单位是:度°)
#deltaX和deltaY是沿着两个坐标轴方向的平移量
#返回旋转+平移变换结果图像imRT
def SingleChannelRatTrans( im, theta, deltaX, deltaY ):[m, n] = np.shape( im )halfM = np.int( np.floor(m / 2) )halfN = np.int( np.floor(n / 2) )imRT = np.zeros( [ m, n] )angle = theta / 180 * 3.1415926for i in range(m):for j in range(n):ii = i - halfMjj = j - halfNi1 = round( ii * math.cos( angle ) + jj * math.sin( angle ) + halfM + deltaX )j1 = round( -ii * math.sin( angle ) + jj * math.cos( angle ) + halfN + deltaY )if i1 >= 0 and  i1 < m and j1 >= 0 and j1 < n:imRT[i][j] = im[i1][j1]imRT = imRT.clip( 0, 255 )#限制灰度值在0~255之间imRT = np.rint(imRT).astype('uint8')#设置像素的数据类型 return imRT

2.灰度图像或彩色图像旋转平移变换
灰度图像直接调用前面的单通道图像变换函数即可。
彩色图像针对R、G、B分量分别调用单通道图变换函数即可。

def ImageRatationTranslation( im, theta, deltaX, deltaY ):dims = np.shape( im )#获取图像维数lens = len( dims )   #lens值为2则是灰度图像,为3则是彩色图像if lens == 2:#单通道图像imRT = SingleChannelRatTrans( im, theta, deltaX, deltaY )if lens == 3:#三通道图像imr = im[ :, :, 0 ]img = im[ :, :, 1 ]imb = im[ :, :, 2 ]imrRT = SingleChannelRatTrans( imr, theta, deltaX, deltaY )imgRT = SingleChannelRatTrans( img, theta, deltaX, deltaY )imbRT = SingleChannelRatTrans( imb, theta, deltaX, deltaY )imRT = np.stack( ( imrRT, imgRT, imbRT ), 2  )return imRT

3.完整的图像旋转平移变换代码

#图像旋转+平移变换
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import math
#单通道图像的旋转+平移变换
#im为单通道图像像素矩阵
#theta为旋转角度(单位是:度°)
#deltaX和deltaY是沿着两个坐标轴方向的平移量
#返回旋转+平移变换结果图像
def SingleChannelRatTrans( im, theta, deltaX, deltaY ):[m, n] = np.shape( im )halfM = np.int( np.floor(m / 2) )halfN = np.int( np.floor(n / 2) )imRT = np.zeros( [ m, n] )angle = theta / 180 * 3.1415926for i in range(m):for j in range(n):ii = i - halfMjj = j - halfNi1 = round( ii * math.cos( angle ) + jj * math.sin( angle ) + halfM + deltaX )j1 = round( -ii * math.sin( angle ) + jj * math.cos( angle ) + halfN + deltaY )if i1 >= 0 and  i1 < m and j1 >= 0 and j1 < n:imRT[i][j] = im[i1][j1]imRT = imRT.clip( 0, 255 )#限制灰度值在0~255之间imRT = np.rint(imRT).astype('uint8')#设置像素的数据类型 return imRT
#图像旋转+平移变换,可以是灰度图像,也可以是彩色图像
#画布大小为原图像的大小,因此旋转平移之后会有部分像素看不到
def ImageRatationTranslation( im, theta, deltaX, deltaY ):dims = np.shape( im )#获取图像维数lens = len( dims )   #lens值为2则是灰度图像,为3则是彩色图像if lens == 2:#单通道图像imRT = SingleChannelRatTrans( im, theta, deltaX, deltaY )if lens == 3:#三通道图像imr = im[ :, :, 0 ]img = im[ :, :, 1 ]imb = im[ :, :, 2 ]imrRT = SingleChannelRatTrans( imr, theta, deltaX, deltaY )imgRT = SingleChannelRatTrans( img, theta, deltaX, deltaY )imbRT = SingleChannelRatTrans( imb, theta, deltaX, deltaY )imRT = np.stack( ( imrRT, imgRT, imbRT ), 2  )return imRTdef main():im = np.array( Image.open('dog.jpg', 'r') )theta = -45imRT = ImageRatationTranslation( im, theta, 10, -80 )plt.figure()plt.imshow( im, cmap = 'gray' )plt.axis( 'off' )plt.figure()plt.imshow( imRT, cmap = 'gray' )plt.axis( 'off' )if __name__ == '__main__':main()

运行结果:
在这里插入图片描述
在这里插入图片描述

四、Python内嵌的命令rotate

语法规则:
output = im.rotate( angle, method )
其中im是图像矩阵,可以是单通道,也可以是多通道
angle是旋转角度,单位是度°,正值为逆时针,负值为顺时针
method是插值方法,可以是nearest、bilinear等
output是旋转之后的图像。
例如:

im = Image.open('dog.jpg', 'r')
imRT = im.rotate( 45, Image.NEAREST )
plt.figure()
plt.imshow( imRT, cmap = 'gray' )
plt.axis( 'off' )

运行结果如下:
在这里插入图片描述

这篇关于Python彩色图像旋转+平移变换数学原理及实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/399476

相关文章

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

IDEA中新建/切换Git分支的实现步骤

《IDEA中新建/切换Git分支的实现步骤》本文主要介绍了IDEA中新建/切换Git分支的实现步骤,通过菜单创建新分支并选择是否切换,创建后在Git详情或右键Checkout中切换分支,感兴趣的可以了... 前提:项目已被Git托管1、点击上方栏Git->NewBrancjsh...2、输入新的分支的

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四