假设我们有一个很简单的图片,图片只有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数组中...我生成的图片显示出来是一堆乱七八糟的像素点....
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数组中...我生成的图片显示出来是一堆乱七八糟的像素点....
解决方案 »
- MFC做了一个密码登陆框,如何使其和一个txt文档(或者别的文件)绑定??
- 有没有人配置过opencv2.2??
- 如何改变Check Box小勾的图标,进来帮帮我吧
- 我用DirectShow来捕获摄像头,我用了视频编码了,但为什么每次回调的帧大小都是230400?
- WinMain里面怎么多线程啊
- 用OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult进行重绘,每次重绘屏幕会有轻微的闪动
- 为什么自造字无法在MFC的文本框里显示不出来?
- 从Access里读取状态信息 是否跳过记录
- 大家讨论一下,UDP使用完成端口是否有意义?
- ClistBox或CListCtrl一个项目能显示多行文本吗?
- ado 新增记录?
- Dialog中,新手想找一个能显示结果的控件,
x位置的插值计算公式
y位置的插值计算公式
需判断是否在图象范围内
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;
}