图像处理:双线性差值的另一种处置方法

图像处理:双线性差值的另一种处理方法

本文仅仅限于双线性差值:

先来说说大家在网上都知道的一种,这种方法google一搜,就出来很多,我来简要介绍一下:

越是简单的模型越适合用来举例子,我们就举个简单 的图像:3X3 的256级灰度图,也就是高为3个象素,宽也是3个象素的图像,每个象素的取值可以是 0-255,代表该像素的亮度,255代表最亮,也就是白色,0代表最暗,即黑色 。假如图像的象素矩阵如下图所示(这个原始图把它叫做源图,Source):
234 38 22
67 44 12
89 65 63

这个矩阵中,元素坐标(x,y)是这样确定的,x从左到右,从0开始,y从上到下,也是从零开始,这是图象处理中最常用的坐标系,就是这样一个坐标:

---------------------->X
|
|
|
|
|
∨Y

如果想把这副图放大为 4X4大小的图像,那么该怎么做呢?那么第一步肯定想到的是先把4X4的矩阵先画出来再说,好了矩阵画出来了,如下所示,当然,矩阵的每个像素都是未知数,等待着我们去填充(这个将要被填充的图的叫做目标图,Destination):
? ? ? ?
? ? ? ?
? ? ? ?
? ? ? ?

然后要往这个空的矩阵里面填值了。

srcX=dstX* (srcWidth/dstWidth) , srcY = dstY * (srcHeight/dstHeight)

对于一个目的像素,设置坐标通过反向变换得到的浮点坐标为(i+u,j+v) (其中i、j均为浮点坐标的整数部分,u、v为浮点坐标的小数部分,是取值[0,1)区间的浮点数),则这个像素得值 f(i+u,j+v) 可由原图像中坐标为 (i,j)、(i+1,j)、(i,j+1)、(i+1,j+1)所对应的周围四个像素的值决定,即:

  f(i+u,j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1) 公式1

其中f(i,j)表示源图像(i,j)处的的像素值,以此类推。

比 如,象刚才的例子,现在假如目标图的象素坐标为(1,1),那么反推得到的对应于源图的坐标是(0.75 , 0.75), 这其实只是一个概念上的虚拟象素,实际在源图中并不存在这样一个象素,那么目标图的象素(1,1)的取值不能够由这个虚拟象素来决定,而只能由源图的这四 个象素共同决定:(0,0)(0,1)(1,0)(1,1),而由于(0.75,0.75)离(1,1)要更近一些,那么(1,1)所起的决定作用更大一 些,这从公式1中的系数uv=0.75×0.75就可以体现出来,而(0.75,0.75)离(0,0)最远,所以(0,0)所起的决定作用就要小一些, 公式中系数为(1-u)(1-v)=0.25×0.25也体现出了这一特点



另外,还有一种方法就是我自己看到线性差值的数学定义自己想到的,也可能之前已经有人想到了,但是,我并没有参考其他的想法:

还是接着这个3x3的图像来说,这次,我们把它放大成一个6x6的图像,还是先画一个模版:

? ? ? ? ? ?
? ? ? ? ? ?
? ? ? ? ? ?
? ? ? ? ? ?
? ? ? ? ? ?
? ? ? ? ? ?

我们设原来图像的长和宽分别是oldHeight,oldWidth,而扩大后的图像就是newHeight,newWindth。

令Hcoe = newHeight/oldHeight, Wcoe = newWidth/oldWidth

我们再设3x3的图像为f,而扩大后的图像为F,那么,f——>F的映射就是(x * Wcoe, y * Hcoe),其中x,y都属于f的x轴y轴的取值范围,说白了就是图像的长宽。

然后我们就得到了如下的图像:

234 ? 38 ? 22  ?
?      ? ?   ?  ?   ?
67   ? 44 ? 12 ?
?      ?  ?  ? ?   ?
89   ? 65 ? 63 ?
?      ? ?   ?  ?  ?

然后,我们记录下来映射到F图像中点的位置,然后,我们计算两个两个的平均值,比如234和67的平均值放在了F的x=1,y=0的位置,234和38的平均值放在了x=0,y=1的位置。这样一次计算平均值。如果f数据计算完了,我们就标记被计算出来的点,在按照这种方法做平均值。就类似一个递归,知道计算出来所有点。就比如,我已经234和67,38和44, 234和38,44和67的四个点的平均值,然后就计算出来了x=1,y=1的平均值。


下篇我会分析下两种算法的复杂度。