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 个假设的灰度图像:
dark
(像素强度在 0 到 100 范围内)和
light
(像素强度在 155 到 255 范围内)
如果我分别为 dark
和 light
图像获得 0.75 的 Otsu 阈值,那么在每种情况下它将映射到什么灰度像素强度?
dark -> 75
和 light -> 231
例如相对于每个图像中的值范围
dark -> 75
和 light -> 191
例如相对于范围 0 到最大像素值
dark -> 191
和 light -> 191
例如相对于整个灰度像素值范围 (0-255)?
正确答案是第一个:
暗 = 75 和亮 = 230,相对于每个图像中的值范围
graythresh
使用图像中的最小值和最大值作为边界,这是最符合逻辑的行为。
你的第三个答案对我来说似乎是最正确的,澄清 'full range of grayscale pixel values' 取决于输入图像的数据类型。例如,对于 uint8 图像,Otsu 阈值 0.75 对应于大约 191。对于 uint16 图像,这对应于 49151。
好吧,为了后人的缘故,我对前面提到的方法进行了比较。我拍摄了一张具有全范围灰度像素强度的典型图像,然后拍摄了同一图像的 dark
和 light
版本,并获得了每个版本的 graythresh
值。我使用上述每个映射应用了 Otsu 阈值。
光图像非常清楚地表明该算法正在图像像素强度范围内产生阈值。如果我们假设全范围的像素强度,Otsu 算法将产生一个低于图像中任何实际存在的阈值,这没有多大意义,至少假设现有的黑色背景是 transparent/irrelevant。
如果您假设图像的现有黑色部分是相关的黑暗,我想有人可能会提出假设像素强度的全范围。我当然欢迎在那里发表评论。
修改我上面的话:当我将 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 中,所以没有混淆。对于值范围从 min
到 max
的图像,问题提出了三种可能性,当转换为等式时,它们是:
threshold = min + (max-min) * graythresh
threshold = max * graythresh
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)
和 小于或等于 ,而不是普通的 小于.
只是澄清关于 Otsu 阈值方法的一点,该方法在文档和维基百科文章中缺乏定义。如果你应用 Otsu 方法(在 matlab 中函数 graythresh
)它 returns 一个介于 0 和 1 之间的阈值。
给定 2 个假设的灰度图像:
dark
(像素强度在 0 到 100 范围内)和light
(像素强度在 155 到 255 范围内)
如果我分别为 dark
和 light
图像获得 0.75 的 Otsu 阈值,那么在每种情况下它将映射到什么灰度像素强度?
dark -> 75
和light -> 231
例如相对于每个图像中的值范围dark -> 75
和light -> 191
例如相对于范围 0 到最大像素值dark -> 191
和light -> 191
例如相对于整个灰度像素值范围 (0-255)?
正确答案是第一个:
暗 = 75 和亮 = 230,相对于每个图像中的值范围
graythresh
使用图像中的最小值和最大值作为边界,这是最符合逻辑的行为。
你的第三个答案对我来说似乎是最正确的,澄清 'full range of grayscale pixel values' 取决于输入图像的数据类型。例如,对于 uint8 图像,Otsu 阈值 0.75 对应于大约 191。对于 uint16 图像,这对应于 49151。
好吧,为了后人的缘故,我对前面提到的方法进行了比较。我拍摄了一张具有全范围灰度像素强度的典型图像,然后拍摄了同一图像的 dark
和 light
版本,并获得了每个版本的 graythresh
值。我使用上述每个映射应用了 Otsu 阈值。
光图像非常清楚地表明该算法正在图像像素强度范围内产生阈值。如果我们假设全范围的像素强度,Otsu 算法将产生一个低于图像中任何实际存在的阈值,这没有多大意义,至少假设现有的黑色背景是 transparent/irrelevant。
如果您假设图像的现有黑色部分是相关的黑暗,我想有人可能会提出假设像素强度的全范围。我当然欢迎在那里发表评论。
修改我上面的话:当我将 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 中,所以没有混淆。对于值范围从 min
到 max
的图像,问题提出了三种可能性,当转换为等式时,它们是:
threshold = min + (max-min) * graythresh
threshold = max * graythresh
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)
和 小于或等于 ,而不是普通的 小于.