9.5 灰度拉伸
图片下载站源码本节介绍灰度拉伸的相关知识,它是改变图像对比度的常用方法。
9.5.1 基本原理
由于环境光线或采集设备等原因,图像的灰度有时会集中于某一较小区间,如图像过亮或过暗等,这时就需要对图像的灰度进行拉伸使之覆盖较大的取值区间,从而提高图像的对比度以便于观察。这种处理就可以利用线性变换曲线建立灰度映射来完成。
灰度拉伸又叫做对比度拉伸,它与线性变换有些类似,不同之处在于灰度拉伸使用的是分段线性变换,所以它最大的优势是变换函数可以由用户任意合成。灰度拉伸的公式为:
其变换函数的图形如图9-27所示。
图9-27 灰度拉伸函数的图形
可见,灰度拉伸需要指定两个控制点,它们用于控制灰度拉伸变换函数的图形。一般情况下有x2≥x1, y2≥y1成立。正如其名,灰度拉伸常用于扩展指定灰度范围,以改善图像质量。接下来通过讨论控制点来分析灰度拉伸的作用。
1)
即中间线段的斜率大于1,如果一幅图像对比度较低,就可以利用这类控制点对图像进行对比度拉伸,如图9-28所示。
图9-28 利用灰度拉伸增加图像的对比度
从图9-28中可以明显发现原始图像的对比度较低,其灰度分布主要集中在50~150的范围内。经过(50, 20)、(150, 230)两个控制点的灰度拉伸变换后,灰度分布范围被拉伸了,达到了20~230,图像的对比度大大增加,整体显示效果得到加强。
2)
即中间线段的斜率小于1,作用与上一条刚好相反,用于降低图像的对比度,如图9-29所示。
图9-29 利用灰度拉伸降低图像的对比度
9-29图中的原始图像对比度较高,但是经过控制点为(20, 50)、(230, 120)的灰度拉伸后,图像的灰度分布基本被压缩在50~120之间。变换后的图像对比度降低,整体画面偏灰。
3)
此时变换函数变化为一条线性函数,它将产生一个没有变化的图像。
4)
这也是一种特殊情况,此时变换函数变为阈值函数,产生二值图像,效果见9.4节。
9.5.2 编程实现
1.灰度拉伸函数
下面的函数实现了图像的灰度拉伸变换。
/******************************************************************** *******
* 作用: 灰度拉伸函数
* 参数:
* pixel: 原始像素数组
* tempPixel: 保存变换后图像的像素数组
* width: 原始图像宽度
* X1,Y1: 控制点1的坐标
* X2,Y2: 控制点2的坐标
********************************************************************* ******/
void GrayStretch(BYTE* pixel, BYTE* tempPixel, UINT width, UINT height, float X1, float Y1, float X2, float Y2)
{
// 映射表,用于256种灰度变换后的值
BYTE map[256];
// 保存运算后的临时值
double dTemp;
for (int x = 0; x < 256; x++)
{
// 如果在第一条直线上
if ( x < X1)
{
if ( fabs(X1 - 0) > 0.0001 )
dTemp = (float)Y1 / (float)X1 * x;
else
dTemp = 0;
}
// 如果在第二条直线上
else if ( x <= X2 )
{
if ( fabs(X2 - X1) > 0.0001 )
dTemp = (float)(Y2 - Y1) / (float)(X2 - X1) * (x - X1) + Y1;
else
dTemp = x;
}
// 如果在第三条直线上
else
{
if ( fabs(Y2 - 255) > 0.0001 )
dTemp = (float)(255 - Y2) / (float)(255 - X2) * (x - X2) + Y2;
else
dTemp = 255;
}
// 四舍五入
map[x] = int(dTemp + 0.5);
}
// 变换后的值直接在映射表中查
for (UINT i = 0; i < width * height; i++)
{
int x = pixel[i * 4];
tempPixel[i*4] = tempPixel[i*4+1] = tempPixel[i*4+2] = map[x];
tempPixel[i*4+3] = 255;
}
}
2.灰度拉伸对话框
本节利用对话框实现灰度拉伸的功能,对话框效果如图9-29所示。用户可以在文本框中修改两个控制点的坐标,或者直接利用鼠标拖动预览框中的红点改变控制点。
下面完成该对话框的设计。打开 MagicHouse项目,添加一个新的对话框资源,将其ID改名为IDD_STRETCH,然后创建对话框类CStretchDlg。最后根据图 9-30和表9-5完善灰度拉伸对话框。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论