成都创新互联网站制作重庆分公司

数字图像缩放之双三次插值

基本原理:双三次插值是一种更加复杂的插值方式,它能创造出比双线性插值更平滑的图像边缘。缩放后图像中某个象素的象素值是由源图像相应像素附近的(4 x 4)个邻近象素值计算出来的,即通过一个基函数进行拟合得到一个目的像素值,具体某点v(x,y) 的像素值是使用下式计算得到:

创新互联公司主要从事成都网站设计、做网站、网页设计、企业做网站、公司建网站等业务。立足成都服务菏泽,10年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18982081108

v(x,y) =∑∑aij*x^i*y^j;其中,0≤i,j≤3;16个系数aij由16个临近像素写出的未知方程确定。

C/C++实现如下:

void GeometryTrans::Zoom(float ratioX, float ratioY)
{
	
	//释放旧的输出图像缓冲区
	if(m_pImgDataOut!=NULL){
		delete []m_pImgDataOut;
    	m_pImgDataOut=NULL;
	}
    
	//输出图像的宽和高
	m_imgWidthOut=int(m_imgWidth*ratioX+0.5) ;
	m_imgHeightOut=int(m_imgHeight*ratioY+0.5); 

	//输入图像每行像素字节数
	int lineByteIn=(m_imgWidth*m_nBitCount/8+3)/4*4;
	
	//输出图像每行像素字节数
    int	lineByteOut=(m_imgWidthOut*m_nBitCount/8+3)/4*4;

	//申请缓冲区,存放输出结果
	
	m_pImgDataOut=new unsigned char[lineByteOut*m_imgHeightOut];

	//每像素字节数,输入图像与输出图像相同
	int pixelByte=m_nBitCount/8;
	

	//输出图像在输入图像中待插值的位置坐标
	int coordinateX, coordinateY;
	
	//循环变量,输出图像的坐标
	int i,j;
	
	//循环变量,像素的每个通道
	int k;
	//**************************************************************
	//对原图像进行拓展,上下分别拓展两行,左右分别拓展两列
	if(m_pImgData_temp!=NULL){
		delete []m_pImgData_temp;
    	m_pImgData_temp=NULL;
	}
	//拓展图像每行像素字节数
	int lineByteIn1=((m_imgWidth+4)*m_nBitCount/8+3)/4*4;
	//申请缓冲区,存放拓展后的图像
	
	m_pImgData_temp=new unsigned char[lineByteIn1*(m_imgHeight+4)];

	for(k=0;k=0&&coordinateY<(m_imgHeight))
			{
			    for(k=0;k

基函数实现如下

loat GeometryTrans::Sinc(float x) /*Sinc(x)是对 Sin(x*Pi)/x 的逼近(Pi是圆周率——π)*/
{
  if(abs(x)>=0&&abs(x)<1)
   return (1-2*abs(x)*abs(x)+abs(x)*abs(x)*abs(x));
  else
     if(abs(x)>=1&&abs(x)<2)
      return (4-8*abs(x)+5*abs(x)*abs(x)-abs(x)*abs(x)*abs(x));
     else  
       return 0;
}

矩阵内积计算函数实现如下

float GeometryTrans::ABC(float a[],double b[],float c[]) /*矩阵运算函数,求得像素值,内积*/
{
  int i,j;
  float abc=0;
  float tmp[4];
  for(i=0;i<4;i++)
    tmp[i]=0;
  for(i=0;i<4;i++)
     for(j=0;j<4;j++)
      tmp[i]+=a[j]*b[j*4+i];
  for(i=0;i<4;i++)
    abc+=tmp[i]*c[i];
  if (abc<0)
	  abc=0;
  if (abc>255)
	  abc=255;
  return abc;  
}

网页标题:数字图像缩放之双三次插值
标题路径:http://cxhlcq.com/article/jdpscc.html

其他资讯

在线咨询

微信咨询

电话咨询

028-86922220(工作日)

18980820575(7×24)

提交需求

返回顶部