最近几周读的课题可能主要是关于图像的处理和识别、比较。
图像是一种能通过丰富的维度来进行处理和解析的数据源,将其视为离散信号、矩阵或是其它形式都能有丰富的数学或计算机图形学工具来对其进行处理。
图像的生成式AI以人类的眼光来看,其过程大致可以理解为:先逐步生成一个模糊的轮廓,再以类似“降噪”的方式,辅助各种训练后的子网络对这一图像进行反复迭代。而机器学习则基于各种训练方式来优化其中各个子节点,以及整个过程——这些步骤离不开图像的数学或信号表达。
这次选择的斯坦福大学计算机图形2023年的课件,确实和其它一些网上能找到的课件比起来既制作得更好、图文搭配合适,内容也详略得当。因为这是一门本科课程,因此理解上相对难度不会太高。
本文还是以翻译原PDF页中文字为主,打星号的部分则是我的补充说明。
*这里已经假定了颜色值是归一化之后(RGB各自)在0和1之间的一个值。实际的情况比这要复杂,之前一篇介绍颜色空间的文章中就提到过。
*卷积在信号处理上可以视为:将输入的信号(图中g)以一定的过滤方式或卷积核(图中f)进行处理以得到输出信号的过程。
*由于积分可以理解成函数下方区域的“面积”。以图中的分段函数f(x)为例,则其对应的卷积效果(f * g)可以视为原函数g(的x位置对应的函数值)在x-0.5和x+0.5上取了平均的一个“模糊了”的版本。
*之前也提到过,filter翻译成“过滤”多少有点不算准确,理解成“输入一些东西,然后按一定规则修改输出”比较合适。
*对于离散2D卷积,积分过程直接变为了求和过程。其中i和j的范围限制在了-1到1之间,而I则可以视为后面图像上的一个点。
*由于这时的f(i,j)可以用一个3X3矩阵来表示,因此通常也被称为“过滤权重”或“过滤核”。
*从图中伪代码可以看出,对于行列上的每一个点tmp,进行了一个3X3的循环(jj和ii循环),将其中对应的位置以输入来源(input)对应1/9的值进行了处理。
通过这种(贡献基于距离衰减)的方式得出相邻像素的权重和——在实践中,为了提高效率,在超出一定距离后就将过滤器截断(不计算)了。
*例如图中的3X3矩阵,其权重和还是1。相比前面的Box模糊,相对有着数学上更“科学”的模糊方式。
*右侧的图是图像在频域空间的视觉化(频谱)。其中的高频信号表现为散射出的“线”。
*图像中的高频信号,例如跨越轮廓边缘等;相对的,如果一大片区域都是类似的颜色,在频域上就表现为低频。B站Games101系列课中也引用了同样的图片(讲解了同样的课题),详细讲解可以去看视频。
以图中的过滤器进行卷积是什么效果?——提取水平梯度、垂直梯度。
备注:你可以把一个过滤器想象成一个纹样的“探测器”,输出的图像中的像素点的值(量级)可以视为对输入图像中其周围像素区域的“反应”(这是计算机视觉领域的一项常规解释)。
*参照前页,Gx是水平梯度、Gy是垂直梯度。通过图中下方的公式可以计算出图像中的边缘——这也常被运用于像素级的图像处理或操作中。
*这里不是计算的算法复杂度,而是像素被迭代的次数。
*(如图)那么NXN的过滤器,其开销是:N ² * 宽 * 高。
如果一个过滤器可以表达为另两个其它过滤器的乘积,则说它是可分离的。
例如:一个2D Box模糊(如图)。作为实践,可以尝试将2D高斯模糊或者垂直、水平梯度检测过滤器写成1D过滤器的乘积(它们都是可以分离的)。
关键属性:可分离过滤器的2D卷积可以写成两个1D卷积的形式。
*那么NXN的过滤器,其开销是:2N * 宽 * 高。(相对降低了计算开销)
*如图,可以看到原本是嵌套的循环可以写成i和j分别循环。
在硬边缘其余不进行平滑(模糊),而在非边缘区域进行平滑。
双边过滤器的用例:在保持边缘的同时消除噪点(磨皮)。
*公式部分红字(从左到右)依次翻译如下:归一化(权重和应为1)、对于所有高斯核的支撑区域内的像素(进行累加)、基于输入像素值的差分进行重新计算权重、高斯模糊核、输入图像。
*Wp的则是对权重项f(x)和高斯核G的累加。i和j对应高斯核的尺寸。
输出像素(x,y)的值,是计算了截断的高斯核所得的支撑区域中的所有像素的加权值。
不过这里权重是空间距离和输入图像的像素强度差分的组合。(过滤器的权重依赖输入的图片内容)
图1:原始图像的值以高度图的方式表达,其中两个平面上各自凹凸不平,且平面之间有明显高度差(代表图像中的边缘)。
图2:原始的高斯核,符合其基于距离权重(依高斯函数)下降的特性。
图3:有着明显强度差分的像素对于过滤的结果贡献很小(它们是在“边缘的另一边”)。
图4:G * f 是被重新分配了权重的高斯核。
图5:过滤的结果——在保持高度差(边缘)的同时,各自平面内被模糊“抹平”了。
*可以看到例图中的3处位置,由于f(x)项内容输入了范围内的一些原始像素,因此得到的各位置的高斯核也不同。
*这里指同时在一定的空间和频域范围对图像做局部修改。
*这部分伪代码反应了前述的思路。Blur部分是一个4X4的模糊核,循环部分则跳过了一半的原始像素。
通过对低分辨率的图像做双线性插值。(*即XY轴同时计算插值)
*图示中黑色点是原始像素,红色点是输出像素。这里基于自像素的行列位置计算了权重w1和w2(0.75和0.25),它们分别用于计算原始的4个像素对新的1个像素的贡献。
*图示可能画成4个黑点中间的4个红点,会更好理解一些。
金字塔中的每一层图片包含了更加低通的信号(通过降采样的方式)。
*注意这里虽然看着和游戏图形中的mipmap相似,但是其计算步骤是不同的。
*这里中间我略去了一些纯过程的图片页。感兴趣的可以去看原文。
每一级(数字递增的)拉普拉斯金字塔代表了一组(逐渐降低的)图像中的频率信息。
*可以理解为down的过程中被模糊掉的部分(依照图中公式)。
问题:如何通过图像的拉普拉斯金字塔(和低分辨率图像)来重建原始图像?
高斯和拉普拉斯金字塔都是以其中的像素表达了原始图像中的一个区域的频率信息。
Gi(x,y)——将频率限制为基于i给定的上限
Li(x,y)——频率信息加上Gi+1就可以得到Gi
注意:要增加一个像素(x,y)周围的频率带宽,增加Li(x,y)在拉普拉斯金字塔的系数。
考虑一个简单的案例:我们想混合两个图像纹样。直接组合则不够“平滑”。
*图中的公式就是图形渲染中常说的“Alpha Blend”公式——可以理解为颜色值的一种加权计算。这里主要是讨论这个遮罩过渡如何给定。
为避免接缝,过渡窗口需要大于等于最大的显著特征。
为避免鬼影,过渡窗口需要小于最小的显著特征的2倍尺寸。
换言之,最大和最小特征的尺寸需要在2倍的范围内,这样羽化后就能得到好的视觉效果。
直觉上:粗糙的(大尺寸的)图像结构需要在图像间缓慢过渡,精细的结构需要快速混合。
方案:混合拉普拉斯金字塔(而非像素),基于Alpha遮罩的高斯金字塔。
*这一节提到的Tone Mappling也是游戏图形中常用的后处理效果(通常是基于LookUpTable查表)。这一节主要是考虑了摄影中混合多张不同曝光情况的图像。
*以图中为例,如果最亮和最暗的情况直接做裁剪,显然会丢失很多信息,且过渡也不自然。
*上方图片依次是:曝光时间从短到长的像素值和权重。
(色调调整是为了)提升图像的美感,通过局部调整对比度,增强暗的区域、减弱过亮的区域(而不是进行基于物理的调整)。
计算所有拉普拉斯金字塔级别
混合金字塔(图像特征)而不是图像像素
之后“平整”混合后的金字塔以获得最后的图像
*图中右侧是基于这一方案混合的结果。由于提取了图像特征(高频)进行了处理,因而一定程度上规避了前述的一些问题。
卷积是一项强大的图像处理操作——不同的核能带来不同的效果。
基于原始数据的核能用于边缘感知的图像处理(拉普拉斯过滤器)。
高斯和拉普拉斯金字塔:能用于空间和频域两方都局部修改的数据结构。
图像处理既有其很“数学”的一面,也有其很“美学”和“直觉”的一面,最终人们提炼积累了很多算法和处理过程。例如什么是“半透明”,什么是“磨皮效果”,读完这篇应该就能有很直观的理解了——实际应用中当然还会有各种组合和改良,但其基本思想是不变的。
另外,由于各类概念中Gaussian(高斯)一词出现频率过高(由于高斯其人对于数学的卓越贡献),因此结合了Gaussian的概念很多时候还是得看到其细节才知道具体是在做什么——例如Gaussian Splatting是一种使用了其数学工具来做三维空间表达的方案,虽然也能缩写成Gaussian,但又完全不是一回事了。
评论区
共 条评论热门最新