图像仿射变换与双线性插值

news2024/11/14 16:20:12

图像变换

下面的所有变换假设都是针对一幅图像,即一个三维数组(HWC),这里为简单起见,假设图像都是单通道(C=1)的。

  • ( x , y ) (x,y) (x,y): 原图像中某一点 A 的位置
  • ( x ′ , y ′ ) (x′,y′) (x,y): 变换后图像中 A 点对应的位置

几种常用的线性变换

平移(translation)

若将原图像沿 x和 y方向分别平移δx和δy,即:
x ′ = x + δ x y ′ = x + δ y x′=x+δx\\y′=x+δy x=x+δxy=x+δy
写成矩阵形式如下:
在这里插入图片描述

缩放(Scaling)

假设将图像分别沿 x和 y方向分别缩放 p倍和 q倍,且 p>0,q>0,即:

x ′ = p x y ′ = q y x′=px\\y′=qy x=pxy=qy

写成矩阵形式如下:

在这里插入图片描述

旋转(Rotation)

img 图 1. 旋转变换示意图

如上图所示,点 A旋转θ角到点 B,由 B点可得

x ′ = R c o s α y ′ = R s i n α x′=Rcosα\\y′=Rsinα x=Rcosαy=Rsinα

由A点可得:

x = R c o s ( α + θ ) = R c o s ( α ) c o s θ + R s i n ( α ) s i n ( θ ) y = R s i n ( α + θ ) = R s i n ( α ) c o s θ − R c o s ( α ) s i n ( θ ) x=Rcos(α+θ)=Rcos(α)cosθ+Rsin(α)sin(θ)\\ y=Rsin(α+θ)=Rsin(α)cosθ−Rcos(α)sin(θ) x=Rcos(α+θ)=Rcos(α)cosθ+Rsin(α)sin(θ)y=Rsin(α+θ)=Rsin(α)cosθRcos(α)sin(θ)

整理可得:
x ′ = x c o s θ + y s i n θ y ′ = − x s i n θ + y c o s θ x′=xcosθ+ysinθ\\ y′=−xsinθ+ycosθ x=xcosθ+ysinθy=xsinθ+ycosθ
写成矩阵形式如下:
在这里插入图片描述

剪切 (Shear)

剪切变换相当于将图片沿 x和 y两个方向拉伸,且 x方向拉伸长度与 y有关,y方向拉伸长度与 x有关,用矩阵形式表示前切变换如下:
在这里插入图片描述

仿射变换

其实上面几种常见变换都可以用同一种变换来表示,就是仿射变换,它有更一般的形式,如下:

在这里插入图片描述

  • a = e = 1 , b = c = d = f = 0 a=e=1,b=c=d=f=0 a=e=1,b=c=d=f=0为恒等变换,即输入图像不变;

  • a = e = 1 , b = d = 0 a=e=1,b=d=0 a=e=1,b=d=0时,为平移变换;

  • a = c o s θ , b = s i n θ , d = − s i n θ , e = c o s θ , c = f = 0 a=cosθ,b=sinθ,d=−sinθ,e=cosθ,c=f=0 a=cosθ,b=sinθ,d=sinθ,e=cosθ,c=f=0时,为旋转变换;

  • a = e = 1 , c = f = 0 a=e=1,c=f=0 a=e=1,c=f=0时,为剪切变换。

  • 当 6 个参数取其他值时,为一般的仿射变换,效果相当于从不同的位置看同一个目标。

在这里插入图片描述

双线性插值

在对图像进行仿射变换时,会出现一个问题,当原图像中某一点的坐标映射到变换后图像时,坐标可能会出现小数(如图 2 所示),而我们知道,图像上某一像素点的位置坐标只能是整数,那该怎么办?这时候双线性插值就起作用了。
img 双线性插值的基本思想是通过某一点周围四个点的灰度值来估计出该点的灰度值,如图 3 所示.
img
在实现时我们通常将变换后图像上所有的位置映射到原图像计算(这样做比正向计算方便得多),即依次遍历变换后图像上所有的像素点,根据仿射变换矩阵计算出映射到原图像上的坐标(可能出现小数),然后用双线性插值,根据该点周围 4 个位置的值加权平均得到该点值。过程可用如下公式表示:
在这里插入图片描述
将 (11) 代入 (12) 整理得:
在这里插入图片描述
因为Q11,Q12,Q21,Q22

是相邻的四个点,所以 y 2 − y 1 = 1 , x 2 − x 1 = 1 y2−y1=1,x2−x1=1 y2y1=1,x2x1=1,则(13)可化简为:

