4. 图像点运算与灰度变换
图像点运算是最基础也最常用的一类空间域处理方法:输出像素的灰度值只由输入图像中同一位置的像素值决定,与邻域无关。正因如此,点运算计算量小、可实时处理,并且可以用一条映射曲线完整描述。本章围绕对比度增强这一目标,讲解 imadjust、histeq、adapthisteq 三个函数,它们分别对应线性拉伸、全局直方图均衡和自适应直方图均衡三种思路。
一、点运算的本质:灰度映射函数
设输入图像为 f(x,y),输出为 g(x,y),点运算可写成 g(x,y) = T[f(x,y)]。这里的 T 是一个一维函数,称为灰度变换函数或映射曲线。理解点运算,关键是理解这条曲线的形状:
- 斜率大于 1 的区间:灰度被拉开,对比度增强;
- 斜率小于 1 的区间:灰度被压缩,对比度降低;
- 水平段:多个输入灰度映射到同一输出,细节丢失(饱和/截断);
- 斜率为负:灰度反转,即负片效果。
因此,对比度增强的实质就是把原本集中在窄灰度范围内的像素,重新分配到更宽的范围内。下面这张图给出了三种方法的映射曲线形态与直方图变化对比,是理解本章的关键。
二、imadjust:参数明确的线性拉伸
imadjust 是最直观的对比度调整工具,其核心是把输入灰度区间 [low_in, high_in] 线性映射到输出区间 [low_out, high_out],并可选地施加 Gamma 校正。基本语法为:
J = imadjust(I, [low_in high_in], [low_out high_out], gamma);
其中 I 为输入图像,[low_in high_in] 与 [low_out high_out] 取值均在 [0,1] 之间(对 uint8 图像会自动按 255 归一化)。gamma 控制映射曲线的弯曲方向:gamma < 1 时曲线向上凸,暗部被提亮;gamma > 1 时曲线向下凹,亮部被压暗;gamma = 1 为纯线性。
实际使用中,low_in 和 high_in 通常由直方图确定。例如一幅整体偏暗的图像,其灰度大多集中在 30~120,若直接显示会显得灰蒙蒙。此时可执行:
I = imread('pout.tif');
J = imadjust(I, [0.1 0.5], [0 1]);
figure;
subplot(1,2,1); imshow(I); title('原图');
subplot(1,2,2); imshow(J); title('拉伸后');
subplot(2,2,1); imhist(I); title('原图直方图');
subplot(2,2,2); imhist(J); title('拉伸后直方图');
这里 [0.1 0.5] 表示把 25.5~127.5 的灰度范围拉满到 0~255。低于 25.5 的像素被截断为 0,高于 127.5 的被截断为 255,因此会损失一部分高光细节。判断拉伸是否合适,应同时观察直方图是否被拉开、图像是否出现大面积纯黑或纯白区域。若出现明显截断,应适当放宽区间,例如改为 [0.05 0.6]。
imadjust 默认对 RGB 三个通道分别处理,可能引起色偏。若要保持色调,可先转换到 HSV 空间,仅对 V 通道做拉伸,再转回 RGB。三、histeq:基于累积分布的全局均衡
histeq 不需要人工指定区间,它自动寻找一个映射,使输出图像的直方图尽可能接近均匀分布。其数学依据是:若 T 取输入灰度的累积分布函数(CDF),则输出灰度的分布趋于均匀。调用形式为:
J = histeq(I, n); % n 为输出灰度级数,默认 64
直方图均衡对整体偏暗或偏亮、动态范围未充分利用的图像效果显著。例如一幅曝光不足的图像,均衡后暗部被大幅拉开,细节明显增多。但它也有明显局限:
- 它是全局操作,映射曲线由整幅图像的统计量决定,无法兼顾局部;
- 当图像中存在大面积背景(如天空、白墙)时,这些灰度级会占据大量像素,均衡后反而被过度拉伸,产生噪声放大和"洗白"现象;
- 输出灰度级数
n过小会造成明显的灰度合并(伪轮廓),一般取 64~256。
因此,histeq 更适合直方图单峰、灰度集中、没有极端大面积均匀区域的图像。若图像本身已经接近均匀分布,均衡几乎不产生变化,此时不应强行使用。
四、adapthisteq:局部自适应的对比度受限均衡
adapthisteq 采用 CLAHE(Contrast Limited Adaptive Histogram Equalization)算法,把图像划分为若干小方块(tile),对每个 tile 单独做直方图均衡,再通过双线性插值消除块与块之间的边界。关键参数如下:
| 参数 | 含义 | 典型取值 |
|---|---|---|
NumTiles | 行、列方向的分块数 | [8 8] |
ClipLimit | 对比度增强上限,值越大增强越强 | 0.01~0.05 |
NBins | 直方图灰度级数 | 256 |
Range | 输出数据范围 | 'full' 或 'original' |
Distribution | 目标分布类型 | 'uniform' / 'rayleigh' |
典型调用示例:
I = imread('tire.tif');
J = adapthisteq(I, 'NumTiles', [8 8], 'ClipLimit', 0.02, ...
'NBins', 256, 'Distribution', 'uniform');
figure;
subplot(1,3,1); imshow(I); title('原图');
subplot(1,3,2); imshow(histeq(I)); title('histeq');
subplot(1,3,3); imshow(J); title('adapthisteq');
ClipLimit 是 CLAHE 的核心:它把每个 tile 直方图中超过阈值的部分裁剪掉,再均匀分配到各灰度级,从而限制局部对比度的放大倍数,避免噪声被过度增强。ClipLimit 越大,增强越强,但噪声也越明显;越小则越平滑。对于医学影像(如 X 光、眼底图)和低照度监控图像,adapthisteq 通常比 histeq 效果更好,因为它能在保留整体亮度的同时突出局部纹理。
imadjust 做一次粗调,把有效灰度范围拉到合理区间;再用 adapthisteq 做局部增强;最后用 imadjust 或 im2uint8 做输出范围归一化。每一步都应通过直方图和视觉观察确认没有引入明显伪影。五、方法选择与效果判断
面对一幅待增强的图像,可按以下思路选择方法:若灰度分布集中但形态正常,优先用 imadjust,因为参数可控、结果可预测;若整体偏暗且没有大面积均匀背景,可用 histeq 快速获得全局均衡;若图像局部明暗差异大、存在大面积背景或需要突出细节,则应使用 adapthisteq。判断增强是否成功,不能只看"是否变亮",而应同时检查:直方图是否覆盖了更宽的灰度范围、暗部和亮部是否出现不可逆的截断、噪声是否被放大到影响后续分割或识别、以及目标区域的边缘是否比原图更清晰。只有这些指标都满足,增强才算真正服务于后续的机器视觉任务。