Main Content

histeq

使用直方图均衡增强对比度

说明

示例

J = histeq(I) 变换灰度图像 I,以使输出灰度图像 J 的直方图具有 64 个 bin 且大致平坦。

J = histeq(I,n) 变换灰度图像 I,以使输出灰度图像 J 具有 n 个 bin 的直方图大致平坦。当 n 远小于 I 中的离散灰度级数时,J 的直方图更平坦。

J = histeq(I,hgram) 变换灰度图像 I,以使输出灰度图像 J 的直方图近似匹配目标直方图 hgram。输出图像的直方图中 bin 的数量等于 length(hgram)

newcmap = histeq(X,map) 变换颜色图层中的值,使索引图像 X 的灰度分量直方图大致平坦。变换后的颜色图为 newcmap

newcmap = histeq(X,map,hgram) 变换与索引图像 X 相关联的颜色图,以使索引图像 (X, newcmap) 的灰度分量直方图近似匹配目标直方图 hgramhisteq 函数在 newcmap 中返回变换后的颜色图。length(hgram) 必须与 size(map,1) 相同。

示例

[___,T] = histeq(___) 还返回变换 T,该变换将输入灰度图像或颜色图的灰度分量映射到输出灰度图像或颜色图的灰度分量。

示例

全部折叠

将图像读入工作区。

I = imread('tire.tif');

使用直方图均衡增强强度图像的对比度。

J = histeq(I);

显示原始图像和调整后的图像。

imshowpair(I,J,'montage')
axis off

显示原始图像的直方图。

figure
imhist(I,64)

显示处理后的图像的直方图。

figure
imhist(J,64)

加载三维数据集。

load mristack

执行直方图均衡。

enhanced = histeq(mristack);

显示原始图像和对比度增强图像的第一个数据切片。

figure
subplot(1,2,1)
imshow(mristack(:,:,1))
title('Slice of Original Image')
subplot(1,2,2)
imshow(enhanced(:,:,1))
title('Slice of Enhanced Image')

此示例说明如何绘制直方图均衡化的变换曲线。histeq 可以返回 1×256 向量,该向量显示每个可能的输入值的结果输出值。不管输入图像是什么类型,此向量中的值都在 [0,1] 范围内。您可以绘制这些数据来获得变换曲线。

将图像读入工作区。

I = imread('pout.tif');

使用 histeq 函数通过直方图均衡化调整对比度。指定灰度变换返回值 T,它是一个向量,用于将强度图像 I 中的灰度级映射到 J 中的灰度级。

[J,T] = histeq(I);

绘制变换曲线。注意这条曲线如何反映上图中的直方图,输入值大多在 0.3 和 0.6 之间,而输出值均匀分布在 0 和 1 之间。

figure
plot((0:255)/255,T);

输入参数

全部折叠

灰度图像,指定为任意维度的数值数组。

数据类型: single | double | int16 | uint8 | uint16

目标直方图,指定为数值向量。目标直方图必须在适当的范围内具有等间距 bin 跨度强度值。强度值范围取决于输入图像的数据类型。

  • singledouble - [0, 1]。

  • uint8 - [0, 255]。

  • uint16 - [0, 65535]。

  • int16 - [–32768, 32767]。

默认情况下,目标直方图中 bin 的数量等于 length(hgram)

例如:

hgram = 256:-4:4;
J = histeq(I,hgram);
此处以非平坦线性递减函数形式指定一个具有 64 个 bin 的目标直方图,强调小像素值。

histeq 自动缩放 hgram 以使 sum(hgram) == numel(I)。当 length(hgram) 远小于 I 中的离散灰度级数时,直方图 J 会更好地匹配 hgram

数据类型: single | double

离散灰度级的数量,指定为正整数。

数据类型: single | double

索引图像,指定为任意维度的数值数组。X 中的值是颜色图 map 的索引。

数据类型: single | double | uint8 | uint16

与索引图像 X 相关联的颜色图,指定为由范围 [0, 1] 内的值组成的 c×3 数值矩阵。每行是一个三元素 RGB 三元组,指定颜色图的单个颜色的红、绿和蓝分量。

数据类型: double

输出参量

全部折叠

变换后的灰度图像,以大小和类与输入图像 I 相同的数值数组形式返回。

灰度变换,以数值向量形式返回。变换 T 将图像 I 中的灰度级映射到 J 中的灰度级。

数据类型: double

变换后的颜色图,指定为由 [0, 1] 范围内的值组成的 n×3 数值矩阵。每行是一个三元素 RGB 三元组,指定颜色图的单个颜色的红、绿和蓝分量。

数据类型: double

算法

当您提供目标直方图 hgram 时,histeq 选择灰度变换 T 以最小化

|c1(T(k))c0(k)|,

c0 是输入图像 I 的累积直方图,c1hgram 中所有强度 k 上的累积总和。这种最小化受以下条件的限制:

  • T 必须单调

  • c1(T(a))c0(a) 的过冲不能超过 a 处直方图计数之间差距的一半。

histeq 使用变换 b = T(a) 将 X(或颜色图)中的灰度级映射到其新值。

如果您不指定 hgram,则 histeq 创建平坦的 hgram

hgram = ones(1,n)*prod(size(A))/n;

然后应用前面的算法。

扩展功能

版本历史记录

在 R2006a 之前推出

全部展开