写在前面:

微软雅黑字体微软雅黑虽然该部分内容属于基础中的基础,然而学习中会有“熟知≠真知”的情况,故决心写下笔记。本文着重对简单原理的详细推导,对你在免费文章和课程中不涉及的“坑”进行细致地数学剖析,结合自己做的图示,通过问题带动思考的引导方式系统地进行分情况讨论等……更加适合专业人士复习和初学者学习!

一、准备工作:

1.1 认清几个事实:

(I).数字图像在计算机中是以矩阵形式储存,其行列下角标从0开始;
(II).矩阵中每个元素中储存对应数字图像中的像素值(可能不只一个通道);
(III).矩阵中元素信息对应数字图像对应位置中的位置和像素值信息,却不包含实际图像中像素点本身大小。
(IV).将图像放置于坐标系中,y轴正方向向下,x轴正方向向右。

1.2 提出几个设定:

(I).下述讨论中,为了便于理解,假设所有图像中的像素点均为边长1的正方形
(II).原图像尺寸(H=m, W=n),原图像矩阵
图片1.png
图片2.png
(III).原图像中各点像素值(矩阵中元素值)与位置坐标满足映射
图片3.png

图片4.png

二、坐标变换讨论:

2.1 原图像、目标图像和插值点阵

设:目标图像尺寸(H=r, W=s), 图像矩阵
图片8.png
因此y、x方向(即H、W方向)变换比例分别为
图片9.png
那么在进行插值之前,我们就要试图找到图像B中各像素点与图像A中各像素点的“某种’位置’对应关系”,在此对应关系基础上,才可以应用插值算法。
\
那么位置对应关系如何建立?
\
我们很自然地认为只需要将B中像素坐标
图片11.png
即可得到?(?′?,?′?)作为(??,??)的插值点并与A中相关的4个点进行插值运算得到像素值。
但是!请稍作思考,我们就会发现由于1.1(I)(即A、B矩阵中元素下角标规律)和1.2(I)的存在,图像尺寸之间的比例缩放与坐标换算之间存在差异,这种差异会导致我们的坐标按照③式变换后得到B的插值点阵M(M为r×s阶矩阵)的坐标偏向左上角且与A于左上角对齐。这种“不对称”会给插值结果带来“不可接受”的偏差,因此我们需要消除。
\
那么,对M(r×s)的坐标到底要如何优化?
\
图片12.png
图片13.png

2.2 几何中心的对齐

也许解决这个问题的思路之一就是“修正”M(r×s)的坐标,方法就是对齐进行坐标平移变换使二者几何中心坐标相等,即所谓对齐。
那么,平移向量如何取? 我们不妨以y轴方向(H方向)举例推导,x轴方向同理。
原图像几何中心坐标
图片14.png
图像B的插值点阵M(r×s)几何中心坐标
图片15.png
无论向量直接对A、直接对B、直接对M或者对A、B同时平移,在数学上均可以推导出大家在很多文章中看到的“左右各+1/2”的形式,下面是直接对M平移的推导过程:
设:对M平移k个单位与A对齐,则根据④=⑤+k式可以得,
图片16.png
将k值代回⑥到得,
图片17.png
看!我们成功得到的大家在资料中看到的⑦式同样形式的“左右各+1/2”结论。
但是,请注意!不要过度喜出望外,还记得我们仅仅是将“M几何中心坐标通过坐标平移变换与A的几何中心坐标重合”了么?
\
那么,M中其他坐标变换后的坐标表达式是什么呢?
\

2.3 关于插值点阵所对应矩阵中坐标的讨论【原创】

2.3.1 平移后插值点阵所对应矩阵坐标yT的取值范围【原创】

根据上一节知,我们对矩阵M中坐标进行平移变换,变换后得到新的插值点阵T(T为r×s阶矩阵),则
图片18.png
图片19.png
由于yB∈[0,(r-1)],我们可以得到y方向插值点阵T(r×s)的坐标取值范围为
图片20.png
\

2.3.2 平移后插值点阵的矩阵坐标y_T的取值范围边界的分类讨论【原创】

设:
图片21.png
(i)如果目标图像B相对原图像A是放大,则r∈[m+1,+∞)
图片23.png

