MATLAB的直方图均衡有啥问题?

Posted

技术标签:

【中文标题】MATLAB的直方图均衡有啥问题?【英文标题】:What's wrong with MATLAB's histogram equalization?MATLAB的直方图均衡有什么问题? 【发布时间】:2019-12-16 16:00:43 【问题描述】:

我正在尝试对 16 位灰度图像进行直方图均衡化,原始直方图如下所示,其灰度级约为 25000:

我第一次使用 MATLAB,但由于某种原因,输出中的总水平显着降低(只有 21 个!)。我尝试手动分配 20,000 的 bin 编号,但输出级别仍然很小 (67)。

然后我在 Python 中尝试了 Scikit-Image,一切都按预期工作——输出现在有 16,500 个级别,直方图非常平坦。

这是 MATLAB 命令:

J = histeq(I,2e4);

这是 Python 命令:

img_eq_sk = exposure.equalize_hist(img_16bit)

由于直方图均衡是一种基本操作,我希望 MATLAB 和 Python 的行为相似,但据此 MATLAB 的结果甚至不如 Skimage 的结果。

【问题讨论】:

如果将输入图像转换为双倍,也会发生同样的情况吗? @CrisLuengo 实际上,如果我将它加倍,会有一个小的改进,均衡图像的灰度现在增加到 34(默认)和 132(2e4 箱) 我认为主要区别在于我们在 scikit-image 的整个过程中使用浮点数,而我认为 Matlab 会立即四舍五入到 uint8。在用户在这里报告错误后,我对两者进行了比较:github.com/scikit-image/scikit-image/issues/… 感谢您的链接,我认为它完全解释了我的担忧。看起来 MATLAB 在这个过程中引入了很多舍入误差;正如你所说,即使将 Skimage 结果放入 255 个 bin 中,我们也不会得到这么少的级别。 【参考方案1】:

我可以验证您所看到的:

I = uint16(randn(1000,1000) * 5000 + 3e4);
imhist(I)
size(unique(I(:))) % returns: 31290 unique gray values

J = histeq(I,8e5); % actually uses only 6.5e4, the max for uint16
imhist(J)
size(unique(J(:))) % returns: 158 unique gray values

K = histeq(im2double(I),8e5);
imhist(K)
size(unique(K(:))) % returns: 175 unique gray values

当需要对输入值进行显着拉伸时,许多不同的灰度值最终会出现在同一个输出 bin 中,并且许多输出 bin 仍然是空的。

当使用双图像(上面代码中的K)查看结果时,可以看到随着参数增加到histeq,唯一输出灰度级的数量如何增加。

也就是说,输出被量化为一组值(上例中为 800,000),而不仅仅是输入。因此,如果这些输出箱中有许多是空的,则将很少有不同的输出灰度值。

没有必要以这种方式实现直方图均衡,从 OP 中使用的 Python 实现可以看出。但是,这个实现似乎并没有错,它只是对输出进行了不必要的量化。

但是,由于直方图均衡化仅对可视化有用,而且由于可视化不需要超过 100 个不同的灰度值(无论如何我们无法区分更多),所以输出量化应该不会是大问题。如果您将直方图均衡用于其他任何事情(即图像分析和量化),那么您做错了! 意见>

【讨论】:

关于视觉效果的评论,在使用 MATLAB 进行组织均衡后,图像的视觉质量实际上有很大的下降——大块的平坦区域就像你没有足够的位深度一样。我实际上将它用于图像分析,因为所有重要特征都隐藏在黑暗区域中,所以我什至看不到我应用的每一个更改,除非我首先均衡直方图。 @Akahs:不要使用直方图均衡化进行图像分析。使用对比度增强方法,您可以了解并控制灰度值发生的变化。直方图均衡后,您不再知道原始数据和输出数据之间的关系。如果您以稍微不同的方式裁剪图像或遮盖不同的部分,它也会发生变化。 这很公平。通过其他已知的对比度增强方法,您的意思是归一化和伽马校正之类的东西? @Akahs:您可以应用任何您想要的传递函数,只要该传递函数不依赖于输入数据。这样一来,不同的图像就会被完全相同地处理。伽马校正、线性缩放、偏移校正,这些都是在分析之前应用的正常事情。像他们在机器学习中所做的规范化只有在您从某些数据中确定规范化,然后对所有数据应用完全相同的缩放时才有效。您不能单独对每个图像进行归一化,因为那样它们的缩放比例会不同并且不再具有可比性。

以上是关于MATLAB的直方图均衡有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

图像增强基于matlab直方图均衡化图像增强含Matlab源码 960期

图像增强基于matlab直方图均衡化图像增强含Matlab源码 960期

写一段代码画出一个图像的灰度直方图(不能用MATLAB自带的imhist函数),并作直方图均衡化处理。

图像增强:直方图均衡和小波变换matlab

直方图均衡化的计算以及MATLAB实现

直方图均衡化及matlab实现