[计算机视觉]灰度拉伸 & 直方图均衡化

2.8k words

1.灰度拉伸

有两种

  • 线性拉伸:将灰度范围线性扩展

  • 非线性拉伸:将感兴趣的灰度范围线性扩展,相对抑制不感兴趣的灰度区域

1.1 效果

线性点运算作用:

  1. 当图象成像时曝光不足或过度,
  2. 成像设备的非线性
  3. 图像记录设备动态范围太窄等原因,都会产生对比度不足的弊病,使图像中的细节分辨不清。这时可通过点运算将灰度范围线性扩展.

1.2 原理

1.2.1 线性拉伸

即进行线性点运算,输出灰度级与输入灰度级呈线性关系的点运算:

  • 其中, 代表的是二维图像上的灰度值
  • 代表的是拉伸后二维图像上的灰度值
  • 是线性方程的系数
  • 是线性方程的截距


很自然需要分情况讨论, 以及

  • 时,输出图像的暗区域将变亮,亮区域将变暗,反色效果
    • 注意如果,反色后还是有压缩对比度效果
    • 从直方图角度看,直方图的柱子在x轴下方了

  • 时,输出图像的对比度减小,压缩对比度

    • 适用于原图灰度的动态范围太大的情况
    • 从直方图角度看,直方图的柱子群分布范围变窄了,但是直方图的形状压缩

  • 时,图像整体增亮

  • 时,图像整体变暗

    • 使所有像素的灰度值上移或下移
    • 其效果是使整个图像更暗或更亮
    • 从直方图角度看,就是整个柱子群向255平移或者向0平移,分布范围不变

  • 时,输出图像的对比度拉伸,拉伸对比度
    • 可使图像动态范围增大,图像对比度扩展。
    • 从而使图像变得清晰以及图像上的特征变得明显
    • 从直方图角度看,就是整个柱子群柱子群分布范围变宽了,直方图的形状被拉伸


直方图角度理解拉伸和压缩:

可以看到形状还是那个形状

1.2.2 分段线性拉伸

突出感兴趣的目标或灰度区间,相对抑制那些不感兴趣的灰度区间

MATLAB中的imadjust将灰度图像 I 中的灰度值映射到新值中。

默认情况下,imadjust 对所有像素值中最低的 1% 和最高的 1% 进行抑制处理;将介于最低的 1% 和最高的 1% 之间的像素值进行拉伸。这意味着函数会忽略最极端的像素值,从而防止它们对整体图像的视觉效果产生不良影响。

1.3 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
img = imread("rice.png");

img_adjust = imadjust(img);
figure;
subplot(2, 2, 1);
imshow(img);
title('原始图像');
subplot(2, 2, 2);
imshow(img_adjust);
title('调整后的图像');
subplot(2, 2, 3);
imhist(img);
title('原始直方图');
subplot(2, 2, 4);
imhist(img_adjust);
title('调整后的直方图');

2.直方图修正

分类

  • 直方图均衡化
  • 直方图规定化

2.1 直方图

2.1.1 直方图定义

直方图(Histogram):

反映一幅图像灰度级与出现这种灰度的概率之间关系的图形(某灰度级的像素个数)

  • 横坐标是灰度级
  • 纵坐标是该灰度级出现的频度
  • 直方图是图像最基本的统计特征

2.1.2 直方图性质

  • 不同图像可能具有同样的直方图,图像与直方图之间是多对一的映射关系

  • 可叠加性,若将图像分区,则每个区都可分别作直方图,而原图像的总直方图为各区直方图之和
  • 直方图是总体灰度的概念:
    • 总体偏暗的图像:
    • 总体偏亮的图像:
    • 总体对比度偏低的图像:
    • 总体对比度较高的图像:

总结:

2.2 直方图均衡化

2.2.1 目的

将原图像的直方图变换为均匀分布的形式,这样就增加了像素灰度值的范围,从而达到增强图像整体对比度的效果

2.2.2 算法流程

  1. 统计灰度级 的频数
  2. 计算灰度级 的概率

  • 其中
    • 为灰度级 的频数,
    • 为所有像素点的数量,
    • 为归一化的输入图像灰度级(如
  1. 计算累计分布概率

  1. 取整扩展

  • 其中
    • 是灰度值总数(灰度范围0-7,则
  1. 建立映射

2.2.3 讨论

灰度拉伸 VS. 直方图均衡化

pout

tire

直方图均衡化通过重新映射图像的灰度值,以使图像中的灰度级在整个动态范围内得到充分利用;这与的灰度映射不同,直方图均衡化是非线性运算灰度运算是线性运算(或分段线性运算)

可以观察到图像“pout.tif”原始图像的直方图中大部分像素集中在较窄的灰度级区间75-100,其余基本没有分布,导致图像整体偏灰(灰度级75-100在黑白中间嘛),图像不够清晰。进行直方图均衡化后灰度级近似均匀地分布在0-255上,对比度得到了提升,小孩子的人脸变得更加清晰,而且也可以看到背景的栅栏。但是,与灰度映射不同,直方图均衡化后的pout(人)脸部的一部分和外套都泛白,不自然,出现过饱和情况

图像“tire.tif”的像素主要在集中在少数几个灰度级0-50,导致图像对比度较低,细节不明显经过直方图均衡化后像素较为平均地分布在256个灰度级中,对比度得到了显著提高,特别是轮胎的一些纹理变得非常清晰,以至于许多先前隐藏的特征暴露出来,尤其是轮胎上的碎屑颗粒(或者纹路?),而且轮胎的中心泛白,也是过饱和了。灰度调节在图像“tire.tif”上没有效果,因为imadjust默认仅对所有像素值中最低的 1% 和最高的 1% 进行线性运算处理,但原图的所有像素值已经在0-255均有分布,故几乎没有影响。

直方图均衡化和灰度调节都是让有效利用整个灰度范围,使得图像的动态范围更广,从而增强了图像的视觉效果。但是从直方图上看直方图均衡化后的灰度分布近似均匀分布,而灰度调节的灰度分布仅仅是 "拉伸" 了原分布(当然极端灰度级是抑制/压缩的)。