我正在尝试对16位灰度图像进行直方图均衡化,原始直方图如下所示,其灰度级约为25000:
我最初是使用MATLAB的,但是由于某种原因,输出中的总水平显着降低(只有21!)。我尝试手动分配一个箱数为20,000,但输出水平仍然很小(67)。
然后我在Python中尝试了Scikit-Image,并且一切都按预期方式工作-输出现在具有16,500个级别,直方图几乎持平。
这是MATLAB命令:
J = histeq(I,2e4);
这是Python命令:
img_eq_sk = exposure.equalize_hist(img_16bit)
由于直方图均衡是这样的基本操作,所以我希望MATLAB和Python的行为类似,但是根据此MATLAB的结果甚至不如Skimage的结果好。
答案 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实现所看到的那样,不需要以这种方式实现直方图均衡化。但是,似乎这种实现方式并没有错,只是不必要地量化了输出。