亚像素相关概念

来源:互联网 发布:python 相似度算法 编辑:程序博客网 时间:2024/04/29 05:05


本文转自:http://blog.csdn.net/jtli_embeddedcv/article/details/10088759

亚像素

转自:http://blog.csdn.net/tingthing2008/article/details/6501849

  英文名: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<HEight;i++)for(j=0;j<WIdth;j++){
  d[0].q.x=j*xf ; d[0].q.y=i*xf; d[0].pnt=*(buf+i*WIdth+j);
  d[1].q.x=(j+1)*xf; d[1].q.y=i*xf; d[1].pnt=*(buf+i*WIdth+j+1);
  d[2].q.x=(j+1)*xf; d[2].q.y=(i+1)*xf; d[2].pnt=*(buf+(i+1)*WIdth+j+1);
  d[3].q.x=j*xf ; d[3].q.y=(i+1)*xf; d[3].pnt=*(buf+(i+1)*WIdth+j);
  for(i0=0;i0<xf;i0++)for(j0=0;j0<xf;j0++){
  aa.q.x=j*xf+j0;aa.q.y=i*xf+i0;
  rr=qdot(d,aa);
  *(Buf+aa.q.y*WIDTH+aa.q.x)=rr.pnt;
  }
  }
  其中xf是插入亚像素的个数,也即放大倍数;Height和Width是原始图像的尺寸;HEIGHT和WIDTH是方大xf倍的尺寸;原始图片存放在buf中,目标图片存放在Buf中。
  亚像素的精度:
  亚像素精度是指相邻两像素之间细分情况。输入值通常为二分之一,三分之一或四分之一。这意味着每个像素将被分为更小的单元从而对这些更小的单元实施插值算法。例如,如果选择四分之一,就相当于每个像素在横向和纵向上都被当作四个像素来计算。因此,如果一张5x5像素的图像选择了四分之一的亚像素精度之后,就等于创建了一张16x16的离散点阵,进而对该点阵进行插值。请参考下图,红色的点代表本来的像素点,黑色点代表新产生的亚像素点。

亚像素算法亚像素算法的基本思路就是将一个像素再分为更小的单位。

也就是说1个像素的灰度值分为256级。所以,以这类系统为例,进行亚像素计算就要把像素分为255个小单位。 或许,可以这样来理解“亚像素算法”。一个像素的灰度值从0到255,0是纯黑,255是纯白。不妨把像素想像成是一个由255个小像素所组成的集合。而每个小像素都是一个独立的小镜子,那就是说一个像素里面有255个小镜子。

灰度值则可以看作反光的小镜子数量:0表示255个小镜子全都没有反光;255表示255个镜子一起反光。上面讲到的所设定的临界灰度值100,则可表示255个镜子中有100个在反光,另外155个镜子没有反光。 现在,回到上面的测量例子中来。

如何算亚像素值呢?非常简单,亚像素值(白色部分)=该像素灰度值/256;亚像素值(黑色部分)=1-亚像素值(白色部分)。

另外,除了这种计算方法,还有其他几种计算亚像素值的方法:

(1)亚像素值(白色部分)=(该像素灰度值×(临界灰度值/256))/256 亚像素值(黑色部分)=1-亚像素值(白色部分)

(2)亚像素值(白色部分)=后像素值/ (前像素值 +后像素值)亚像素值(黑色部分)=1-亚像素值(白色部分)

(3)亚像素值(白色部分)=(像素值-前像素值)/ (后像素值-前像素值) 亚像素值(黑色部分)=1-亚像素值(白色部分)

以上就是亚像素算法的基本原理。

在结束这个算法讨论之前,有两点必须注意:一是在实际情况下,大家不可能看到像素的一半是黑色另一半是白色,这只是为了方便大家理解所画出来的,而真实的情况是一个像素就只是一小块灰色,没有明暗的分别。明暗的区别只能在像素与像素间显现出来;二是在描述亚像素的基本算法时,所说“小镜子”的概念完全是为了方便大家理解,比纯数学语言表达更为易懂。

 

NI-Vision的亚像素精度(Subpixel Accuracy) 主要软件: Vision Development Module 主要软件版本: 1.0 主要软件修正版本:  
次要软件: N/A 
 
问题: Vision Development Module中的许多处理VI的输出都具有亚像素精度,这是什么意思呢?  
解答: 许多图像处理VI都用到了边沿检测(Edge Detection)作为复杂计算的基础,因此这篇文档将主要针对边沿检测来解释亚像素精度。几乎所有的图像处理算法都是对图像(可以认为是一个大的数值矩阵)采用某种数值算法,通常这种数值计算的结果都不是整数。这是最简单的理解亚像素精度的方式。然后有些VI具有输入端,可以允许用户指定亚像素精度(Subpixel Accuracy)。 

 
以IMAQ Edge Tool VI为例,有个输入参数是Subpixel Information,这是一个包含Interpolation Type(插值类型)和Subpixel Accuracy(亚像素精度)等输入的簇。NI Vision使用插值的方法来定位一个边界。Interpolation Type参数有两种选择,Quadratic(二次的)和Cubic Spline(三次样条)。寻找边界的第一件事是获得边沿强度分布(edge strength profile),本质上来说就是像素值相对其位置的函数。二次插值通过三个相邻的边沿强度值找到其拟合抛物线,该曲线的极大值点或极小值点就代表了边沿插值点的位置和强度值,该点的位置通常不是整数。三次样条插值也是类似的原理,只不过插值过程是基于相邻的四个像素。  
Subpixel Information簇中的另一个输入是Subpixel Accuracy。输入值通常为二分之一,三分之一或四分


之一。这意味着每个像素将被分为更小的单元从而对这些更小的单元实施插值算法。例如,如果选择四分之一,就相当于每个像素在横向和纵向上都被当作四个像素来计算。因此,如果一张5x5像素的图像选择了四分之一的亚像素精度之后,就等于创建了一张16x16的离散点阵,进而对该点阵进行插值。请参考下图,红色的点代表本来的像素点,黑色点代表新产生的亚像素点。 
  
如果subpixel accuracy参数选择为None,就表示只利用原来的像素点构成点阵。尽管如此,结果仍然很可能不是整数,因为尽管没有产生更大的点阵,但插值算法仍然是二次的或三次样条算法,只不过算法执行的对象是小一些的矩阵而已。 

 
NI-Vision提供的亚像素精度是很有用的,计算的数值将比整数值更为精确。如果需要边沿监测的结果为整数值,可以把返回的小数值近似为最接近的整数。如果需要了解更多信息,请参考NI Vision Concepts Manual.

0 0
原创粉丝点击