7、灰度拉伸
功能与效果:
灰度拉伸和灰度的线性变换有点类似,都用到灰度的线性变换,但不同之处在于灰度拉伸不是完全的线性变换,而是分段进行线性变换。
灰度拉伸可以更加灵活的控制输出灰度直方图的分布,它可以有选择的拉伸某段灰度区间以改善输出图像。如上图,所示的变换函数的运算结果是将原图在a到b之间的灰度拉伸到c到d之间。如果一幅图像的灰度集中在较暗的区域而导致图像偏暗,可以用灰度拉伸功能来拉伸(斜率>1)物体灰度区间以改善图像;同样如果图像灰度集中在较亮的区域而导致图像偏亮,也可以用灰度拉伸功能来压缩(斜率<1)物体灰度区间以改善图像质量。
原理与算法:
当x<x1: f(x) = y1/x1*x;
当x1<=x<=x2: f(x) = (y2-y1)/(x2-x1)*(x-x1)+y1;
当x>x2: f(x) = (255-y2)/(255-x2)*(x-x2)+y2; //其中x1,y1,x2,y2是图中ac,bd两个转折点的坐标。
实现代码:
int i=0;
for( i=0; i<=x1; i++ )
{
if( x1>0 )
{
bMap[i] = (BYTE)y1*i/x1;
}
else
{
bMap[i] = 0;
}
}
for( ; i<=x2; i++ )
{
if( x2 != x1 )
{
bMap[i] = y1 + (BYTE)(y2-y1)*(i-x1)/(x2-x1);
}
else
{
bMap[ i ] = y1;
}
}
for( ; i<256; i++ )
{
if( x1 != 255 )
{
bMap[i] = y2 + (BYTE)(255-y2)*(i-x2)/(255-x2);
}
else
{
bMap[i] = 255;
}
}
for( int i=0; i<iPixelHeight; i++ )
for( int j=0; j<iPixelWidth; j++ )
{
//指向像素数据的第i行,第j列/个像素的指针
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight-1-i) + j; //lLineBytes * (lHeight-1-i) + j???不懂
lpSrc = bMap[lpSrc]
}