注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Kandy

长风破浪会有时,直挂云帆济沧海!

 
 
 

日志

 
 

数字图像插值算法  

2010-08-19 20:22:48|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

(1)最近邻点法

对于二维图像.该法是“取待采样点周围4个相邻像素点中距离最近的1个邻点的灰度值作为该点的灰度值”。此算法虽然计算简单,但由于仅用对该采样点影响最大的(即最近的)像素的灰度值作为该点的值,而没有考虑其他相邻像素的影响(相关性),因此重新采样后的图像灰度值有明显的不连续性,像质损失较大。

(2)双线性内插法

作为对最近邻点法的一种改进,这种方法是“利用周围4个邻点的灰度值在两个方向上作线性内插以得到待采样点的灰度值”。即根据待采样点与相邻点的距离确定相应的权值计算出待采样点的灰度值。双线性内插的示意图如图所示,其中 x,y坐标表示像素的位置,f(*,*)表示像素的灰度值。

                                                  

数字图像插值算法 - Kandy - Kandy
(3)立方卷积法
作为对双线性内插法的改进,即“不仅考虑到四个直接邻点灰度值的影响,还考虑到各邻点间灰度值变化率的影响”,立方卷积法利用了待采样点周围更大邻域内像素的灰度值作三次插值。此法利用了如图3所示的三次多项式5(w)。s( w)的数学表达式为:
数字图像插值算法 - Kandy - Kandy
式中w叫为自变量;s( w)为三次多项式的值。
如图4所示的是用三次多项式进行内插的方法,
数字图像插值算法 - Kandy - Kandy
 
计算时利用周围16个邻点的灰度值按下式进行内插,则该像素的灰度值f(x,y)为
数字图像插值算法 - Kandy - Kandy
数字图像插值算法 - Kandy - Kandy
 
 
 算法实现如下:
//立方卷积插值算法
//f(x,y)=A*B*C
//矩阵乘法
inline double MatrixMutiple(double A[4],double B[4][4],double C[4])
{
 double dResult=0.0;
 double dTemp;
 for(int i=0;i<4;i++)
 {
  dTemp=0.0;
  for (int j=0;j<4;j++)
  {
   dTemp+=A[j]*B[j][i];
  }
  dResult+=C[i]*dTemp;
 }
 return dResult;
}
inline double MySin(double x)
{
 double absx;
 absx=fabs((double)x);
 if(absx<1)   
 {
  return (1-2*pow(absx,2)+pow(absx,3));
 }
 else if( absx <= 2 )
 {
  return (4-8*absx+5*pow(absx,2)-pow(absx,3));
 }
 else
 {
  return 0;
 }
}
//nChannel:为通道个数
//nType:值为0,1,2对应R,G,B三个通道
inline double CubicValue(PBYTE lpDIBBits, int lLineBytes, int lHeight, double j0, double i0, int nType, int nChannel)
{
 double i,j; //在原像素中对应的整数部分
 double u,v; //在原像素中对应的小数部分
 int m,n;    //循环变量
 double A[4]; //用来做卷积的三个矩阵
 double B[4][4];
 double C[4];  
 i=(double)((int)i0);
 j=(double)((int)j0);
 u=i0-i;
 v=j0-j;
 for (m=0;m<4;m++)
 {
  A[m]=MySin(u-m+1);
  C[m]=MySin(v-m+1);
  for (n=0;n<4;n++)
  {
   int nHeight = ((int)i+(m-1));
   if ( nHeight < 0 )
   {
    nHeight = 0;
   }
   if ( nHeight > lHeight - 1)
   {
    nHeight = lHeight - 1;
   }
   int nWidthByte = (int)((j+n-1)*nChannel);
   if ( nWidthByte < 0 )
   {
    nWidthByte = 0;
   }
   if ( nWidthByte > (lLineBytes -  nChannel) )
   {
    nWidthByte = (lLineBytes -  nChannel);
   }
   B[m][n]=(*(lpDIBBits + lLineBytes * (lHeight- 1 - nHeight) + nWidthByte + nType));  
  }
 }
 return MatrixMutiple(A,B,C);
}
  评论这张
 
阅读(712)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017