基于深度学习的图像超分辨率应用

引言

在使用图片浏览软件显示图片时,为了凸显某个部位,你会放大图片,为了显示整体,你会缩小图片。

你的原始图片大小是固定的,但图像浏览软件既可以最大化到整个屏幕,也可以只占一个区域,这些操作是怎么实现的呢?

传统图像插值方法

在深度学习还没有涉猎图像超分之前,图像插值方法是图像放大,缩小,旋转以及形变过程中使用的主要手段。

图片

根据插值算法的不同,即使对相同的图像进行调整大小或重新映射,结果也可能会有显著差异。插值只是一种近似,因此每次进行插值时,图像都会损失一些质量。

插值的概念

插值通过使用已知数据来估计未知点的值。例如:如果想知道中午的温度,但只在上午11点和下午1点测量了温度,可以通过执行线性插值来估计它的值:

图片

如果在上午11:30有额外的测量值,并根据常识温度上升的大部分发生在中午之前,则可以使用这个额外的数据点来执行二次插值:

图片

靠近中午的温度测量值越多,插值算法就可以越复杂(更准确)。

举个图形缩放的例子

图像插值在两个方向上基于周围像素的值来计算最佳近似。下图说明了图像缩放的工作原理:

图片

与上面温度的例子不同的是,两个连续的像素之间可能发生剧烈变化,例如,边缘。与温度例子相同的是,知道周围像素的信息越多,插值效果越好。总而言之,图像的拉伸程度越大,效果越差,因为插值没有对细节的想象能力。

图像旋转的例子

旋转或扭曲图像时,也会发生插值。前面图像缩放的例子是插值器特别擅长的一种情况。下面的例子显示了图像细节如何迅速地丢失:

图片

以上结果使用了所谓的“双三次”算法,只有90度旋转是无损的,其余都显示了明显的恶化。

不同的插值算法

常见的插值算法可以分为两类:自适应和非自适应。自适应方法会根据插值的内容(锐利的边缘或平滑的纹理)而变化,而非自适应方法则会将所有像素都视为相等。

非自适应算法包括:最近邻、双线性、双三次、样条、sinc、lanczos 等。根据它们的复杂性,这些算法在插值时使用的相邻像素数量从0到256(或更多)不等。它们包含的相邻像素越多,就越能变得更准确,但这会以更长的处理时间为代价。这些算法可以用于扭曲和调整照片的大小。

图片

自适应算法在很多受版权保护的软件中都有应用,如 Qimage、PhotoZoom Pro、Genuine Fractals 。当检测到边缘存在时,会在像素级别上应用不同算法,以最大程度地减少插值伪影的出现。

最近邻插值

最近邻是最基本的插值算法,需要的处理时间最少,因为它只考虑一个像素—也就是最接近插值点的像素。这会使每个像素变大,从而简单地实现了放大的效果。

双线性插值

双线性插值考虑到了未知像素周围最近的2x2邻域像素值。然后对这4个像素进行加权平均,以得到最终的插值值。这会比最近邻插值产生更平滑的图像。

下图所示是未知像素与所有已知像素距离相等的情况,所以插值值仅为它们的总和除以4。

图片

高阶插值方法:样条和SINC

这类插值器考虑了更多的周围像素,因此计算成本也更高。这些算法包括样条和sinc,插值后会保留更多的图像信息。因此,在需要对图像进行多次旋转/扭曲累加处理时,它们非常有用。但是,在单步放大或旋转的情况下,可能会出现卡顿的现象。

插值伪影

所有的非自适应插值算法都试图在三种不良效果(边缘光晕、模糊和混叠)之间找到最佳平衡点。

图片

即使是最先进的非自适应插值算法,也不能同时消除上述三种不良效果,必须通过牺牲其中的一种或者两种来改善另一种。

图片

锯齿

图片

抗锯齿技术可以消除这些锯齿,并给出更平滑的边缘和更高的分辨率外观。它的工作原理是考虑理想边缘与相邻像素的重叠程度。锯齿状的边缘只能四舍五入到最接近的像素值,而抗锯齿会为边缘所占像素根据所占比例计算一个颜色值。

锯齿:

图片

抗锯齿:

图片

基于深度学习的图像插值算法

基于深度学习的图像插值算法也被称为图像超分辨率,就是指将图像缩放而不失真。

