我正在工作的一个项目,我必须显示一些图片(灰度),我注意到,其中许多太黑暗,无法正确地看到。
然后查看ImageJ API文档,我找到了这个类:ImageJ
有两种方法让我很难理解它们的概念差异-- stretchHistogram()和equalize() --这两种方法都使图像变得更加明亮,
但我仍然想了解它们之间的差异。
我的问题是:这些方法在概念上有什么区别?
直方图拉伸 stretchHistogram 是指一幅具有低动态范围的图像,因此所有像素强度集中在一个比8位灰度图像的0到255范围更小的范围内。因此,图像中最暗的像素可以是84,最亮的是153。拉伸只需要这个狭窄的范围,并执行一个线性映射到完整的0到255范围。就像这样:
直方图均衡化试图实现一个平坦的直方图,因此所有可能的像素强度都在图像中得到了同样的表示。这意味着,在直方图中有峰值的地方–在某个范围内的数值集中–这些峰值被扩展到更宽的范围,以使峰值变平,而在直方图中有凹槽的地方,这些峰值被映射到更窄的范围,从而使槽被平平。再一次,类似这样的事情:
对于具有低动态范围的单模直方图,这两个操作大致相等,但在直方图已经覆盖所有强度范围的情况下,直方图均衡化提供了有用的视觉改进,而直方图拉伸 stretchHistogram没有任何效果(因为没有什么可拉伸的)。柱状图的映射曲线是由累积分布导出的(假设每个直方图条都是以前所有值的总和),理论上可以得到一个完全平坦的直方图。然而,由于我们(通常)处理的是像素强度的离散值,直方图均衡化给出了像上面所示的平面直方图的近似值。