Otsu 方法(matlab 中的 graythresh 函数)在哪个尺度上产生缩放结果? 0:255、0:max(px 强度)、min:max?

Otsu method (graythresh function in matlab) produces a scaled result on which scale? 0:255, 0:max(px intensity), min:max?

只是澄清关于 Otsu 阈值方法的一点,该方法在文档和维基百科文章中缺乏定义。如果你应用 Otsu 方法(在 matlab 中函数 graythresh)它 returns 一个介于 0 和 1 之间的阈值。

给定 2 个假设的灰度图像:

如果我分别为 darklight 图像获得 0.75 的 Otsu 阈值,那么在每种情况下它将映射到什么灰度像素强度?

正确答案是第一个:

暗 = 75 和亮 = 230,相对于每个图像中的值范围

graythresh使用图像中的最小值和最大值作为边界,这是最符合逻辑的行为。

你的第三个答案对我来说似乎是最正确的,澄清 'full range of grayscale pixel values' 取决于输入图像的数据类型。例如,对于 uint8 图像,Otsu 阈值 0.75 对应于大约 191。对于 uint16 图像,这对应于 49151。

好吧,为了后人的缘故,我对前面提到的方法进行了比较。我拍摄了一张具有全范围灰度像素强度的典型图像,然后拍摄了同一图像的 darklight 版本,并获得了每个版本的 graythresh 值。我使用上述每个映射应用了 Otsu 阈值。

光图像非常清楚地表明该算法正在图像像素强度范围内产生阈值。如果我们假设全范围的像素强度,Otsu 算法将产生一个低于图像中任何实际存在的阈值,这没有多大意义,至少假设现有的黑色背景是 transparent/irrelevant。

如果您假设图像的现有黑色部分是相关的黑暗,我想有人可能会提出假设像素强度的全范围。我当然欢迎在那里发表评论。

Full size images seen below


修改我上面的话:当我将 light 图像的上半部分以外的所有部分变黑并再次采用 Otsu 阈值时,我得到相同的阈值 0.3020。如果图像的黑暗部分与正在生成的 Otsu 阈值相关,额外的黑暗会影响该值,因此,Ratbert 的答案根据经验证明是正确的。

@Ratbert 接受的答案提出了不正确的说法

The correct answer is the first one

graythresh uses the min and max values in the image as boundaries, which is the most logical behavior.

并且 rayryeng 似乎同意这一点。 David Parks 似乎已经通过经验验证了它。

正确答案由 Anand 给出,奇怪的是,他似乎投了反对票。他非常有说服力地解释说

full range of grayscale pixel values' depends on the data type of the input image

正如他所解释的,

this is the third option

除了 dark 图像不可能获得 0.75 的阈值。

首先让我们在最简单的情况下澄清索赔之间的区别,在清晰的 MATLAB 中,所以没有混淆。对于值范围从 minmax 的图像,问题提出了三种可能性,当转换为等式时,它们是:

  1. threshold = min + (max-min) * graythresh
  2. threshold = max * graythresh
  3. threshold = 255 * graythresh

假设图像仅由两个点组成,一个强度为 0,另一个强度为 100。这意味着 dark = uint8([0 100]);。第二张图片 light = dark+155;。当我们计算 255*graythresh(dark) 时,我们正好得到 49.5。当我们计算 255*graythresh(light) 时,我们正好得到 204.5。这些答案显然表明第三种选择是唯一的可能性。

还有一个优点。如果您尝试 255*graythresh(uint8(1:2)),答案是 1,而不是 1.5。因此,如果您使用 greythresh 对图像进行阈值处理,您应该使用 image <= 255*graythesh(image) 小于或等于 ,而不是普通的 小于.