深度学习发展到今天,无论是在自然语言处理,还是计算机视觉,都已经积累了大量的经验,接下来它会不断渗入到各个细分领域,去解决传统算法的效率和精度等性能问题。这也就是为什么已经有了传统插值算法,还会出现图像超分的原因。

传统算法的缺点前面已经说了,概括一下就是:不能完全消除伪影,锯齿和混叠,导致图像失真。

那为什么深度学习能改善这些缺点?

从传统的算法演化历程来看,越复杂的算法,考虑未知点周边像素数越多,效果就越好,非线性要比线性效果好,而深度学习正好能拟合非常非常复杂的映射。

举个基于阈值图像分割的例子,对于一个二值图像,选择一个阈值就能完成分割,一个阈值也就对应一个if判断语句,但现实中的图像都很复杂,即使使用多个阈值,分割结果也是散乱的,因为没有考虑空间因素,深度学习不仅能模拟非常多的判断语句,还能考虑空间因素。

再举个例子,会想起很早之前用过的机器翻译,效果很一般,它就是将输入的源句子分词,然后将词翻译成目标语言词汇,最后将词汇拼在一起。

I am a student -> 我是一个学生

但如果一个句子中出现了很多像where,that这些关系代词和关系副词时,翻译出来的句子就不通顺了。所以改进版加了目标语言语法知识。

I bought an apple for my girlfriend as a birthday present, it's full of technology

对于上面的句子,机器翻译并不知道it指代的是啥,直到Transformer的出现,它的注意力机制很大程度提升了翻译效果。

但当我认为这就是翻译的天花板时,直到我最近使用ChatGPT,我发现它不光懂语法,不光有注意力机制,它还有专业领域知识,它能识别一个词在不同上下文中有不同的涵义。他不会把一篇有关古董文章中的china翻译成中国,而是翻译成陶瓷。

而基于深度学习的图像超分就是如此,它不再是简单的像素加权求和,而是像一个非常复杂的非线性函数,它清楚的知道边缘的地方应该怎么插值,平坦的纹理区域应该怎么插值。

基于深度学习的插值与传统插值方法相比有如下优势:

  • 学习复杂和非线性映射的能力:传统的插值方法,如双三次或双线性插值,使用数学公式来估计缺失的数据点或像素。这些公式基于对底层数据或图像的假设,例如平滑度或连续性。另一方面,基于深度学习的插值可以学习低分辨率和高分辨率图像之间复杂的非线性映射,使其更加灵活,适应不同类型的数据和图像。
  • 更好地处理纹理和精细细节:传统的插值方法很难保留图像中的纹理和精细细节,尤其是在放大时。另一方面,基于深度学习的插值可以学习保留这些细节并产生更美观的结果。
  • 处理异构数据的能力:传统的插值方法假设底层数据或图像是平滑的或连续的。然而,许多现实世界的数据和图像是异构的,具有复杂的结构和模式。基于深度学习的插值可以学习处理这些结构和模式,从而产生更准确和视觉上令人愉悦的结果。
  • 改进的性能:基于深度学习的插值在多个基准数据集上取得了最先进的结果,证明了其与传统插值方法相比的卓越性能。

以下是一些著名的图像插值深度学习模型,以及每个模型的摘要:

  • 超分辨率卷积神经网络 (SRCNN)

SRCNN 是一种开创性的深度学习模型,专为单幅图像超分辨率任务而设计。它以低分辨率图像作为输入,并学习低分辨率图像和高分辨率图像之间的端到端映射。该网络由三个卷积层组成,每个卷积层负责一个特定的任务:补丁提取、非线性映射和重建。

概括:单幅图像超分辨率的端到端学习,三层架构。

  • 生成对抗网络 (GAN)

GAN 由一个生成器和一个鉴别器网络组成,它们在两人极小极大游戏中竞争。生成器创建合成图像,而鉴别器则试图区分真实图像和生成图像。GAN 已应用于各种图像合成任务,包括图像插值。

概括:对抗训练,适用于图像合成和插值。

  • 用于单幅图像超分辨率 (EDSR) 的增强型深度残差网络

EDSR 是残差网络 (ResNet) 架构的改进版本,专为超分辨率任务而设计。它删除了不必要的组件,如批量归一化,并采用了更广泛的残差缩放策略。EDSR 在各种单幅图像超分辨率基准测试中表现出色。

