Python 什么';MATLAB有什么问题;直方图均衡化?

Python 什么';MATLAB有什么问题;直方图均衡化?,python,matlab,image-processing,histogram,scikit-image,Python,Matlab,Image Processing,Histogram,Scikit Image,我正在尝试对16位灰度图像进行直方图均衡化,原始直方图如下所示,它具有约25000个灰度级: 我第一次使用MATLAB,但由于某种原因,输出中的总水平显著降低(只有21!)。我试图手动分配一个20000的箱子号,但输出级别仍然很低(67)。 然后我尝试了Python中的Scikit图像,一切都如预期的那样工作——输出现在有16500个级别,直方图非常平坦。 以下是MATLAB命令: J=histeq(I,2e4); 下面是Python命令: img_eq_sk=曝光。均衡历史(img_1

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

我第一次使用MATLAB,但由于某种原因,输出中的总水平显著降低(只有21!)。我试图手动分配一个20000的箱子号,但输出级别仍然很低(67)。

然后我尝试了Python中的Scikit图像,一切都如预期的那样工作——输出现在有16500个级别,直方图非常平坦。

以下是MATLAB命令:

J=histeq(I,2e4);
下面是Python命令:

img_eq_sk=曝光。均衡历史(img_16位)

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

我可以验证您所看到的:

I=uint16(随机数(10001000)*5000+3e4);
imhist(一)
大小(唯一(I(:)))%返回:31290个唯一的灰度值
J=历史等式(I,8e5);%实际上只使用6.5e4,这是uint16的最大值
伊姆希斯特(J)
大小(唯一(J(:)))%返回:158个唯一的灰度值
K=histeq(im2double(I),8e5);
imhist(K)
大小(唯一(K(:)))%返回:175个唯一的灰度值
当输入值需要显著拉伸时,许多不同的灰度值最终会出现在同一个输出箱中,并且许多输出箱仍然为空

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

也就是说,输出被量化为一组值(在上面的示例中为800000),而不仅仅是输入。因此,如果这些输出箱中有许多是空的,那么将很少有明显的输出灰度值

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


然而,由于直方图均衡化仅对可视化有用,并且对于可视化而言,不需要超过100个不同的灰度值(无论如何,我们无法区分更多的灰度值),因此输出量化不应该是一个主要问题。如果你用直方图均衡化做其他事情(如图像分析和量化),那你就错了

我可以验证您看到的内容:

I=uint16(随机数(10001000)*5000+3e4);
imhist(一)
大小(唯一(I(:)))%返回:31290个唯一的灰度值
J=历史等式(I,8e5);%实际上只使用6.5e4,这是uint16的最大值
伊姆希斯特(J)
大小(唯一(J(:)))%返回:158个唯一的灰度值
K=histeq(im2double(I),8e5);
imhist(K)
大小(唯一(K(:)))%返回:175个唯一的灰度值
当输入值需要显著拉伸时,许多不同的灰度值最终会出现在同一个输出箱中,并且许多输出箱仍然为空

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

也就是说,输出被量化为一组值(在上面的示例中为800000),而不仅仅是输入。因此,如果这些输出箱中有许多是空的,那么将很少有明显的输出灰度值

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


然而,由于直方图均衡化仅对可视化有用,并且对于可视化而言,不需要超过100个不同的灰度值(无论如何,我们无法区分更多的灰度值),因此输出量化不应该是一个主要问题。如果你用直方图均衡化做其他事情(如图像分析和量化),那你就错了

如果您将输入图像转换为双精度,是否也会发生同样的情况?@CrisLuengo实际上,如果我将其转换为双精度,则会有一个小的改进,均衡图像的灰度现在增加到34(默认值)和132(2个4格),我想主要区别在于我们在scikit图像的整个过程中都使用浮动,而我想象Matlab会立即转到uint8。在一个用户的bug报告之后,我在这里对两者进行了比较:谢谢你的链接,我想这正好解释了我的担忧。看起来MATLAB在这个过程中引入了很多舍入误差;正如你所说,即使将浏览结果放入255个存储箱中,我们也不会得到如此少的级别。如果将输入图像转换为双精度,是否也会发生同样的情况?@CrisLuengo实际上,如果将其转换为双精度,均衡图像的灰度现在会增加到34(默认)和132(2e4个存储箱)我认为主要的区别在于,我们在scikit图像的整个过程中都使用浮点,而我想象Matlab会立即转到uint8。在一个用户的bug报告之后,我在这里对两者进行了比较:谢谢你的链接,我想这正好解释了我的担忧。看起来MATLAB在这个过程中引入了很多舍入误差;正如您所说,即使将浏览结果放入255个存储箱中,我们也不会得到如此少的级别。关于视觉效果的评论,在使用MATLAB进行hist均衡后,图像的视觉质量实际上有很大的下降——大面积的平坦区域就像您没有足够的位深度一样。我实际上是在用它进行图像分析,因为所有重要的特征都隐藏在黑暗的区域中,所以我甚至看不到我应用的所有更改,除非我首先均衡直方图。@Akahs:不要在图像分析中使用直方图均衡化。使用对比度增强方法,您可以知道并控制灰度值的变化。直方图均衡后