隔行扫描是一项很重要的技术,有着广泛的应用。
一帧图像的数据量是相当大的,即使做过压缩处理,对它进行一次隔行扫描,便可把数据减少为原来的一半,然后再进行数据的传输,在解码端再对进行隔行扫描的数据进行恢复处理,即通过已知的一半数据来恢复未知的一半数据,其最为简单的方法就是进行一次平均插值,通过其最近的两个像素来得出当前像素的值。
原图像
隔行扫描的代码如下
void GetHalfPixels(BYTE* BufSrc, BYTE* BufDst, int SrcWidth, int SrcHeight)
{
for( int i=0; i<SrcHeight; i+=2)
{
for (int j=0; j<SrcWidth; j++)
{
memcpy(BufDst+(i/2)*SrcWidth*3, BufSrc+(i*SrcWidth*3), SrcWidth*3);
}
}
}
隔行扫描
简单平均插值的代码如下(这里只是对一行插值的代码,通过其上下行的数据得到中间行的数据:
for(int j=0;j<=SrcWidth;j++)
{
*(BufDst+(i*SrcWidth*3)+j) = (*(BufSrc+(i-1)/2*SrcWidth*3+j)+*(BufSrc+(i+1)/2*SrcWidth*3+j))/2;
}
插值图像
很明显,此图像有明显的锯齿;
消除锯齿的方法很多,一般是通过插值法来实现的,插值又分为线性插值和非线性插值。