P = ( y 2 − y ) ( x 2 − x ) Q 11 + ( y 2 − y ) ( x − x 1 ) Q 21 + ( y − y 1 ) ( x 2 − x ) Q 12 + ( y − y 1 ) ( x − x 1 ) Q 22 P=(y_2-y)(x_2-x)Q_{11}+(y_2-y)(x-x_1)Q_{21}+(y-y_1)(x_2-x)Q_{12}+(y-y_1)(x-x_1) Q_{22} P=(y2y)(x2x)Q11+(y2y)(xx1)Q21+(yy1)(x2x)Q12+(yy1)(xx1)Q22

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
        self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
        self.conv2_drop = nn.Dropout2d()
        self.fc1 = nn.Linear(320, 50)
        self.fc2 = nn.Linear(50, 10)

        # 空间变换网络 Spatial transformer localization-network
        self.localization = nn.Sequential(
            nn.Conv2d(1, 8, kernel_size=7),
            nn.MaxPool2d(2, stride=2),
            nn.ReLU(True),
            nn.Conv2d(8, 10, kernel_size=5),
            nn.MaxPool2d(2, stride=2),
            nn.ReLU(True)
        )

        # 3*2的仿射变换矩阵的回归量 Regressor for the 3 * 2 affine matrix
        self.fc_loc = nn.Sequential(
            nn.Linear(10 * 3 * 3, 32),
            nn.ReLU(True),
            nn.Linear(32, 3 * 2)
        )

        # 用恒等变换初始化仿射变换矩阵的权重和偏置 Initialize the weights/bias with identity transformation
        self.fc_loc[2].weight.data.zero_()
        self.fc_loc[2].bias.data.copy_(torch.tensor([1, 0, 0, 0, 1, 0], dtype=torch.float))

    # Spatial transformer network forward function
    def stn(self, x):
        xs = self.localization(x)
        xs = xs.view(-1, 10 * 3 * 3)
        theta = self.fc_loc(xs)
        theta = theta.view(-1, 2, 3)
        grid = F.affine_grid(theta, x.size())
        x = F.grid_sample(x, grid)

        return x

    def forward(self, x):
        # transform the input
        x = self.stn(x)
		
        # Perform the usual forward pass
        x = F.relu(F.max_pool2d(self.conv1(x), 2))
        x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))
        x = x.view(-1, 320)
        x = F.relu(self.fc1(x))
        x = F.dropout(x, training=self.training)
        x = self.fc2(x)
        return F.log_softmax(x, dim=1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/60094.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记一次系统重装后电脑的优化设置

总目录 文章目录总目录前言一、Windows设置1.系统2.应用3.隐私4.更新与安全二、系统使用偏好设置1.设置远程协助2.文件资源管理器偏好设置3.用户账户控制设置4.修改桌面文件的路径5.根据需求删除系统自带的无用的软件总结前言 由于之前总是电脑用着用着C盘不是满了&#xff0c…

Spring框架(九):Spring注解开发Annotation

Spring注解开发引子如何用注解替代xml基础配置Bean可以加一些注解来实现原有的xml文件的功能Component注解及其衍生注解依赖注入AutowireSpring非自定义的注解开发Spring其他注解注解的原理解析-xml方式注解的原理解析-注解方式注解整合MyBatis框架注解整合第三方框架引子 痛定…

一篇文章让你搞懂Java顺序表

目录 一、 线性表的基本介绍 二、顺序表 1、顺序表的概念 2. 创建顺序表类(ArrayList) 2. 增加元素 3. 删除元素 4. 修改某个元素 5. 查找元素 Main类 在数据结构体系中我们将整个数据结构分为两类,一类是线性结构; 线性…

微电网两阶段鲁棒优化经济调度方法(完美复现)

针对微电网内可再生能源和负荷的不确定性,建立了 min-max-min 结构的两阶段鲁棒优化模型,可得到最恶劣场 景下运行成本最低的调度方案。模型中考虑了储能、需求侧 负荷及可控分布式电源等的运行约束和协调控制,并引入了 不确定性调节参数&…

Java基于springboot+vue+element医疗用品销售购物商城系统 前后端分离

开发背景和意义 网络购物己经成为一个常态化的消费手段,足不出户即可享受互联网发展的红利,对于购物商城的应用,普通消费者目前普遍使用。医疗用品作为一个大众消费的商品,由于其健康的特点,也越来越为大家喜欢&#…

TypeScript 知识点总结

对于有着强制类型语言经验的开发来讲,刚开始接触 JavaScript 的时候,大多都有一种 “心如芒刺,如鲠在喉” 的感觉。 从最初的好感 -——开放包容,到后来的厌恶之情——放荡不羁 TypeScript 犹如黑暗之中的一缕阳光,拯救…

【单片机基础】ADC0832详解

文章目录一、ADC0832介绍1、功能特点2、引脚说明3、ADC0832与单片机接口4、工作时序二、例程一、ADC0832介绍 ADC0832 是美国国家半导体公司生产的一种8 位分辨率、双通道A/D转换芯片。由于它体积小,兼容性,性价比高而深受单片机爱好者及企业欢迎&#x…

Java_笔记_static_静态变量方法工具类_main方法

static表示静态,是Java中的一个修饰符,可以修饰成员方法和成员变量。 一、静态变量: 被static修饰的成员变量 1.特点: 1)被该类所有的对象共享。 2)不属于对象,属于类。 3)随着类的加载而加载…

