一种实现图像整数倍放大的方法 【技术领域】
本发明涉及图像处理,尤指一种实现图像整数倍放大的方法。
背景技术
在进行图像缩放时,需要采用插值技术。所谓插值也称为“重置样本”,是在不生成像素的情况下增加图像像素大小的一种方法,在周围像素色彩的基础上用数学公式计算丢失像素的色彩,也就是根据中心像素点的颜色参数模拟出周边像素值的方法。插值是图像缩放处理的基础,常见的图像缩放插值算法有最近像素插值法、线性插值法以及立方插值法。
最近插值法是取距离最近的像素点的像素值作为新增像素的像素值。这种算法复杂度低,速度快,但是会导致图像很明显的失真,使放大后地图像出现马赛克和锯齿等明显的走样情况。其插值原理如图1所示:A、B是原图上已经有的像素点,如果要知道其中间X位置处的像素值,需要找出X位置和A、B位置之间的距离d1、d2,因为d2小于d1,所以取X位置处像素值等于B像素点的像素值。
线性插值法是认为两个点之间的像素值是按线性变化的,新插入点的像素值与相邻两点的像素值成线性关系。线性插值法复杂度要比最近像素插值法高,但效果有明显的改善,图像显得平滑、清晰。其原理如图2所示:A、B两点的像素值之间,认为是直线变化的,如果要求X点处的像素值,由于X点处像素值与A、B点像素值成线性关系,只需要找到对应位置直线上的一点即可。
立方插值法是参照周围若干个像素点,选用合适的曲线匹配来求解新的像素点的像素值。这种方法使得图像更平滑、更清晰,但是由于参照的像素点多,匹配曲线复杂,导致运算复杂度大大提高。立方插值法一般用硬件来实现,软件系统特别是实时传输系统中极少用到。其算法原理如图3所示,如果要求B、C之间某点X的像素值,需要利用B、C周围A、B、C、D四个点的像素值,通过某种复杂计算,得到光滑的曲线,从而算出X点的像素值。
现在常用的PC摄像头主要有两种,一种是采集卡摄像头,另一种则是USB摄像头。PC摄像头视频采集主要有以下几种标准图像格式:
SQVGA(160×120),QCIF(176×144),QVGA(320×240),CIF(352×288)和VGA(640×480)。
视频采集选用的图像格式越大,分辨率越高,像素越多,图像的质量也就越好,越清晰。然而很多场合并不能够一味的追求图像质量,因为图像越大,所含的信息量越大,占用的数据空间也就越大。如CIF格式24位精度的RGB图像占用的空间是304128字节,如果每秒钟采集10帧,那么每秒钟的数据量将是3041280字节。目前大多数宽带网络提供的带宽都在2M bits以内,对于象视频会议需要同时提供多路视频显示的实时传输系统而言,显然不能够按大图像格式采集,而只能牺牲视频图像的质量,采用SQVGA或QCIF小图像格式。
为了能给用户提供更友好的操作性能以及视觉效果,视频会议等系统往往需要提供图像缩放功能。目前,绝大多数的视频会议系统采用最近插值法或线性插值法进行图像放大。最近插值法会导致图像质量的急剧恶化,在大比例放大的情况下是不可取的。而现有的线性插值法考虑的是任意比例图像缩放,在实现过程中用浮点运算,运算复杂度仍然很高,无法满足系统同时进行多路视频放大的要求。此外,现有的线性插值法在运算过程中由于精度的损失,会使放大后的图像变暗、模糊。
【发明内容】
本发明提供一种实现图像整数倍放大的方法,以解决现有技术中对图像放大时插值运算复杂度高且放大图像清晰度低的问题。
本发明方法包括:若需将原图像在宽度方向放大n倍,在高度方向放大m倍,其中,m、n为大于1的整数,则执行下列步骤:
A、按序选取原图像中的四个相邻像素点A、B、C和D,并获取其对应像素值VA、VB、VC和VD;
B、在所选取的四个相邻像素点之间插入中间插值点,按下式计算出各中间插值点的像素值Vij,并存储;
Vij=1mn[(m-i)(n-j)VA+j(m-i)VB+i(n-j)VC+ijVD]]]>
式中,i、j表示中间插值点与所选四个像素点的相对位置坐标,1≤i≤(m-1);1≤j≤(n-1);
C、在所选取的四个相邻像素点之外添加边缘插值点,定义位于第n列右边且在第m行及其上方区域的边缘插值点为水平边缘插值点,位于第m行下方区域的全部边缘插值点为垂直边缘插值点;并按下列公式分别计算出所述水平边缘插值点和垂直边缘插值点的像素值,并存储;
水平边缘插值点的像素值计算公式为:
Vip=Vi0+pVi_step
式中,1≤p≤(n-1),1≤i≤m;Vip表示第i行第p列的水平边缘插值点的像素值;Vi0表示与第i行第一个水平边缘插值点相邻的中间插值点的值;Vi_step表示第i行边缘插值点的计算步长,其值为该行相邻两个中间插值点的差值;
垂直边缘插值点的像素值计算公式为:
Vqj=V0j+qVj_step
式中,1≤q≤(m-1),1≤j≤(n-1);Vqj表示第q行第j列的垂直边缘插值点的值;V0j表示与第q行第一个垂直边缘插值点相邻的中间插值点的值;Vj_step表示第q行边缘插值点的计算步长,其值为该列相邻两个中间插值点的差值;
D、若原图像中全部相邻的像素点都计算完毕,则输出计算出的全部中间插值点、边缘插值点的相应像素值,得到在宽度方向放大n倍,在高度方向放大m倍的新图像;否则,重复上述步骤。
所述步骤A包括:
设置像素点行坐标计算器的计数值为w,列坐标计算器的计数值为h;若原图像在宽度方向有X个像素点,高度方向有Y个像素点,则执行下列步骤:
A1、计数器清零,使w=0,h=0;
A2、判断h是否小于(Y-1),若是,执行下列步骤,否则,转至步骤C;
A3、判断w是否小于(X-1),若是,执行下列步骤,否则,使h=h+1,w=0;转至步骤A2;
A4、从原图像存储空间中的如下A位置、B位置、C位置和D位置获取相邻四个像素点的像素值:
A位置=h*X+w;
B位置=A位置+w+1;
C位置=A位置+X;
D位置=C位置+X;
A5、使w=w+1,转至步骤A3。
在执行所述步骤A之前还包括有为新图像申请大小为原图像的m*n倍的存储空间的步骤。
所述m、n的取值相同或不同。
采用本发明方法能够大大降低对图像放大时的插值计算复杂度,并使放大后的图像保持良好的清晰度和边缘锐利性。
【附图说明】
图1为现有技术中最近插值法插值原理示意图;
图2为现有技术中线性插值法插值原理示意图;
图3为现有技术中立方插值法插值原理示意图;
图4为对原图像宽、高各放大2倍后的像素点示意图;
图5为对原图像宽放大n倍、高放大m倍后的像素点示意图;
图6为本发明方法流程图。
【具体实施方式】
下面说明整数倍放大插值算法的原理。
图4表示原图像中四个相邻A、B、C、D像素点,其宽、高经过2倍的整数倍插值后的示意图,A、B、C、D像素点仍然出现在放大后的新图像中,a...1为插入点。可以看出,a,c,d,e,g点处于四个相邻点之间,其像素值可以由相邻点A、B、C、D的像素值计算得出,称为中间插值点;而b,f,h,i,j,k,l处于图像的边缘处,称为边缘插值点。对于边缘插值点,可以有两种方法求出其像素值,一种是采用最近插值法原理,直接取距离最近像素点的值,例如,取B点的像素值作为b点的像素值,e点的像素值作为f点的像素值;取C点的像素值作为i点的像素值,h点的像素值作为l点的像素值。这种方法缺点在于当放大倍数较大时图像边缘出现明显的条状效应,图像不够平滑。另一种是认为边缘像素点与其邻近点也成线性关系,如b点与a点、B点成线性关系,f点与d点、e点成线性关系;i点与c点、C点成线性关系,j点与d点、g点成线性关系,这样,边缘像素点也很容易求出,并且使得图像平滑。本发明采用后一种方法。
图5为对原图像宽、高分别放大n、m(n、m均为大于1的任意整数)倍的整数倍插值示意图,同样地将插值像素分为中间插值点和边缘插值点两部分进行处理。下面结合图5分别推导出宽、高分别放大n、m倍的整数倍插值算法的中间插值点和边缘插值点的计算公式。
用V表示像素点的值,那么Vij表示第i行第j列的像素点的值。
如图5所示,定义第n列右边且在第m行上方(包括第m行)部分为水平边缘插值点,第m行下方所有点为垂直边缘插值点。
中间插值点的计算公式为:
Vij=Vi1+j(Vin-Vi1)/n 公式(1)
Vi1=V11+i(Vm1-V11)/m 公式(2)
Vin=V1n+i(Vmn-V1n)/m 公式(3)
将公式(2),(3)代入公式(1)式,简化后得到下式
Vij=1mn[(m-i)(n-j)V11+j(m-i)V1n+i(n-j)Vm1+ijVmn]]]>
令VA=V11;VB=V1n;VC=Vm1;VD=Vmn则得到任意中间插值点的计算公式:
Vij=1mn[(m-i)(n-j)VA+j(m-i)VB+i(n-j)VC+ijVD]]]>公式(4)
边缘插值点的计算公式如下
水平方向的边缘插值点:
Vi(n+p)=Vin+p(Vin-Vi(n-1))
Vin,Vi(n-1)是已计算出来的水平相邻像素点,令Vi_step=Vin-Vi(n-1),则得到
Vi(n+p)=Vin+pVi_step
只考虑水平边缘插值点,因此令n=0,得到水平边缘插值点计算公式如下:
Vip=Vi0+pVi_step 公式(5)
其中,Vip表示第i行第p列的水平边缘插值点的值;Vi0表示与第i行第一个水平边缘插值点相邻的中间插值点的值;Vi_step表示第i行边缘插值点的计算步长,其值为该行相邻两个中间插值点的差值。
垂直方向的边缘插值点:
V(m+q)j=Vmj+q(Vmj-V(m-1)j)
Vmj,V(m-1)是已计算出来的垂直相邻像素点,令Vj_step=Vmj-V(m-1)j,则得到
V(m+q)j=Vmj+qVj_step
只考虑垂直边缘插值点,因此令m=0,得到垂直边缘插值点计算公式如下:
Vqj=V0j+qVj_step 公式(6)
其中,Vqj表示第q行第j列的垂直边缘插值点的值;V0j表示与第q行第一个垂直边缘插值点相邻的中间插值点的值;Vj_step表示第q行边缘插值点的计算步长,其值为该列相邻两个中间插值点的差值。
比较公式(5),(6),两个公式是一致的,因此使用统一的计算公式(7)来替代
Vk=V0+kVstep 公式(7)
其中,在计算某一行水平边缘插值点时,k表示该行第k个水平边缘插值点,Vk表示该点的像素值,V0表示该行第一个水平边缘插值点相邻的中间插值点的像素值,Vstep表示该行边缘插值点的计算步长;在计算某一列的垂直边缘插值点时,k表示该列第k个垂直边缘插值点,Vk表示该点的像素值,V0表示该列第一个垂直边缘插值点相邻的中间插值点的像素值,Vstep表示该列边缘插值点的计算步长。
由于插值过程并不能够在原图像上直接插入像素点,因此需要另外申请一个大的存储空间(大小为原图像的m*n倍),然后在该存储空间上进行填值得到新的图像。因此,对于任意宽度为X个像素点,高度为Y个像素点的图像,宽高分别放大n、m整数倍的线性插值过程如图6所示:
首先申请一个大小为原图像m*n倍的存储空间,设置像素点行坐标计算器的计数值为w,列坐标计算器的计数值为h;若原图像在宽度方向有X个像素点,高度方向有Y个像素点,则执行下列步骤:
A1、计数器清零,使w=0,h=0;
A2、判断h是否小于(Y-1),若是,执行步骤A3,否则,转至步骤A6;
A3、判断w是否小于(X-1),若是,执行步骤A4,否则,使h=h+1,w=0;转至步骤A2;
A4、从原图像存储空间中的如下A位置、B位置、C位置和D位置获取相邻四个像素点的像素值:
A位置=h*X+w;
B位置=A位置+w+1;
C位置=A位置+X;
D位置=C位置+X;
取得原图像四个相邻点的对应像素值后,根据公式(4)计算出该四个相邻点的中间插值点的像素值Vij,填入新图像存储空间的对应位置中;继续步骤A5;
A5、使w=w+1,转至步骤A3;
A6、根据公式(7)计算出所有水平边缘插值点的像素值,填入新图像存储空间的对应位置中;
A7、根据公式(7)计算出所有垂直边缘插值点的像素值,填入新图像存储空间的对应位置中。
输出计算出的全部中间插值点、边缘插值点的相应像素值,得到在宽度方向放大n倍,在高度方向放大m倍的新图像。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求书的保护范围为准。