关于反走样算法

fromccsu 2008-12-23 02:29:02
各位大侠,麻烦帮小弟看一下下面的WU反走样算法的每个点灰度值究竟是怎么算的,我看到是斜率×( rb - rl ) + rl ),不知道表示什么意思?
代码如下:
void DrawWuLine( CDC *pDC, int X0, int Y0, int X1, int Y1, COLORREF clrLine )//clrline表示要画线的颜色
{ pDC->SetPixel( X0, Y0, clrLine );
int XDir, DeltaX = X1 - X0;
if( DeltaX >= 0 ) {
XDir = 1; }
else {
XDir = -1;
DeltaX = 0 - DeltaX; /* make DeltaX positive */
}
XDir = 1;
unsigned short ErrorAdj;
unsigned short ErrorAccTemp, Weighting;

/* Line is not horizontal, diagonal, or vertical */
unsigned short ErrorAcc = 0; /* initialize the line error accumulator to 0 */

BYTE rl = GetRValue( clrLine );
BYTE gl = GetGValue( clrLine );
BYTE bl = GetBValue( clrLine );
double grayl = rl * 0.299 + gl * 0.587 + bl * 0.114;

/* Is this an X-major or Y-major line? */
if (DeltaY > DeltaX)
{
/* Y-major line; calculate 16-bit fixed-point fractional part of a
pixel that X advances each time Y advances 1 pixel, truncating the
result so that we won't overrun the endpoint along the X axis */
ErrorAdj = ((unsigned long) DeltaX << 16) / (unsigned long) DeltaY;
/* Draw all pixels other than the first and last */
while (--DeltaY) {
ErrorAccTemp = ErrorAcc; /* remember currrent accumulated error */
ErrorAcc += ErrorAdj; /* calculate error for next pixel */
if (ErrorAcc <= ErrorAccTemp)
{
/* The error accumulator turned over, so advance the X coord */
X0 += XDir;
}
Y0++; /* Y-major, so always advance Y */
/* The IntensityBits most significant bits of ErrorAcc give us the
intensity weighting for this pixel, and the complement of the
weighting for the paired pixel */
Weighting = ErrorAcc >> 8;
ASSERT( Weighting < 256 );
ASSERT( ( Weighting ^ 255 ) < 256 );

COLORREF clrBackGround = ::GetPixel( pDC->m_hDC, X0, Y0 );
BYTE rb = GetRValue( clrBackGround );
BYTE gb = GetGValue( clrBackGround );
BYTE bb = GetBValue( clrBackGround );
double grayb = rb * 0.299 + gb * 0.587 + bb * 0.114;

BYTE rr = ( rb > rl ? ( ( BYTE )( ( ( double )( grayl<grayb?Weighting:(Weighting ^ 255)) ) / 255.0 * ( rb - rl ) + rl ) ) : ( ( BYTE )( ( ( double )( grayl<grayb?Weighting:(Weighting ^ 255)) ) / 255.0 * ( rl - rb ) + rb ) ) );
BYTE gr = ( gb > gl ? ( ( BYTE )( ( ( double )( grayl<grayb?Weighting:(Weighting ^ 255)) ) / 255.0 * ( gb - gl ) + gl ) ) : ( ( BYTE )( ( ( double )( grayl<grayb?Weighting:(Weighting ^ 255)) ) / 255.0 * ( gl - gb ) + gb ) ) );
BYTE br = ( bb > bl ? ( ( BYTE )( ( ( double )( grayl<grayb?Weighting:(Weighting ^ 255)) ) / 255.0 * ( bb - bl ) + bl ) ) : ( ( BYTE )( ( ( double )( grayl<grayb?Weighting:(Weighting ^ 255)) ) / 255.0 * ( bl - bb ) + bb ) ) );
pDC->SetPixel( X0, Y0, RGB( rb, gb, bb ) );

clrBackGround = ::GetPixel( pDC->m_hDC, X0 + XDir, Y0 );
rb = GetRValue( clrBackGround );
gb = GetGValue( clrBackGround );
bb = GetBValue( clrBackGround );
grayb = rb * 0.299 + gb * 0.587 + bb * 0.114;

rr = ( rb > rl ? ( ( BYTE )( ( ( double )( grayl<grayb?(Weighting ^ 255):Weighting) ) / 255.0 * ( rb - rl ) + rl ) ) : ( ( BYTE )( ( ( double )( grayl<grayb?(Weighting ^ 255):Weighting) ) / 255.0 * ( rl - rb ) + rb ) ) );
gr = ( gb > gl ? ( ( BYTE )( ( ( double )( grayl<grayb?(Weighting ^ 255):Weighting) ) / 255.0 * ( gb - gl ) + gl ) ) : ( ( BYTE )( ( ( double )( grayl<grayb?(Weighting ^ 255):Weighting) ) / 255.0 * ( gl - gb ) + gb ) ) );
br = ( bb > bl ? ( ( BYTE )( ( ( double )( grayl<grayb?(Weighting ^ 255):Weighting) ) / 255.0 * ( bb - bl ) + bl ) ) : ( ( BYTE )( ( ( double )( grayl<grayb?(Weighting ^ 255):Weighting) ) / 255.0 * ( bl - bb ) + bb ) ) );
pDC->SetPixel( X0 + XDir, Y0, RGB( rr, gr, br ) );
}
/* Draw the final pixel, which is always exactly intersected by the line
and so needs no weighting */
pDC->SetPixel( X1, Y1, clrLine );
return;
}
/* It's an X-major line; calculate 16-bit fixed-point fractional part of a
pixel that Y advances each time X advances 1 pixel, truncating the
result to avoid overrunning the endpoint along the X axis */
ErrorAdj = ((unsigned long) DeltaY << 16) / (unsigned long) DeltaX;
/* Draw all pixels other than the first and last */
while (--DeltaX) {
ErrorAccTemp = ErrorAcc; /* remember currrent accumulated error */
ErrorAcc += ErrorAdj; /* calculate error for next pixel */
if (ErrorAcc <= ErrorAccTemp)
{
/* The error accumulator turned over, so advance the Y coord */
Y0++;
}
X0 += XDir; /* X-major, so always advance X */
/* The IntensityBits most significant bits of ErrorAcc give us the
intensity weighting for this pixel, and the complement of the
weighting for the paired pixel */
Weighting = ErrorAcc >> 8;
ASSERT( Weighting < 256 );
ASSERT( ( Weighting ^ 255 ) < 256 );

COLORREF clrBackGround = ::GetPixel( pDC->m_hDC, X0, Y0 );
BYTE rb = GetRValue( clrBackGround );
BYTE gb = GetGValue( clrBackGround );
BYTE bb = GetBValue( clrBackGround );
double grayb = rb * 0.299 + gb * 0.587 + bb * 0.114;

BYTE rr = ( rb > rl ? ( ( BYTE )( ( ( double )( grayl<grayb?Weighting:(Weighting ^ 255)) ) / 255.0 * ( rb - rl ) + rl ) ) : ( ( BYTE )( ( ( double )( grayl<grayb?Weighting:(Weighting ^ 255)) ) / 255.0 * ( rl - rb ) + rb ) ) );
BYTE gr = ( gb > gl ? ( ( BYTE )( ( ( double )( grayl<grayb?Weighting:(Weighting ^ 255)) ) / 255.0 * ( gb - gl ) + gl ) ) : ( ( BYTE )( ( ( double )( grayl<grayb?Weighting:(Weighting ^ 255)) ) / 255.0 * ( gl - gb ) + gb ) ) );
BYTE br = ( bb > bl ? ( ( BYTE )( ( ( double )( grayl<grayb?Weighting:(Weighting ^ 255)) ) / 255.0 * ( bb - bl ) + bl ) ) : ( ( BYTE )( ( ( double )( grayl<grayb?Weighting:(Weighting ^ 255)) ) / 255.0 * ( bl - bb ) + bb ) ) );

pDC->SetPixel( X0, Y0, RGB( rr, gr, br ) );

clrBackGround = ::GetPixel( pDC->m_hDC, X0, Y0 + 1 );
rb = GetRValue( clrBackGround );
gb = GetGValue( clrBackGround );
bb = GetBValue( clrBackGround );
grayb = rb * 0.299 + gb * 0.587 + bb * 0.114;

rr = ( rb > rl ? ( ( BYTE )( ( ( double )( grayl<grayb?(Weighting ^ 255):Weighting) ) / 255.0 * ( rb - rl ) + rl ) ) : ( ( BYTE )( ( ( double )( grayl<grayb?(Weighting ^ 255):Weighting) ) / 255.0 * ( rl - rb ) + rb ) ) );
gr = ( gb > gl ? ( ( BYTE )( ( ( double )( grayl<grayb?(Weighting ^ 255):Weighting) ) / 255.0 * ( gb - gl ) + gl ) ) : ( ( BYTE )( ( ( double )( grayl<grayb?(Weighting ^ 255):Weighting) ) / 255.0 * ( gl - gb ) + gb ) ) );
br = ( bb > bl ? ( ( BYTE )( ( ( double )( grayl<grayb?(Weighting ^ 255):Weighting) ) / 255.0 * ( bb - bl ) + bl ) ) : ( ( BYTE )( ( ( double )( grayl<grayb?(Weighting ^ 255):Weighting) ) / 255.0 * ( bl - bb ) + bb ) ) );

pDC->SetPixel( X0, Y0 + 1, RGB( rr, gr, br ) );
}
pDC->SetPixel( X1, Y1, clrLine );
}
...全文
224 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
linglongyouzhi 2008-12-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 fromccsu 的帖子:]
各位大侠,麻烦帮小弟看一下下面的WU反走样算法的每个点灰度值究竟是怎么算的,我看到是斜率×( rb - rl ) + rl ),不知道表示什么意思?

[/Quote]

这不是线的斜率,而是给(rb-rl)在显示图像的红色亮度差值得一个权重

19,464

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