FSR超分笔记

news2024/11/15 8:11:27

最近因为工作原因,接触到了超分以及AMD家出的FSR算法,特意记录了解一下~

前言

超分辨率是通过硬件或软件方法提高原有图像分辨率的方法,通过一幅或者多幅低分辨率的图像来得到一幅高分辨率的图像。

FSR是AMD提出的一种超分辨率方法,这种方法不借助深度学习,采用数学推导的方式实现,目前已经更新到3.0版本,本篇博客记录FSR1.0的学习记录。

FSR分为两个阶段,第一阶段为EASU上采样,第二阶段为RCAS锐化。

EASU上采样

首先,解释一下什么是上采样,什么是下采样。

上采样:原先有一张小尺寸的纹理,然后我们将这个纹理放大到大尺寸中(像素变多),然后使用采样方法(例如线性插值)进行填充。

下采样:原先有一张大尺寸的纹理,然后我们将这个纹理缩小到小尺寸中(像素变少),然后使用采样方法填充。

边缘与非边缘的上采样

对图像进行放大时,放大后的像素有两种情况:

  • 非边缘:如果是非边缘,则对于放大后的像素点P,在原图对应像素点Q,则Q附近的像素灰度值应该非常接近,此时只需要对Q周围的像素进行加权平均即可,此时权重均为正值。
  • 边缘:如果像素点P为边缘,此时应该采用锐化的方式进行处理,对Q附近的像素灰度值采用高频滤波器类似的加权方法进行加权。与上述非边缘的像素不同的是,对边缘像素进行加权计算的权重有负值。

因此,可以将边缘跟非边缘的计算方法统一成一个表达式:
f ( P ) = ∑ i f ( Q i ) H ( Q i ) ∑ i H ( Q i ) \begin{align} f(P) = \frac{\sum_if(Q_i)H(Q_i)}{\sum_iH(Q_i)} \end{align} f(P)=iH(Qi)if(Qi)H(Qi)

H ( Q i ) H(Q_i) H(Qi):权重计算公式,其应当满足当Q点为非边缘时,权重全为正数,Q点为边缘时,权重会包含负值,用来计算高频滤波器。因此接下来就是要找到满足这样条件的权重计算公式。

Lanczos2 函数

EASU引入了Lanczos函数:
L ( x ) = a s i n ( π x ) s i n ( π x a ) π 2 x 2 , x ∈ [ − a , a ] \begin{align} L(x) = \frac{asin(\pi x)sin(\frac{\pi x}{a})}{\pi^2x^2},x\in [-a, a] \end{align} L(x)=π2x2asin(πx)sin(aπx),x[a,a]

a = 2 a = 2 a=2时,通常将其称为Lanczos2函数,EASU就是基于Lanczos2函数作为基础处理的,它的图像如下图所示。

请添加图片描述

Lanczos2函数的值在 x ∈ [ 0 , 1 ] x \in [0,1] x[0,1]时函数值大于0, x ∈ [ 1 , 2 ] x\in [1,2] x[1,2]时函数值小于0,符合我们要找的权重函数的要求。但是函数中包含了三角函数,在shader中效率不高,因此EASU用多项式来拟合公式(2)。
L ( x ) = [ 25 16 ( 2 5 x 2 − 1 ) 2 − ( 25 16 − 1 ) ] ( ω x 2 − 1 ) 2 \begin{align} L(x) = \left[ \frac{25}{16}\left( \frac{2}{5}x^2 - 1 \right)^2 - \left( \frac{25}{16} - 1\right) \right](\omega x^2 - 1)^2 \end{align} L(x)=[1625(52x21)2(16251)](ωx21)2
其中 ω \omega ω参数可以用来控制函数在 x ∈ [ 1 , 2 ] x\in [1,2] x[1,2]部分的值,下面是 ω \omega ω从0变化到0.5过程中的函数图像

请添加图片描述

边缘特征

图像中的边缘,一般有如下几种情况:

请添加图片描述

EASU主要解决的是阶梯状边缘,因此特征越接近阶梯状边缘,对应的 ω \omega ω应该越小,此时当 x ∈ [ 1 , 2 ] x\in [1,2] x[1,2]时, L ( x ) L(x) L(x)返回的权重也越小。

