反走样技术

直线扫描转换算法在处理非水平、非垂直且非45°的直线段时会出现锯齿,这是因为直线段在光栅扫描显示器上显示的图像是由一系列亮度相同而面积不为零的离散像素点构成的。这种由离散量表示连续量而引起的失真称为走样(aliasing)。用于减轻走样现象的技术称为反走样(anti-aliasing,AA)或者抗锯齿。走样是理想直线(理想直线宽度为零)扫描转换后(真实像素点面积不为零)的必然结果。走样是光栅扫描显示器的一种固有现象,不可避免,只能减轻。
反走样技术主要分为两类:一类是硬件技术,通过提高显示器的分辨率来实现;另一类是软件技术,通过改进软件算法来实现
从硬件角度把显示器的分辩率提高了一倍。由于每个锯齿在x方向和y方向都只有原先分辨率的一半,所以看上去走样现象有所改善。虽然如此,硬件反走样技术由于受到硬件条件和成本的限制,实现起来较为困难,很难达到理想的反走样效果。
软件反走样技术主要是加权区域采样。算法的实质是利用人眼视觉特性,通过加权平均的方法,调节像素的亮度和灰度,以产生模糊的边界,从而达到较好的视觉效果以消除 “锯齿”。加权参数可以选择距离、面积和体积等。下面主要讲解直线的距离加权反走样算法,关于面积加权和体积加权反走样算法请读者参考相关文献。

Wu反走样算法

这里写图片描述
Wu反走样算法是采用空间混色原理来对走样进行修正。空间混色原理指出,人眼对某一区域颜色的识别是取这个区域颜色的平均值。Wu反走样算法原理是对于理想直线上的任一点,同时以两个不同亮度级别的相邻像素来表示。理想直线段上的点Q1,扫描转换后可用像素点P1和像素点P4以不同的亮度级别共同显示,像素点离理想直线段越近,其亮度值越小,像素越暗;像素点离理想直线段越远,其亮度值就越大,像素越亮,但二者的亮度级别之和等于像素Q1的灰度值。

构造距离误差项

这里写图片描述
斜率为k的理想直线段与 P u P d 像素中心连线的交点为 Q i ( x i + 1 , e i e i Q i P d 的距离。

  • P d ( x i + 1 , y i ) 像素的亮度级别为: c d = R G B ( e i × 255 , e i × 255 , e i × 255 )
  • P u ( x i + 1 , y i + 1 ) 像素的亮度级别为: c u = R G B ( ( 1 e i ) × 255 , ( 1 e i ) × 255 , ( 1 e i ) × 255 )

每右移一个像素, e i + 1 = e i + k 。当 e i 1.0 时, y i + 1 = y i + 1 e i + 1 = e i 1

CPoint p0(-100,-50),p1(200,50),p;
int dx,dy;
dx=p1.x-p0.x;
dy=p1.y-p0.y;
double k=(double)dy/dx,e;
for(p=p0,e=0;p.x<p1.x;p.x++)//不包括终点p1
{
    pDC->SetPixelV(p.x, p.y,RGB(e*255,e*255,e*255));
    pDC->SetPixelV(p.x, p.y+1,RGB((1-e)*255,(1-e)*255,(1-e)*255));      e+=k;
    if(e>=1.0)
    {
        p.y++;
        e--;
    }                    
}

彩色直线段的反走样

因为Wu反走样算法是从前景色过渡到背景色,彩色直线段的反走样需要考虑背景色的影响。设直线段的前景色(foreground color)为cf,背景色(background color)为cb。彩色直线段的反走样是从前景色变化到背景色,出现模糊边界。绘制光滑过渡的彩色直线段时,需要使用以下公式进行前景色线性插值
c = ( 1 t ) c 0 + t c 1
式中, c 为颜色渐变直线段上任一点的颜色; c 0 为直线段起点的颜色; c 1 为直线段终点的颜色。

猜你喜欢

转载自blog.csdn.net/jxch____/article/details/80724565