MATLAB中直方图均衡功能的说明

Ans*_*man -8 matlab image-processing

当我们histeq在MATLAB中使用函数时,请解释一下图像会发生什么?数学解释会非常有用.

ray*_*ica 15

直方图均衡化旨在使图像直方图变平.基本上,它将图像建模为概率密度函数(或者更简单地说,直方图,您可以将每个条目标准化为图像中的像素总数),并尝试确保像素采用特定强度的概率是等概率(具有相等概率).

直方图均衡背后的前提是对比度差的图像.看起来像太暗的图像,或者它们太褪色,或者它们太亮的图像是适合直方图均衡的好选择.如果绘制直方图,则像素的范围限制在非常窄的范围内.通过直方图均衡,直方图将因此变平并为您提供更好的对比度图像.直方图的效果是它可以拉伸直方图的动态范围.

就数学定义而言,我不会厌烦你的细节,我希望有一些LaTeX在这里做,但它不受支持.因此,我遵从你这个链接,说明它的详细信息:http://www.math.uci.edu/icamp/courses/math77c/demos/hist_eq.pdf

但是,执行直方图均衡的最终方程实际上是1对1映射.对于图像中的每个像素,您可以提取其强度,然后通过此函数运行它.然后,它会为您提供输出图像中的输出强度.

假设p_i您遇到图像中具有强度的像素的概率i(采用像素强度的直方图箱数i并除以图像中的像素总数).鉴于L您的图像具有强度,给定强度的位置处的输出强度i取决于:

g_i = floor( (L-1) * sum_{n=0}^{i} p_i )
Run Code Online (Sandbox Code Playgroud)

您将所有概率从像素强度0,然后是1,然后是2,一直到强度i.这通常被称为累积分布函数.

MATLAB基本上使用这种方法执行直方图均衡.但是,如果你想自己实现它,它实际上非常简单.假设您有一个im无符号8位整数类型的输入图像.

function [out] = hist_eq(im, L)

if (~exist(L, 'var'))
    L = 256;
end

h = imhist(im) / numel(im);
cdf = cumsum(h);
out = (L-1)*cdf(double(im)+1);
out = uint8(out);
Run Code Online (Sandbox Code Playgroud)

此函数接收假定为无符号8位整数的图像.您可以选择指定输出的级别数.通常,L = 256对于8位图像,如果省略第二个参数,L则假定为这样.第一行计算概率.下一行计算累积分布函数(CDF).计算输入/输出后的下两行使用直方图均衡,然后转换回无符号的8位整数.请注意,uint8转换隐式为我们执行发言操作.您需要注意我们在访问CDF时必须添加1偏移量.原因是因为MATLAB开始索引为1,而图像的强度从0开始.

MATLAB命令histeq几乎做同样的事情,除非你打电话histeq(im),它假设你的图像有32个强度.因此,您可以histeq通过指定一个附加参数来覆盖该函数,该附加参数指定在图像中看到的强度值的数量,就像我们上面所做的那样.因此,你会这样做histeq(im, 256);.在MATLAB中调用它,并使用我上面写的函数应该给你相同的结果.

作为一个练习,让我们使用一个被称为MATLAB发行版的图像pout.tif.我们还要显示它的直方图.

im = imread('pout.tif');
figure;
subplot(2,1,1);
imshow(im);
subplot(2,1,2);
imhist(im);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如您所见,图像的对比度较差,因为大多数强度值都适合窄范围.直方图均衡化将使图像变平并因此增加图像的对比度.因此,尝试这样做:

out = histeq(im, 256); %//or you can use my function: out = hist_eq(im);
figure;
subplot(2,1,1);
imshow(out);
subplot(2,1,2);
imhist(out);
Run Code Online (Sandbox Code Playgroud)

这就是我们得到的:

在此输入图像描述

正如您所看到的,对比度更好.较暗的像素倾向于向较暗的一端移动,而较亮的像素被推向较轻的一端.我认为成功的结果!请记住,当您尝试进行直方图均衡时,并非所有图像都能为您提供良好的结果.图像处理主要是一个反复试验的事情,因此你将不同技术的混合物放在一起,直到你得到一个好的结果.

这应该有希望让你开始.祝好运!