亚像素

来源:百度文库 编辑:神马文学网 时间:2024/04/27 16:43:08

亚像素

  英文名:Sub Pixel  定义:  面阵摄像机的成像面以像素为最小单位。例如某CMOS摄像芯片,其像素间距为5.2微米。摄像机拍摄时,将物理世界中连续的图像进行了离散化处理。到成像面上每一个像素点只代表其附近的颜色。至于“附近”到什么程度?就很困难解释。两个像素之间有5.2微米的距离,在宏观上可以看作是连在一起的。但是在微观上,它们之间还有无限的更小的东西存在。这个更小的东西我们称它为“亚像素”。实际上“亚像素”应该是存在的,只是硬件上没有个细微的传感器把它检测出来。于是软件上把它近似地计算出来。  计算:  数码摄像机的成像面的分辨率以像素数量来衡量。隔行TV的分辨率是576x768个像素。 像素中心之间的距离有几个至十几个微米不等。为了最大限度利用图像信息来提高分辨率,有人提出了Sub-Pixel概念。意思是说,在两个物理像素之间还有像素,称之为Sub-Pixel,它完全是通过计算方法的出来的。这里提出计算方法。  如果原始图像是n行m列的,希望做k细分的Sub-Pixel,这样就有新的行N和列M,有  N = k*n  M = k*m  原来相邻4个像素包含的区域现在变成了(k+1)*(k+1)的区域了;要填满这个(k+1)*(k+1)的区域,实际上就是从一个小正方形映照到一个大正方形的过程。在数学上用双线性插值得算法可以轻松搞定。(二次或者三次样条曲线)。下面是算法的代码:  XYPNT qdot(  XYPNT d[4], //d[4] 顺时针排列  XYPNT a //含有要插入的点的位置  ){  XYPNT r; //工作单元  int i;  float x0,y0,x1,y1; //  PNT z[4];  float ap,bt,ax,ay;  x0=d[0].q.x;y0=d[0].q.y;  x1=d[2].q.x;y1=d[2].q.y;  r=a;  ax=a.q.x;ay=a.q.y;  for(i=0;i<4;i++)z[i]=d[i].pnt;  ap=(ax-x0)/(x1-x0);bt=(ay-y0)/(y1-y0);  r.pnt.r=(1.-ap)*(1.-bt)*z[0].r+bt*(1.-ap)*z[3].r+ap*(1.-bt)*z[1].r+ap*bt*z[2].r;  r.pnt.g=(1.-ap)*(1.-bt)*z[0].g+bt*(1.-ap)*z[3].g+ap*(1.-bt)*z[1].g+ap*bt*z[2].g;  r.pnt.b=(1.-ap)*(1.-bt)*z[0].b+bt*(1.-ap)*z[3].b+ap*(1.-bt)*z[1].b+ap*bt*z[2].b;  return r;  }  其中数据结构:  struct PNT{BYTE b,g,r;}; //像素的颜色  struct DXY{short x,y;}; //像素的坐标  struct XYPNT{ //像素的全信息  DXY q;  PNT pnt;};  调用示例:  for(i=0;i