OpenGL中的常量重建和双线性重建的基本原理

Note

这是对MIT Foundation of 3D Computer Graphics第17章的翻译,本章讲解了常量重建和双线性重建两种重建算法的基础知识。本书内容仍在不断的学习中,因此本文内容会不断的改进。若有任何建议,请不吝赐教ninetymiles@icloud.com

注:文章中相关内容归原作者所有,翻译内容仅供学习参考。
另:Github项目CGLearning中拥有相关翻译的完整资料、内容整理、课程项目实现。


已经完成的章节


重建(Reconstruction)

现在让我们关注对立问题:假定一个具体图像I[i][j],我们怎样生成一个连续图像I(x,y)?正如我们将会看到的,这个问题对于图像尺寸调整以及纹理映射是中心问题。例如,在碎片着色器中,我们可能希望借助落入(两个)纹理像素之间的纹理坐标从纹理中获取色彩。在这种情形中,我们需要决定使用什么纹理色彩。这个处理被称为重建。

17.1 常量重建(Constant)

让我们再次假设我们的像素对应整数值化的(x,y)地址,同时我们希望在某种小数值化的地址处决定一个色彩。可能最容易的图形重建方式为常量重建(或称作最近邻居)方法。在这种方法中,一个实数值化的图像坐标被假定拥有最近的具体像素的色彩。这种方法可以借助下面的伪码描述

color constantReconstruction(float x, float y, color image[][]){ 
    int i = (int) (x + .5); //四舍五入到整型值
    int j = (int) (y + .5);  
    
    return image[i][j] 
}

这种“(int)”类型转换近似一个数字p为不大于p的最近的整数。

我们把这种方法当作是定义了在连续(x,y)域上的连续图像。我们称此为“常量重建(constant reconstruction)”,因为最终的连续图像由常量色彩的小正方形块组成。例如,图像在正方形区域:−.5 < x < .5−.5 < y < .5中拥有常量值I[0][0]。每个像素拥有1\times1的影响范围。参考图示\text{Figure 17.1}的左侧。

Figure17.1.png

Figure 17.1: 顶部行:一个具体图像。底部左侧:使用常量重建方式被重建。底部右侧:借助双线性重建被重建。©️Yasuhiro Endo。

17.2 双线性重建(Bilinear)

常量重建产生块状外观的图像。我们可以借助双线性插值生成更平滑外观的重建。双线性插值通过在水平和垂直方向都进行线性插值来获得。它可以通过下面的代码被描述:

color bilinearReconstruction(float x, float y, color image[][]){

int intx = (int) x; 
int inty = (int) y; 
float fracx = x - intx; 
float fracy = y - inty;

colorx1 = (1-fracx) * image[intx] [inty] + (fracx) * image[intx+1][inty]; 
colorx2 = (1-fracx) * image[intx] [inty+1] + (fracx) * image[intx+1][ inty+1];

colorxy = (1-fracy) * colorx1 + (fracy) * colorx2;

return(colorxy)
}

在这种代码中,我们首先在x坐标上应用线性插值,跟着在y坐标上应用前面所获结果的线性插值。

在整数坐标上,我们有I(i, j) = I[i][j];重建的连续图像I认同具体图像I。在整数坐标之间,色彩值被连续混合。每个具体图像中的像素以一种可变的程度影响着连续图像中2\times2正方形区域中的每个点。图示\text{Figure 17.1}比较了常量和双线性重建。