Feature的定义与变量 ω \omega ω

我们为像素T定义Feature的计算公式,只计算像素点T上下左右方向的像素点,该Feature可以与变量 ω \omega ω一一对应。记EASU的边缘特征的中间值为 F F F,它的计算公式为:
F = ( F X 2 + F Y 2 ) \begin{align} F = (FX^2 + FY^2)\end{align} F=(FX2+FY2) F X = ∣ f ( T x − 1 , y − f ( T x + 1 , y ) ∣ m a x ( ∣ f ( T x − 1 , y ) − f ( T x , y ) ∣ , ∣ f ( T x + 1 , y ) − f ( T x , y ) ∣ ) F Y = ∣ f ( T x , y − 1 − f ( T x , y + 1 ) ∣ m a x ( ∣ f ( T x , y − 1 ) − f ( T x , y ) ∣ , ∣ f ( T x , y + 1 ) − f ( T x , y ) ∣ ) FX = \frac{|f(T_{x-1,y} - f(T_{x+1,y})|}{max(|f(T_{x-1,y}) - f(T_{x,y})|, |f(T_{x+1,y}) - f(T_{x,y})|)} \\ FY = \frac{|f(T_{x,y-1} - f(T_{x,y+1})|}{max(|f(T_{x,y-1}) - f(T_{x,y})|, |f(T_{x,y+1}) - f(T_{x,y})|)} FX=max(f(Tx1,y)f(Tx,y),f(Tx+1,y)f(Tx,y))f(Tx1,yf(Tx+1,y)FY=max(f(Tx,y1)f(Tx,y),f(Tx,y+1)f(Tx,y))f(Tx,y1f(Tx,y+1)

其中,这里的 f ( x ) f(x) f(x) x x x点做过灰度化处理后的颜色值,通过表达式 f = b ∗ 0.5 + r ∗ 0.5 + g f = b * 0.5 + r * 0.5 + g f=b0.5+r0.5+g 计算。

在公式(4)中, F X , F Y ∈ [ 0 , 1 ] FX,FY \in[0,1] FX,FY[0,1],因此 F ∈ [ 0 , 2 ] F\in[0,2] F[0,2],为了归一,EASU提出将其映射到 [ 0 , 1 ] [0,1] [0,1]
F e a t u r e = ( F / 2 ) 2 \begin{align} Feature = (F/2)^2 \end{align} Feature=(F/2)2
我们已经找到了区分边缘的特征值Feature,以及可以通过 ω \omega ω调整区间 [ 1 , 2 ] [1,2] [1,2]取值范围的拟合曲线了,接下来就是要建立Feature跟 ω \omega ω之间的关系。

公式(3)中的函数 L ( x ) , x ∈ [ − 2 , 2 ] L(x),x\in[-2,2] L(x),x[2,2]是关于 y y y轴对称的,因此这里只分析正半轴(EASU里也只用到了正半轴),在正半轴上 L ( x ) L(x) L(x)有三个根: x = 1 ; x = 2 ; x = 1 ω , ( ω > 0 ) x = 1;x = 2;x = \frac{1}{\sqrt{\omega}},(\omega > 0) x=1;x=2;x=ω 1,(ω>0),如下图所示。

请添加图片描述

1 ω ∈ [ 1 , 2 ] \frac{1}{\sqrt{\omega}} \in [1,2] ω 1[1,2]时, ( ω ∈ [ 1 4 , 1 ] ) (\omega \in[\frac{1}{4},1]) (ω[41,1]),区间 [ 1 , 1 ω ] [1,\frac{1}{\sqrt{\omega}}] [1,ω 1]中有一个极小值 m m m

  • 1 ω → 1 : m → 0 \frac{1}{\sqrt{\omega}} \rightarrow 1: m \rightarrow 0 ω 11:m0
  • 1 ω → 2 : m → − 2187 16483 \frac{1}{\sqrt{\omega}} \rightarrow 2: m \rightarrow -\frac{2187}{16483} ω 12:m164832187

注意到当 1 ω ∈ [ 1 , 2 ] \frac{1}{\sqrt{\omega}} \in [1,2] ω 1[1,2]时, x ∈ [ 1 ω , 2 ] x\in[\frac{1}{\sqrt{\omega}}, 2] x[ω 1,2]区间出现了一个负的Lobe部分,为了解决这个问题,EASU进行了截断,只取 x ∈ [ 0 , 1 ω ] x\in [0,\frac{1}{\sqrt{\omega}}] x[0,ω 1]区间。

因此可以通过改变 1 ω \frac{1}{\sqrt{\omega}} ω 1的值来控制 [ 1 , 1 ω ] [1,\frac{1}{\sqrt{\omega}}] [1,ω 1]区间里负值的大小(用来作公式(1)中的负权重)。
ω = 1 − 3 4 F e a t u r e \begin{align} \omega = 1 - \frac{3}{4}Feature \end{align} ω=143Feature
但是由于 1 ω \frac{1}{\sqrt{\omega}} ω 1在趋近于1时,负权重不够,会导致边缘信息识别不足,因此EASU将 1 ω \frac{1}{\sqrt{\omega}} ω 1的范围限定在 [ 2 , 2 ] [\sqrt{2},2] [2 ,2],因此 ω ∈ [ 1 4 , 1 2 ] \omega \in[\frac{1}{4}, \frac{1}{2}] ω[41,21],得出新的线性关系:
ω = 1 2 − 1 4 F e a t u r e \begin{align} \omega = \frac{1}{2} - \frac{1}{4}Feature \end{align} ω=2141Feature

EASU同时限定了 x x x的范围为 x ∈ [ 0 , 1 ω ] x\in[0, \frac{1}{\sqrt{\omega}}] x[0,ω 1],即 x = m i n ( x , 1 ω ) x=min(x,\frac{1}{\sqrt{\omega}}) x=min(x,ω 1)

Feature获得

EASU计算 Q Q Q点特征时,采用的是采样像素点 Q Q Q周围12个像素的值来计算。EASU首先会进行批量采样,从而获取 Q Q Q周围像素的像素值,待采样的像素如下图所示(标识为z的像素点为多余的像素,在计算时不会用到):
sampling

每次使用Gather4指令批量采样4个像素点中的一个通道,例如浅绿色框采样的顺序是ijfe,因为像素有三个通道RGB,因此每次批量采样 4 * 3 次。

然后,计算特征时,分四组分别计算出4个Feature。
在这里插入图片描述

使用双线性插值得到最终的Feature。如下图所示, O = f l o o r ( Q ) O = floor(Q) O=floor(Q) u 、 v u、v uv则是 Q Q Q O O O的偏移。

在这里插入图片描述

F e a t u r e = ( 1 − u ) ( 1 − v ) f 1 + u ( 1 − v ) f 2 + u v f 3 + ( 1 − u ) v f 4 \begin{align} Feature = (1-u)(1-v)f_1 + u(1-v)f_2+uvf_3+(1 - u)vf_4 \end{align} Feature=(1u)(1v)f1+u(1v)f2+uvf3+(1u)vf4
结合公式(7)和公式(8),便可计算出 ω \omega ω的值。

梯度

计算Feature的同时,EASU还计算了 Q Q Q点的像素灰度变化的梯度,同样也是分四组计算梯度,最后用双线性插值得出最终的梯度向量。每组梯度计算的方式如下:

在这里插入图片描述

D x = g − e = f ( Q x + 1 , y ) − f ( Q x − 1 , y ) D y = j − b = f ( Q x , y + 1 ) − f ( Q x , y − 1 ) D_x = g - e = f(Q_{x+1,y}) - f(Q_{x-1,y})\\ D_y = j - b = f(Q_{x,y+1}) - f(Q_{x,y-1}) Dx=ge=f(Qx+1,y)f(Qx1,y)Dy=jb=f(Qx,y+1)f(Qx,y1) D ⃗ = ( c o s θ , s i n θ ) = ( D x D x 2 + D y 2 , D y D x 2 + D y 2 ) \begin{align} \vec D = (cos\theta,sin\theta) = (\frac{D_x}{\sqrt{D_x^2 + D_y^2}}, \frac{D_y}{\sqrt{D_x^2 + D_y^2}}) \end{align} D =(cosθ,sinθ)=(Dx2+Dy2 Dx,Dx2+Dy2 Dy)

采样颜色值

到这里,我们得到了 Q Q Q的梯度,以及Feature,之后,EASU分别对 Q Q Q周围的12个像素,按照梯度角度进行旋转,并进行缩放,最终利用像素点左上角到 Q Q Q点的欧式距离作为 x x x,带入权重公式,即公式(3),得到周围像素的权重。

在这里插入图片描述

如上图,像素b跟 Q Q Q之间的向量 Q B ⃗ \vec{QB} QB 按照梯度旋转:
x r = x Q B ∗ c o s θ + y Q B ∗ s i n θ y r = − x Q B ∗ s i n θ + y Q B ∗ c o s θ \begin{align} x_r &= x_{QB} * cos\theta + y_{QB}* sin\theta \notag \\ y_r &= -x_{QB} * sin\theta + y_{QB}*cos\theta \end{align} xryr=xQBcosθ+yQBsinθ=xQBsinθ+yQBcosθ
旋转完毕后,EASU定义了一个将旋转向量根据梯度边缘特征进行缩放的公式(注意,这里是直接定义的公式,并没有数学逻辑):
S t r e t c h = 1 m a x ( ∣ s i n θ ∣ , ∣ c o s θ ∣ ) S x = 1 + ( S t r e t c h − 1 ) ∗ F e a t u r e S y = 1 − 0.5 ∗ F e a t u r e \begin{align}Stretch &= \frac{1}{max(|sin\theta|,|cos\theta|)}\\ S_x &= 1 + (Stretch - 1) * Feature \notag \\ S_y &= 1 - 0.5 * Feature \notag \end{align} StretchSxSy=max(sinθ,cosθ)1=1+(Stretch1)Feature=10.5Feature
然后得出 Q B ⃗ \vec{QB} QB 旋转缩放后的向量坐标:
S x b = x r ∗ S x , S y b = y r ∗ S y \begin{align}S_{xb} = x_r * S_x,S_{yb} = y_r * S_y\end{align} Sxb=xrSx,Syb=yrSy
最后求出向量的模:
d b = m i n ( S x b 2 + S y b 2 , 1 ω ) \begin{align}d_b = min(\sqrt{S_{xb}^2 + S_{yb}^2}, \frac{1}{\sqrt\omega})\end{align} db=min(Sxb2+Syb2 ,ω 1)
将得出的 d b d_b db带入到公式(3),即可求出b像素点的权重值。其他像素点一次按照这样的方式求出对应像素的权重值,最后利用公式(1),即可求出上采样 P P P点的像素值。

EASU里最后会对求出的颜色做限制,限制颜色的最大最小值只能在这12个采样点颜色之间,据说可以减少ringing效果。

RCAS锐化

上采样结束后,FSR最后对上采样得到的图像进行一次RCAS(Robust Contrast Adaptive Sharpening在CAS基础上进行改进)的锐化处理,将边缘信息进一步加强,RCAS其实是拉普拉斯算子的变种:

在这里插入图片描述

最后像素 P P P按照上面的算子进行加权计算即可:
F ( P ) = f ( P ) + ω ∗ ( f ( P x − 1 , y ) + f ( P x + 1 , y ) + f ( P x , y − 1 ) + f ( P x , y + 1 ) ) 4 ω + 1 \begin{align}F(P) = \frac{f(P) + \omega * (f(P_{x-1,y}) + f(P_{x+1,y}) + f(P_{x,y-1}) + f(P_{x,y+1}))}{4\omega + 1}\end{align} F(P)=4ω+1f(P)+ω(f(Px1,y)+f(Px+1,y)+f(Px,y1)+f(Px,y+1))
对于 ω \omega ω权重,RCAS计算方法是获取像素 P P P点周围的四个像素,然后根据包括 P P P在内五个像素点的最大最小值来计算。

在这里插入图片描述

于是有
ω = m a x ( − M i n 4 M a x , 1 − M a x 4 M i n − 4 ) ∗ S c a l e \begin{align}\omega = max(-\frac{Min}{4Max},\frac{1 - Max}{4Min - 4}) * Scale\end{align} ω=max(4MaxMin,4Min41Max)Scale

Scale为采样之后分辨率跟原分辨率的比值。

RCAS中为了确保 ω \omega ω为负数,最后对 ω \omega ω做了限制:
ω = m a x ( − ( 1 4 − 1 16 ) , m i n ( ω , 0 ) ) \begin{align}\omega = max(-(\frac{1}{4} - \frac{1}{16}), min(\omega,0))\end{align} ω=max((41161),min(ω,0))

对于RGB每个通道,都计算一次对应的 ω R 、 ω G 、 ω B \omega_R、\omega_G、\omega_B ωRωGωB

总结

参考这份github上用python实现的FSR,可以实现超分效果,如下图所示:

在这里插入图片描述

总结一下,FSR一共包含两个阶段,第一阶段为EASU上采样,第二阶段为RCAS锐化,其中EASU上采样是重点。

EASU的基本思想是根据像素点周围颜色变化的梯度,计算出一个可变的权重函数,将周围点加权得出当前像素点的颜色。其中,当该点处于边缘时,权重函数会出现负值,起到一个类似锐化的效果,用于突出边缘像素;当该点处于非边缘时,权重函数全为正值,起到一个类似平均池化的效果。

参考

https://www.xianlongok.site/post/30ae96f7/

https://zhuanlan.zhihu.com/p/401030221

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

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

相关文章

力扣面试经典算法150题:轮转数组

轮转数组 今天的题目是力扣面试经典150题中的数组的基础难度题:轮转数组。 题目链接:https://leetcode.cn/problems/rotate-array/description/?envTypestudy-plan-v2&envIdtop-interview-150 问题描述 给定一个整型数组 nums 和一个整数 k&…

微服务实战系列之玩转Docker(十一)

前言 在云原生的世界,经过十多年的进化,Docker已经形成了较完备的“后勤”保障服务和建立了荣辱与共的“密友圈”。用一句话可以概括:“Docker走遍天下,Swarm功不可没”。 因此,我们需尽可能做到对Swarm有充分的认识…

Java面试篇(多线程相关专题)

文章目录 0. 前言1. 线程基础1.1 线程和进程1.1.1 进程1.1.2 线程1.1.3 进程和线程的区别 1.2 并行和并发1.2.1 单核 CPU 的情况1.2.2 多核 CPU 的情况1.2.3 并行和并发的区别 1.3 线程创建的方式1.3.1 继承 Thread 类,重写 run 方法1.3.2 实现 Runnable 接口&#…

工业一体机在工业自动化控制领域的关键性作用

随着工业自动化技术的不断发展和应用范围的不断扩大,工业一体机作为一种集成了多种功能的自动化控制设备,在工业自动化控制领域扮演着越来越重要的角色。 一、 集成性强,简化系统架构 传统工业自动化控制系统通常由多个独立的设备组成&…

php7.1编译安装

1.安装必要的工具: 首先确保您已经安装了 Xcode 和 Command Line Tools:xcode-select --install2.下载 PHP 7.1 源代码: 访问 PHP 官方网站下载 PHP 7.1 的源代码: wget https://www.php.net/distributions/php-7.1.33.tar.gz t…

基于Java企业项目管理系统--论文pf

TOC springboot527基于Java企业项目管理系统--论文pf 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。在互联网诞生之前,地域位置往往是人们思想上…

指针详解(五)

目录 1. 回调函数 2. qsort使用举例 1)排序整型数据 2)排序结构数据 3. qsort函数的模拟实现(冒泡) 1. 回调函数 回调函数就是一个通过函数指针调用的函数 函数的指针(地址)作为参数传递给另一个函数…

【python】Python实现XGBoost算法的详细理论讲解与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

AI文字生成漫画短视频系统工具搭建部署,AI文生漫画短视频

目录 前言: 一、AI文生动漫小程序具有以下特点和功能: 二、文生动漫目前有哪些项目? 三、怎么搭建文生动漫小程序? 前言: AI文生动漫小程序是一款基于人工智能技术开发的动漫创作工具。它利用先进的机器学习算法&a…

大数据处理与智慧营销系统性能优化

随着企业数字化转型的加速,客户经营数字化正在向智能化方向发展,构建全场景、全流程、全触点的数字化、智能化的客户经营智慧营销体系。智慧营销系统已运行 5 年,伴随着业务增长,系统业务流程复杂度增大,大表数据量已超…

FreeSWITCH Record

1概述 FreeSWITCH https://signalwire.com/freeswitch是一个开源的电话交换平台。官方给它的定义是–世界上第一个跨平台的、伸缩性极好的、免费的、多协议的电话软交换平台。由这个定义我们可以得出以下几点: FreeSWITCH是跨平台的。它能原生地运行于Windows、MaxOSX、Linux、…

计算几何,CF 993A - Two Squares

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 A - Two Squares 二、解题报告 1、思路分析 由于数据量很小,可…

《Redis核心技术与实战》学习笔记5——内存快照RDB:宕机后,Redis如何实现快速恢复?

文章目录 给哪些内存数据做快照?快照时数据能修改吗?可以每秒做一次快照吗?小结 大家好,我是大白。 上篇文章记录了 Redis 避免数据丢失的 AOF 方法。这个方法的好处,是每次执行只需要记录操作命令,需要持久化的数据量…

11.4k star! 部署清华开源的ChatGLM3,用私有化大模型无缝替换openai

转自AI技术实战 ChatGLM3 是智谱AI和清华大学 KEG 实验室联合发布的对话预训练模型。ChatGLM3-6B 是 ChatGLM3 系列中的第三代开源模型,对话流畅、部署门槛低,测评显示其基础模型ChatGLM3-6B-Base 具有在 10B 以下的基础模型中最强的性能,同时…

ESP32CAM人工智能教学19

ESP32CAM人工智能教学19 Udp socket服务器 本课的工作模式,正好是第十四课工作模式的相反:第十四课中,ESP32Cam是客户端,运行在PC中的Python程序是服务器,就收到了摄像头数据后,调用openCV组件显示图像。而本课的ESP32Cam是服务器,Python是客户端,正好掉了个个,目的就…

蓝桥杯编程题讲解

给定一个正整数 N ,然后将 N 分解成 3 个正整数之和。 计算出共有多少种符合要求的分解方法。 要求: 分解的 3 3 3个正整数各不相同; 分解的 3 3 3个正整数中都不含数字3和7. 如:N为8,可分解为 ( 1 , 1 , 6 ) (1,1,6) (1,1,6)、 ( 1 , 2 ,…

位图与布隆过滤器 —— 海量数据处理

🌈 个人主页:Zfox_ 🔥 系列专栏:C从入门到精通 目录 🚀 位图 一: 🔥 位图概念 二: 🔥 位图的实现思路及代码实现三: 🔥 位图的应用四:…

云原生系列 - Nginx(基础篇)

前言 学习视频:尚硅谷Nginx教程(亿级流量nginx架构设计)本内容仅用于个人学习笔记,如有侵扰,联系删学习文档: 云原生系列 - Nginx(基础篇) 1、简介 1.1、背景介绍 Nginx(enginex)是一个高性能的HTTP和…

SpringBoot教程(二十四) | SpringBoot集成日志AOP切面

SpringBoot教程(二十四) | SpringBoot集成日志AOP切面 (一)AOP 概要1. 什么是 AOP ?2. 为什么要用 AOP?3. AOP一般用来干什么?4. AOP 的核心概念 (二)Spring AOP1. 简述2…

【芯智雲城】UDStore定制化存储模组和技术解决方案

一、方案详情: UDStore芯宇存储专注行业应用,根据不同应用场景,为客户提供包括车规级、工业级、工规宽温及高耐久型的存储模组产品和技术解决方案,可提供的产品和解决方案类型包括如下: 二、关键技术: 1&…