9.2 灰度线性变换
灰度线性变换是最常用的点运算 操作之一,下面先介绍其基本原理。
9.2.1 基本原理
灰度线性变换是灰度变换的一种,图像的灰度变换通过建立灰度映射来调整源图像的灰度从而达到图像增强的目的。 灰度映射通常是用灰度变换曲线来表示的,如图9-7所示。
灰度线性变换就是将图像的像素值通过指定的线性函 数进行变换,以此增强或者减弱图像的灰度。灰度线性变换的公式就是常见的一维线性函数: g(x, y)=kf(x, y)+d
设x为原始灰度值,则变换后的灰度 值y为: 也可以在坐标系中表示转化关系,如图9-7所示。
图9-7 灰度线性变换
图9-7坐标中的横轴表示输入灰度值,范围是0至 255;纵坐标表示输出灰度值,范围同样是0至255;直线则为线性变换函数的图形。如果将输入灰度值作为自变量x,则输出的灰度值就是函数y=T(x) 的运算结果。对于线性变换而言,有T(x)=kx+d。例如图9-7中的变换函数为T(x)=x, 即原公式中的k=1,d=0。 由数学知识可以知道k表示直线的斜 率,也就是倾斜程度;d为线性函数在y轴的斜率。下面通过讨论k的取值来分析灰度线性变换的效果。 1)当k>1时
此时可用 于增加图像的对比度。图像的像素值在变换后全部增大,整体显示效果被增强,如图9-8所示。
图9-8 变换后的图像、对应变换函数和直方图
可以看 到,图像经过变换后,其灰度分布被拉伸了。读者可以与图9-1中的直方图进行比较。 2)当k=1时
这种情况 常用于调节图像亮度。在第6章中已经介绍过了,亮度的调节就是让图像的各像素值都增加或者减少一定量。这种情况下可以通过改变d的值达到增 加或者减少图像亮度的目的,如图9-9所示。
图9-9 利用线性变换改变图像亮度
可以看 到,当d>0时图像亮度增加,反之则减少。对应直方图的显示效果是灰度分布整体向右或者向左平移。 3)当0 效果与k>1 时刚刚相反,图像的对比度和整体效果都被削弱。从图9-10中的直方图可以看到,灰度分布被集中在一段区域上。k越小,图像的灰度分布越 窄,图像看起来也就越偏灰色。 图9-10 利用线性变换改变图像对比度 4)当k<0时 在这种情 况下,源图像较亮的区域变暗,而较暗的区域会变亮。此时可以使函数中的k=-1,d=255让图像实现反色效果,如图 9-11所示。 图9-11 利用线性变换让图像反色 9.2.2 编程实现 1.线性变换函数 灰度线性变换的函数代码如下: /*************************************************************************** * 作用: 线性变换函数 * 参数: * pixel: 原始像素数组 * tempPixel: 保存变换后的图像像素数组 * width: 原始图像宽度 * height: 原始图像高度 * slope: 线性函数的斜率 * inter: 线性函数的截距 * 备注: 此函数对于彩色图同样适用 ***************************************************************************/ void LineTrans(BYTE* pixel, BYTE* tempPixel, UINT width, UINT height, double slope, double inter) { // 灰度映射表 BYTE map[256]; // 保存运算后的临时值 double dTemp; for (int i = 0; i < 256; i++) { // 计算当前像素变换后的值 dTemp = slope * i + inter; // 如果超界则修改其值 if (dTemp < 0) dTemp = 0.0; else if (dTemp > 255) dTemp = 255; // 四舍五入 map[i] = int(dTemp + 0.5); }