概括:改进的 ResNet 架构,专为超分辨率任务量身定制。

  • 深拉普拉斯金字塔超分辨率网络 (LapSRN)

LapSRN 是一种深度学习模型,它使用拉普拉斯金字塔框架逐步重建高分辨率图像。它以从粗到精的方式在多个尺度上执行图像插值。与其他超分辨率方法相比,LapSRN 在速度和准确性方面都表现出了出色的性能。

概括:渐进重建,拉普拉斯金字塔框架,由粗到细的插值。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一文带你了解机器翻译的前世今生

引言 我们都知道谷歌翻译,这个网站可以像变魔术一样在100 种不同的人类语言之间进行翻译。它甚至可以在我们的手机和智能手表上使用: 谷歌翻译背后的技术被称为机器翻译。它的出现改变了世界交流方式。 事实证明,在过去几年中,深…

【C/C++】如何不使用 sizeof 求数据类型占用的字节数

实现代码&#xff1a; #include <stdio.h>#define GET_TYPE_SIZE(TYPE) ((char *)(&TYPE 1) - (char *) & TYPE)int main(void) {char a a;short b 0;int c 0;long d 0;long long e 0;float f 0.0;double g 0.0;long double h 0.0;char* i NULL;print…

微机原理_5

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案,请将选定的答案填涂在答题纸的相应位置上。) 8086微处理器CLK引脚输入时钟信号是由(提供。 A. 8284 B. 8288 C.8287 D. 8289 2.下面4个寄存器中,不能作为间接寻址的寄存器是(…

香港站群服务器中1C/2C/4C/8C 的概念及区别

​  在选择香港站群服务器时&#xff0c;经常会看到1C、2C、4C和8C等不同的IP段。这些IP段代表了不同的子网掩码长度&#xff0c;也反映了服务器的IP地址数量和丰富性。 让我们来了解一下什么是IP段。IP段是指一组连续的IP地址&#xff0c;其中每个地址的前三个数字相同&…

10_7iic整体框架流程

在内核中 这边把iic整个流程分成了 4层 iic_dtiver at24_iic_eeprom 也就是我们的自己的驱动 i2c-core.c 核心层 i2c/busses/i2c-s3c2410.c 控制器层 平台总线驱动层,或者也是图中的设备树 硬件描述 我们假设 板子上有三个iic控制器 0 1 2 这里在控制器0 上挂载了gt24c02的eep…

Telesquare TLR-2005Ksh 路由器 RCE漏洞复现

0x01 产品简介 Telesquare Tlr-2005Ksh是韩国Telesquare公司的一款 Sk 电讯 Lte 路由器。 0x02 漏洞概述 Telesquare TLR-2005Ksh存在安全漏洞&#xff0c;未经授权的攻击者可通过setSyncTimeHost执行任意命令获取服务器权限。 0x03 复现环境 FOFA&#xff1a;app"TELE…

SCI一区级 | Matlab实现GWO-CNN-LSTM-selfAttention多变量多步时间序列预测

SCI一区级 | Matlab实现GWO-CNN-LSTM-selfAttention多变量多步时间序列预测 目录 SCI一区级 | Matlab实现GWO-CNN-LSTM-selfAttention多变量多步时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现GWO-CNN-LSTM-selfAttention灰狼算法优化卷积长短…

USB总线-Linux内核USB3.0 Hub驱动分析(十四)

1.概述 USB Hub提供了连接USB主机和USB设备的电气接口。USB Hub拥有一个上行口&#xff0c;至少一个下行口&#xff0c;上行口连接上一级的Hub的下行口或者USB主机&#xff0c;连接主机的为Root Hub&#xff0c;下行口连接下一级Hub的上行口或者USB设备。经过Hub的扩展&#x…

一、Spring_IOCDI(1)

&#x1f33b;&#x1f33b; 目录 一、前提介绍1.1 为什么要学?1.2 学什么?1.3 怎么学? 二、Spring相关概念2.1 初始Spring2.1.1 Spring家族2.1.2 了解 Spring 发展史 2.2 Spring系统架构2.2.1 系统架构图2.2.2 课程学习路线 2.3 Spring核心概念2.3.1 目前项目中的问题2.3.2…

C#,《小白学程序》第二十三课:大数的除法(BigInteger Divide)

1 文本格式 /// <summary> /// 比较a&#xff0c;b的大小&#xff0c;返回1&#xff0c;0&#xff0c;-1 /// 数据从低位&#xff08;右&#xff09;往高位&#xff08;左&#xff09;存储; /// </summary> /// <param name"a"></param> ///…

【古诗生成AI实战】之四——模型包装器与模型的训练

在上一篇博客中&#xff0c;我们已经利用任务加载器task成功地从数据集文件中加载了文本数据&#xff0c;并通过预处理器processor构建了词典和编码器。在这一过程中&#xff0c;我们还完成了词向量的提取。 接下来的步骤涉及到定义模型、加载数据&#xff0c;并开始训练过程。…

kubernetes架构及核心组件简单介绍

目录 整体架构控制面kube-apiserver访问控制通知 kube-scheduler概述默认调度策略 kube-controller-manageretcd架构Raft协议日志复制 数据面kubeletkube-proxy 整体架构 集群架构图 控制面 控制面是kubernetes的核心组件&#xff0c;负责管理和控制集群的整体行为&#xf…

前端入门(三)Vue生命周期、组件原理、脚手架、插槽插件、存储、组件事件、动画、跨域与代理

文章目录 Vue生命周期Vue 组件化编程 - .vue文件非单文件组件组件的注意点组件嵌套Vue实例对象和VueComponent实例对象Js对象原型与原型链Vue与VueComponent的重要内置关系 应用单文件组件构建 Vue脚手架 - vue.cli项目文件结构组件相关高级属性引用名 - ref数据接入 - props混…

云匣子 FastJson反序列化RCE漏洞复现

0x01 产品简介 云匣子是租户连接云资源的安全管理工具&#xff0c;帮助云租户更加安全、精细的管理云上的虚拟机、数据库等资源。 云安宝结合多年的运维和安全实践&#xff0c;将云上的运维和安全有机结合&#xff0c;实现对运维过程的事前规划、事中控制和 事后审计。在此之上…

Retrofit怎么返回一个JSON字符串?

项目用已经使用了 Retrofit&#xff0c;定义了接口方法&#xff0c;返回了 JSON 转换后的实体对象&#xff0c;炒鸡方便。但是总有意料之外的时候&#xff0c;比如我不需要返回实体对象&#xff0c;我要返回纯纯的 JSON 字符串&#xff0c;怎么办呢&#xff1f; 先看源码 通过…

数据里有{1,2,3,4,5,6,7,8,9},请随机打乱顺序,生成一个新的数组

问题&#xff1a;数据里有{1,2,3,4,5,6,7,8,9}&#xff0c;请随机打乱顺序&#xff0c;生成一个新的数组。 思路&#xff1a; 旧数组 nums&#xff0c;新数组 newNums 1、先创建一个新数组&#xff0c;用来存打乱数据后的元素&#xff0c;新旧数组的长度要一致 2、然后遍历数组…

使用STM32与MFRC522 IC进行RFID卡的读取与识别(含代码)

利用STM32与MFRC522 IC进行RFID卡的读取和识别&#xff0c;可以实现对RFID卡的读取和获取卡片标识信息。MFRC522 IC是一种高集成度的13.56MHz RFID芯片&#xff0c;常用于门禁系统、物流跟踪和智能支付等领域。下面将介绍如何使用STM32与MFRC522 IC进行RFID卡的读取和识别&…

Mycat实现读写分离

Mycat实现读写分离 Mycat支持MySQL主从复制状态绑定的读写分离机制。这里实现的也是基于MySQL主从复制的读写分离。 MySQL主从复制配置 首先要配置MySQL的主从复制&#xff0c;这里配置的是一主一次从。可以参考下面的文章。 https://blog.csdn.net/wsb_2526/article/detail…

人工智能-优化算法和深度学习

优化和深度学习 对于深度学习问题&#xff0c;我们通常会先定义损失函数。一旦我们有了损失函数&#xff0c;我们就可以使用优化算法来尝试最小化损失。在优化中&#xff0c;损失函数通常被称为优化问题的目标函数。按照传统惯例&#xff0c;大多数优化算法都关注的是最小化。…

ElasticSearch02

ElasticSearch客户端操作 ElasticSearch 版本&#xff1a;7.8 学习视频&#xff1a;尚硅谷 笔记&#xff1a;https://zgtsky.top/ 实际开发中&#xff0c;主要有三种方式可以作为elasticsearch服务的客户端&#xff1a; 第一种&#xff0c;使用elasticsearch提供的Restful接口…