当前位置: 首页 > news >正文

Python数组仿射变换

文章目录

    • 仿射变换
    • 坐标变换的逻辑
    • scipy实现

仿射变换

前面提到的平移、旋转以及缩放,都可以通过一个变换矩阵来实现,以二维空间中的变换矩阵为例,记点的坐标向量为 ( x , y , 1 ) (x,y,1) (x,y,1),则平移矩阵可表示为

[ 1 0 T x 0 1 T y 0 0 1 ] \begin{bmatrix} 1&0&T_x\\0&1&T_y\\0&0&1 \end{bmatrix} 100010TxTy1

旋转矩阵可表示为

[ cos ⁡ θ sin ⁡ θ − sin ⁡ θ cos ⁡ θ ] \begin{bmatrix} \cos\theta&\sin\theta\\-\sin\theta&\cos\theta \end{bmatrix} [cosθsinθsinθcosθ]

scipy.ndimage中,提供了专门的仿射变换函数affine_transform,用于坐标的仿射变换。

坐标变换的逻辑

假设现在有一个矩阵

[ a b c d ] \begin{bmatrix}a&b\\c&d\end{bmatrix} [acbd]

a , b , c , d a,b,c,d a,b,c,d的坐标为 ( 0 , 0 ) , ( 1 , 0 ) , ( 0 , 1 ) , ( 1 , 1 ) (0,0),(1,0),(0,1),(1,1) (0,0),(1,0),(0,1),(1,1),那么假设现在给出一个变换矩阵

M = [ 1 1 1 1 ] M=\begin{bmatrix}1&1\\1&1\end{bmatrix} M=[1111]

则坐标 ( 0 , 1 ) (0,1) (0,1)变为

[ 0 1 ] [ 1 1 1 1 ] = [ 1 1 ] \begin{bmatrix}0&1\end{bmatrix}\begin{bmatrix}1&1\\1&1\end{bmatrix}=\begin{bmatrix}1&1\end{bmatrix} [01][1111]=[11]

从而 ( 1 , 1 ) (1,1) (1,1)处的值变为 c c c。另一方面 ( 1 , 0 ) (1,0) (1,0)坐标也变为 ( 1 , 1 ) (1,1) (1,1),所以 ( 1 , 1 ) (1,1) (1,1)处也可能为 b b b

scipy实现

仿射变换函数支持output, order, mode, cval以及prefilter这5个参数,此外,二者均支持output_shape参数,用于调整输出的数组维度。除了这些参数之外,仿射变换的定义式为affine_transform(input, matrix, offset=0.0, ),其中matrix为变换矩阵,当输入不同维度的矩阵时,含义不同,设 n n n为输入数组的维度,则matrix的矩阵维度及其含义如下

  • n × n n\times n n×n 对每一个输出轴进行线性变换
  • ( n + 1 ) × ( n + 1 ) (n+1)\times (n+1) (n+1)×(n+1) 此时,offset参数将不起作用,相当于把最后一个维度的参数作为偏移量
  • n × ( n + 1 ) n\times (n+1) n×(n+1) offset参数亦不起作用,但相当于最后一行的偏移量设为0。
  • n n n 输入为一个向量,表示进行针对对角线的变换

下面仍以对仿射变换进行一个演示

import numpy as np
import matplotlib.pyplot as plt
from scipy.ndimage import *ori = np.eye(20)
ori[10, :] = 1.0a,b = 0.9,1.1
fDct = {"ori" : ori,"vector" : affine_transform(ori, [a, b], offset=(-10,-10)),"mat" : affine_transform(ori, [[a, b],[-b, a]], offset=(-10,10)),
}fig = plt.figure()
for i, key in enumerate(fDct):fig.add_subplot(1, 3, i+1)plt.imshow(fDct[key], cmap='gray_r')plt.title(key)plt.show()

效果如下

在这里插入图片描述

http://www.lryc.cn/news/60436.html

相关文章:

  • “==“和equals方法究竟有什么区别?
  • 蓝桥杯15单片机--超声波模块
  • 【学习笔记】ARC159
  • 2023/4/16总结
  • 【剑指offer】常用的数据增强的方法
  • /lib/lsb/init-functions文件解析
  • 【ChatGPT】ChatGPT-5 强到什么地步?
  • [ARM+Linux] 基于全志h616外设开发笔记
  • 如何实现24小时客户服务
  • 查询数据库空间(mysql和oracle)
  • 为什么 SQLite 一定要用 C 语言来开发?
  • TensorFlow Lite,ML Kit 和 Flutter 移动深度学习:6~11
  • 你的GPT跟ChatGPT可能只差了一个DPU
  • springboot服务端接口外网远程调试,并实现HTTP服务监听 - 内网穿透
  • NumPy的应用-1
  • k8s的yaml文件中kind类型详解
  • 第三天:C语言控制结构
  • 访问若依vue版后端api接口
  • 另一种迁移xxl-job任务的方法,适合不满足数据迁移条件
  • Redis缓存穿透、击穿、雪崩面试题详解
  • 【网络安全】本地提权漏洞分析
  • 电脑端(PC)按键精灵——3.其他命令
  • Hudi集成Flink-写入方式
  • 深度探索list
  • QQuick-自绘
  • 【算法】【算法杂谈】已知[1,m]的等概率函数,求[1,n]的等概率函数
  • 【Python】Python中的列表,元组,字典
  • 分布式系统概念和设计-分布式对象和远程调用
  • 11-FastDFS
  • Word这样用,提高效率不加班