(个人记录)Ensight后处理EDEM学习笔记

①EDEM计算完毕 ②左上角,点击输出data 先点击一下 然后再把EXPORT FORMAT改为ensight的格式 file name选择要保存到的文件夹,保存格式为.case文件 设置保存的时间步 填入“10”的意思是0.01*10=0.1,在ensight中以0.1的时间步展示结果 点击queries 在ensight里只能…

七段显示译码器

我们会把它放在系统中来显示多位,很多位的表达会用到小数点 12.34 我只想显示,我现实系统的数字大小有一个范围,比如整数四位,小数四位 我显示12.34 就意味着首先两位就是空着,最后两位也是空着 这几位从输入的数字…

Android 基础知识4-1 用户界面简介VIewGroup、Onclick事件处理

引言: 一个好的应用界面的必备条件是:内容清楚、指示明白、屏幕美观和有亲切感。界面通常包含图形和文字。应用界面的设计是对控件进行适当的取舍及功能的选择和处理的过程。在程序设计中,需要对设计的方法反复推敲、琢磨,才能使其…

spfa算法判断负环【什么是负环】【出现负环会怎么样】【牢记,此时不是求最短路】

欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录) 文章字体风格: 红色文字表示:重难点 蓝色文字表示:思…

【推荐题目】

一,题目 1. 猪队友(pigmate.cpp) 【问题描述】 "不怕神一样的对手,就怕猪一样的队友",这不,小A需要将小B写的 n 张不同的明信片 放到一一对应的 n 个不同的信封中去,可是不管你信不…

代码不到200行!Tkinter上课点名程序来了

前言 今天给大家分享一个比较有意思的Python应用,使用Tkinter开发了一款上课点名程序,此程序可以用于点名、抽奖代码不到200行,程序简单又实用,分享给到大家~ 开发工具 Python版本: 3.8 相关模块&#xff1…

I2C、SPI、CAN、PCIe 对比

唯一标识 在社会上,靠身份证号,来唯一标识一个人。 在计算机的世界里,通过什么来唯一标识一个外设呢?方案还不止一种 I2C 使用地址(7 或 10 位)来唯一标识一个外设 SPI 使用 CS 引脚来唯一确定通信的外设…

0.安装和配置

我们不要怕,我们要一直向前,为了我们的目标。 对应关系是: https://www.rabbitmq.com/which-erlang.html 安装 Erlang https://www.erlang.org/downloads 选中 64 位 进行下载 下载后,双击 进行安装 选择 安装的路径 路径为: …

[附源码]计算机毕业设计校园招聘系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Android深色主题背景的实现及主题背景颜色互换

layout: post title: Android深色主题背景的实现及主题背景颜色互换 date: 2-12-03 21:52:38 发布 author: ‘zhangtao’ header-img: ‘img/post-bg-2015.jpg’ catalog: false tags: -android -android studio -ide 目录 深色主题背景的优势: 如何实现Android的…

MySQL进阶

文章目录数据库约束NULL约束UNIQUE:唯一约束DEFAULT:默认值约束PRIMARY KEY:主键约束FOREIGN KEY:外键约束表的设计——一对一、一对多、多对多增删改查进阶聚合函数Group by分组having:分组后的条件过滤联合查询内连接外连接自连…

【 第六章 事务操作、事务四大特性、并发事务问题、事务隔离级别】

第六章 事务操作、事务四大特性、并发事务问题、事务隔离级别 1.事务简介: ①事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功&#xff0…