图片24.png
落在原图像“最小坐标”之外,它与落在原图像之内的点在进行双线性插值的时候算法上将会有差别。
\
P.S.那么等价矩阵中只有最小值y_(T,min)在原图像最小坐标之外么?
\
我们来验证一下:设:∆y∈N^+,令
图片25.png
翻译翻译就是:y轴负方向上有且仅有y_(T,min)在原图像“最小坐标”之外。
下面我们进行对上限取值范围的讨论:
图片26.png
落在原图像“最大坐标”之外,它与落在原图像之内的点在进行双线性插值的时候算法上将会有差别。(此时要注意我们已经证明了插值点阵中的四个角点更加特殊)
\
P.S.那么等价矩阵中只有最小值y_(T,max)在原图像最大坐标之外么?
\
我们来验证一下:设:∆y∈N^+,令
图片27.png
翻译翻译就是:y轴正方向上有且仅有y_(T,max)在原图像“最大坐标”之外。
\
(ii)如果目标图像B相对原图像A是缩小,则r∈[1,m-1] ( 注意m>2 )
图片28.png
即y轴负方向上y_(T,min)在原图像“最小坐标”之内。
\
下面我们进行对上限取值范围的讨论:
图片29.png
即y轴正方向上y(T,max)在原图像“最大坐标”之内。
其余情况,如变换比例为1或原图(H=W=2)缩小为新图(H=W=1)等情况不作讨论。
至此关于插值点阵T
(r×s)中矩阵坐标的讨论结束!
\

三、双线性插值思路和方法讨论:

3.1 线性插值原理【二创】

(为了避免与前几章相关名词或符号相混淆,也为了更适合接下来的讨论,本人对线性插值介绍的一些名词和符号做了调整。)
设:平面直角坐标系中存在已知的两点坐标分别为C(xC,ZC)和D(xD,ZD)(两点横纵坐标各不相等),已知另外两个横坐标xTi,xTo
求:当T_inner (xTi,ZTi)和T_outer (xTo,ZTo)在CD两点所在所确定的直线上时的坐标。
我们知道,如果点在直线上,那么该点坐标一定满足该直线方程。
首先求该直线方程,根据直线方程的“点斜式”可知:
图片30.png
只需将xTi,xTo带入⑨式即可求得两点坐标。
图片31.png

3.2 双线性插值原理【二创】

即使用3次线性插值,其中前两次插值所得到的点所确定的直线用于第三次插值。
已知原图像中点(y_ij,x_ij)的像素值满足f(y_ij,x_ij),那么图6中欲通过双线性插值得到点T的像素值,就需要先通过两次线性插值得到P_inner和Q_inner的像素值,即
图片32.png
图片33.png
则做第三次线性插值
图片34.png
如果考虑实际情况,则有
图片35.png
那么
图片36.png
经过代入化简可以得到某些资料上的那个“四项式”(下述紫色部分式子):
图片1.png
计算机代码中可直接使用⑩式计算插值即可。
\

3.3 双线性插值实际应用时对特殊情况的处理【原创】

情况一:比例为1的缩放
如果遇到图片缩放比例为1时,考虑功耗和代码运行效率等,虽然此时仍可以无障碍运行插值算法代码程序,但仍建议代码中在判定成功时,直接copy原图像直接输出。
情况二:放大图像
从双线性插值原理我们不难得知,所有插值是假设使用“内插值”。虽然数学上我们同样可以使用4个点阵对点阵外一点使用“外插值”,但是在实际计算机处理大量数据时,其常常是采用循环语句进行批量处理,因此不可避免需要增加判断语句代码,对外插值情况编写单独算法。
例如2.3.2的结论,在图像放大时,等价点阵的最外层的一圈点的矩阵坐标在原图像矩阵坐标“外侧”。因此对于四个角上的点,我们需要单独以原图像对应的四角方格的4个点阵做外插值;而对于四条边上的点,则需要选取最临近的一个方格的4个点做外插值。
\

四、总结:

\
T(r×s)无论百度或者知乎等关于“双线性插值”的介绍都集中于对基础数学原理的简单推导和“为什么要在等式两端+1/2”做简单推导。
而本笔记针对作业中实际问题作更加细致的讨论,所涉及到运用的知识为高中或者大一的数学知识,作图部分仅靠office家族即可完成。公式推导部分更加详细且整洁,图示信息更加丰富且易读。
本笔记并没有将得到的结论应用于代码实践中,原因在于:可实现算法的编程语言众多,如C++、Java或者python等不便于也没能力逐一展示。但通过上述几章的讨论,我们已经知道了当解释器报错或者输出结果不堪入目的时候,有可能就是我们的代码在处理数学结果上没有同样分类处理所造成的。
需要指出的是,不同人提出的处理方法各不相同,也有可能提出的新解决方法的同时也引入的新的问题。这就要求我们对不同解决方案之间评估风险,做出取舍……一切以“最适合”解决所面临的问题为最优先。
鉴于本笔记是在作者七次推导失败后形成的,相信一定仍存在疏漏,甚至是错误。请大家一定多提问题,对任何错误及时加以批评指正!
谢谢大家!