让我们更仔细一点观察坐标i < x < i + 1, j < y < j + 1所确定的1\times1正方形,其中ij为某种固定值。在这个正方形上,我们可以表达重建为
\normalsize{ \begin{array}{rl} I(i + x_f , j + y_f ) & \leftarrow & (1 − y_f )((1 − x_f )I[i][j] + (x_f)I[i + 1][j]) \\ & & +(y_f)((1 − x_f )I[i][j + 1] + (x_f)I[i + 1][j + 1]) \end{array} \qquad\qquad \tag{17.1} }
此处x_fy_f为上面的fracxfracy。重新排列各项我们得到
\normalsize{ \begin{array}{rrl} I(i + x_f , j + y_f) & \leftarrow & I[i][j]\\ && + (−I[i][j] + I[i + 1][j])x_f \\ && + (−I[i][j] + I[i][j + 1])y_f \\ && + (I[i][j] − I[i][j + 1] − I[i + 1][j] + I[i + 1][j + 1])x_fy_f \end{array} }
完成上面步骤,我们看到重建函数在变量(x_f,y_f)上拥有常量项,线性项,和双线性项,因此在(x,y)上也是相同的情况。这就是双线性名称的来源。同时这也清晰无误地表明了这种重建对于水平和垂直方向是对称的,因而伪码中水平优先的顺序表达不是影响对错的关键因素。

17.3 基础函数(Basis Functions)

要获得重建方法通用形式的更多理解,我们可以返回到方程(17.1)然后重新排列各项获得
\begin{array}{rrl} I(i + x_f , j + y_f) & \leftarrow & (1 − x_f − y_f + x_fy_f)I[i][j] \\ && +(x_f − x_fy_f)I[i + 1][j] \\ && +(y_f − x_fy_f)I[i][j + 1] \\ && +(x_fy_f)I[i + 1][j + 1]\end{array}
在这种形式中,我们看到对于一个固定位置(x,y),连续重建的色彩在I的具体像素值中是线性的。因为这在所有的(x,y)上都是确定的,对于函数B_{i,j}(x,y)的某种合适选择,我们看到事实上重建一定是这种形式
I(x, y) \leftarrow \sum_{i,j}B_{i,j}(x, y)I[i][j] \tag{17.2}

这些B函数被称作基函数(basis functions);它们描述了像素i,j多大程度上影响[x,y]^t处的连续图像。

在这种双线性重建中,这些B函数被称作帐篷函数(tent functions),它们被定义如下:让H_i(x)作为单变量帽子函数(hat functions)被定义为
\begin{array}{c} H_i(x) & = & x−i+1 & for & i−1<x<i \\ && −x+i+1 & for & i<x<i+1 \\ && 0 & else & \end{array}
参考图示\text{Figure 17.2}。(在1D中,帽子基(hat basis)可以被用于接收在整数值范围上的一个值的集合,同时线性插值它们以获得一个连续的单变量函数。)那么,让T_{i,j}(x,y)被定义为双变量函数
T_{i,j}(x, y) = H_i(x)H_j(y)

Figure17.2.png

Figure 17.2: 一个帽子基(hat basis)由10个基函数组成。当被线性插值,它们可以生成具体值上(显示为圆点)逐段线性插值。

这被称作一个帐篷函数(参考图示\text{Figure17.3})。可以验证把这些帐篷函数插入方程(17.2)中会给出我们双线性重建算法的结果。

Figure17.3.png

Figure 17.3: 一个双线性帐篷函数(tent function)的四个四分之一圆周视图。在其中心值为1,并且在像素的正方形边缘其值降为0.

常量重建也可以用这种形式被建模,但是在这种情形中,基函数B_{i,j}(x,y)为盒式函数,其除了围绕坐标(i,j)的正方形区域中拥有常量值为1之外,其余处处都为0.

更通用的情形中,我们可以选择各种尺寸和形状的基函数。在高质量图像编辑工具中,比如,重建可以借助参考书目[50]中的某种双-立方基函数(bi-cubic basis functions)被实现。在这种意义上,像素不真正为一个小正方形。它只是一个具体值,其被用于联合基函数集合以获得一个连续函数。

17.3.1 边缘保留(Edge Preservation)

线性方法,尤其那些借助方程(17.2)重建一张图像的线性方法,仅只是在具体像素之间进行简单填充。当我们靠近观察重建的连续图像,发现边缘会显得模糊掉了。存在有更高级的非线性技术,这些技术甚至在重建时也尝试维护锋利(立即过渡)的边缘,但是超越了我们的学习范围。关于这个主题的更多资料,参考[18]及其中的参考文献。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容