缩放图像的双线性内插法

今天将图像缩放的双线性内插法弄完了,主要的思想如下:

对于一个目的像素,通过目标图像与源图像的比值进行反向变换得到一个浮点坐标,如fx(x+u,y+v)其中为非负整数,u,v为区间[0,1]上的浮点数。则目的像素的颜色值可以由源图像的点fx(x,y)与其相邻的四个点的颜色值决定。

公式为:fx(x+u,y+v)=(1-u)(1-v)fx(x,y)+(1-u)(v)fx(x,y+1) +(u)(1-v)fx(x+1,y)+uvfx(x+1,y+1);

下面是我自己写的一个缩放图像的函数。

void CTestView::Linear_BMP(COLORREF **DesImage,double DesWidth,double DesHeight,COLORREF **SrcImage ,double SrcWidth,double SrcHeight)
{	
	if(SrcImage == NULL)
		return;
	DesImage=new COLORREF*[(int)DesHeight];
	for(int n1=0;n1<DesHeight;n1++)
		DesImage[n1]=new COLORREF[(int)DesWidth];
	double w = (double)SrcWidth/(double)DesWidth;//源/目标=比例
	double h = (double)SrcHeight/(double)DesHeight;
	double u,v;
	double Sx,Sy;
	double pm[4];
	int tx,ty;
	int red[4],green[4],blue[4];
	double r=0,g=0,b=0;
	for(int i = 0; i < DesHeight; i++)
	{
		Sy = (double)(i) * h;
		ty = (int)Sy;
	
		v = fabs(Sy - ty);
		for(int j = 0; j<DesWidth; j++)
		{
		
			Sx = (double)(j) * w ;
			tx = (int)Sx;
		
			u = fabs(Sx - tx);
			pm[0] = ( 1.0 - u ) * ( 1.0 - v );
			pm[1] = v * ( 1.0 - u );
			pm[2] = u * ( 1.0 - v );
			pm[3] = u * v;
			if(tx>=SrcWidth - 2)
				tx = SrcWidth - 2;
			if(ty>=SrcHeight - 2)
				ty = SrcHeight - 2;
			red[0] = GetRValue(SrcImage[ty][tx]);
			red[1] = GetRValue(SrcImage[ty+1][tx]);
			red[2] = GetRValue(SrcImage[ty][tx+1]);
			red[3] = GetRValue(SrcImage[ty+1][tx+1]);
			
			green[0] = GetGValue(SrcImage[ty][tx]);
			green[1] = GetGValue(SrcImage[ty+1][tx]);
			green[2] = GetGValue(SrcImage[ty][tx+1]);
			green[3] = GetGValue(SrcImage[ty+1][tx+1]);

			blue[0] = GetBValue(SrcImage[ty][tx]);
			blue[1] = GetBValue(SrcImage[ty+1][tx]);
			blue[2] = GetBValue(SrcImage[ty][tx+1]);
			blue[3] = GetBValue(SrcImage[ty+1][tx+1]);
			r = 0;
			g = 0;
			b = 0;
			for(int m = 0;m<4;m++)
			{
				r += pm[m] * red[m];
				g += pm[m] * green[m];
				b += pm[m] * blue[m];
			}
		//	DesImage[i][j] = pm[0] * SrcImage[ty][tx] + pm[1] * SrcImage[ty][tx+1] + pm[2] * SrcImage[ty+1][tx] + pm[3] * SrcImage[ty+1][tx+1];
		//	DesImage[i][j] = SrcImage[ty][tx];
			DesImage[i][j] = RGB(r,g,b);
		//	DesImage[i][j] =  (SrcImage[ty][tx]+SrcImage[ty][tx+1]+ SrcImage[ty+1][tx]+SrcImage[ty+1][tx+1])/4;
		}
	}
	
	LImage = DesImage;
}




  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值