MATLAB的直方图均衡有什么问题?

时间:2019-08-08 21:54:56

标签: python matlab image-processing histogram scikit-image

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

我最初是使用MATLAB的,但是由于某种原因,输出中的总水平显着降低(只有21!)。我尝试手动分配一个箱数为20,000,但输出水平仍然很小(67)。 Histogram equalization from MATLAB

然后我在Python中尝试了Scikit-Image,并且一切都按预期方式工作-输出现在具有16,500个级别,直方图几乎持平。 enter image description here

这是MATLAB命令:

J = histeq(I,2e4);

这是Python命令:

img_eq_sk = exposure.equalize_hist(img_16bit)

由于直方图均衡是这样的基本操作,所以我希望MATLAB和Python的行为类似,但是根据此MATLAB的结果甚至不如Skimage的结果好。

1 个答案:

答案 0 :(得分:0)

我可以验证您看到的内容

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

当需要显着扩展输入值时,许多不同的灰度值最终会出现在同一出纸槽中,并且许多出纸槽仍为空。

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

也就是说,不仅将输入量化为输出的固定数量的值(在上面的示例中为800,000)。因此,如果这些出纸槽中的许多都是空的,那么几乎没有不同的输出灰度值。

正如OP中使用的Python实现所看到的那样,不需要以这种方式实现直方图均衡化。但是,似乎这种实现方式并没有错,只是不必要地量化了输出。

但是,由于直方图均衡化仅对可视化有用,并且由于对于可视化,一个人不需要超过100个不同的灰度值(无论如何我们都不能分辨出更多),因此输出量化应不是主要问题。如果您将直方图均衡化用于其他任何事情(即图像分析和量化),那么您做错了!