假设我们有一个很简单的图片,图片只有4个像素(2*2)A B
C D   现在我们要把这个图片插值到9个像素:3*3A ab B
ac abcd bd
C cd D   其中大写的字母代表原来的像素,小写字母代表插值得到的新像素。  想必看到这个图,大家心里已经有了这个算法了。ab=(A+B) / 2 
cd=(C+D) / 2
ac=(A+C) / 2
bd=(B+D) / 2
abcd=(ab+cd) / 2=(A+B+C+D) / 4   推导:ab= A + (B-A) / 2
cd=C +(D-C) / 2
...   很简单,对吧,先从一个方向把只涉及两个原始像素的新像素算出来。我们这里假定先计算水平方向。而在算垂直方向的插值的时候,因为ab和cd已经在前面算好了,所以abcd的计算也和计算ac和bd没有任何区别了。  有可能为有朋友已经想到把原来的图像插值到4*4或5*5的方法了。A ab1 ab2 B
ac1 ab1cd11 ab2cd21 bd1
ac2 ab1cd12 ab2cd22 bd2
C cd1 cd2 D   推导:ab1 = A + (B-A) * 1 / 3 
ab2 = A + (B-A) * 2 / 3 =ab1+(B-A) / 3
cd1 = C + (D-C) * 1 / 3
cd1 = C + (D-C) * 2 / 3 =cd1+(D-C) / 3
...    以A和B为例,先求出原始像素的差(A-B)再算出每一步的递增量(A-B) / 3;然后每一个新的点就是在前面那个点的值加上这个递增量就是了。  这里我们假设A=100, B=255 放大倍率为3,水平方向插值;先计算出原始像素的差:(B-A) = 255-100 =155  再计算出水平方向每一步的递增量:(A-B) / 3=155 / 3 = 51.7  这里我们用一个变量DRt来记录这个递增量(这里只用红色来做例子) ab1 = A + DRt = 100+51.7 =151
ab2 = ab1 + DRt = 151+51.7 = 202 
上面这个算法好像挺容易懂的...但实际上还是不明白,请问高手们:一个100*100的图片,已经将图片的RGB值分别存入三个数组中,然后用二次插值算法放大成150*150的图片,怎么样插值?详细解释一下,怎么样得到结果存入新的RGB数组中...我生成的图片显示出来是一堆乱七八糟的像素点....

解决方案 »

  1.   

    应该是RGB三原色都分别内插。
      

  2.   

    应该用到临界的像素值,如ABC 可以用a=A+B/2;b=B+C/2;c=C+*/2。依次下去就可以了!
      

  3.   

    找到新dib象素起始位置针对图象每行进行计算
    x位置的插值计算公式
    y位置的插值计算公式
    需判断是否在图象范围内
      

  4.   

    pDC->TextOut(0,40,a);
    for(j=0;j<bmpHeight;j++)//高
    {
    CurR=Rarray[j][0];//----->原坐标(0,0)的R值
    CurG=Garray[j][0];//----->原坐标(0,0)的G值
    CurB=Garray[j][0];//----->原坐标(0,0)的B值
    // for(i=0;i<StretchWidth-1;i++)//从第一个0开始
    for(i=0;i<bmpWidth-1;i++)
    {
    NxtStep=CurStep+bmpAllBl;
    Xb=CurStep;
    Xe=NxtStep;
    N=Xe-Xb;
    TmpRarray[j][Xb]=CurR;
    TmpGarray[j][Xb]=CurG;
    TmpBarray[j][Xb]=CurB;
    M=i+1;//这里要加1,为这行的下一个象素的值,所以循环时-1
    NxtR=Rarray[j][M];
    NxtG=Garray[j][M];
    NxtB=Barray[j][M];
    if(N>1)//如果步长大于1的话,中间要插值
    {
    DRt=(NxtR-CurR)*NegN;
    DGt=(NxtG-CurG)*NegN;
    DBt=(NxtB-CurB)*NegN;
    DR=0;
    DG=0;
    DB=0;
    for(L=Yb+1;L<Ye-1;L++)//当前步长到下个步长-1
    {
    DR=DR+DRt;
    DG=DG+DGt;
    DB=DB+DBt;
    TmpRarray[j][L]=CurR+DR;
    TmpGarray[j][L]=CurG+DG;
    TmpBarray[j][L]=CurB=DB;
    }
    }
    CurStep=NxtStep;
    CurR=NxtR;
    CurG=NxtG;
    CurB=NxtB;
    }
    TmpRarray[j][StretchHeight]=NxtR;//第行最后一个象素的值
    TmpGarray[j][StretchHeight]=NxtG;
    TmpBarray[j][StretchHeight]=NxtB;
    }
    NegN=(float)1.0/(int)(bmpAllBl+1);//纵方向的象素插值
    for(i=0;i<StretchWidth;i++)
    {
    CurR=TmpRarray[0][i];
    CurG=Garray[0][i];
    CurB=Barray[0][i];
    // CurR=Rarray[0][i];
    // CurG=Garray[0][i];
    // CurB=Barray[0][i];
    CurStep=0;
    NxtStep=0;
    for(j=0;j<bmpHeight-1;j++)
    {
    NxtStep=CurStep+bmpAllBl;
    Yb=CurStep;
    Ye=NxtStep;
    N=Ye-Yb;
    NewRarray[Yb][i]=CurR;
    NewGarray[Yb][i]=CurG;
    NewBarray[Yb][i]=CurB;
    M=i+1;
    NxtR=TmpRarray[M][i];
    NxtG=TmpGarray[M][i];
    NxtB=TmpBarray[M][i];
    if(N>1)
    {
    DRt=(NxtR-CurR)*NegN;
    DGt=(NxtG-CurG)*NegN;
    DBt=(NxtB-CurB)*NegN;
    DR=0;
    DG=0;
    DB=0;
    for(L=Yb+1;L<Ye-1;L++)
    {
    DR=DR+DRt;
    DG=DG+DGt;
    DB=DB+DBt;
    NewRarray[L][i]=CurR+DR;
    NewGarray[L][i]=CurG+DG;
    NewBarray[L][i]=CurB+DB;
    }
    }
    CurStep=NxtStep;
    CurR=NxtR;
    CurG=NxtG;
    CurB=NxtB;
    }
    NewRarray[StretchHeight][i]=NxtR;
    NewGarray[StretchHeight][i]=NxtG;
    NewBarray[StretchHeight][i]=NxtB;
    }