只是澄清一下关于Otsu阈值方法的观点,该方法缺乏文档和维基百科文章中的定义 . 如果应用Otsu方法(在matlab函数 graythresh
中),则返回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)?
4 回答
正确的答案是第一个:
相对于每个图像中的值范围,暗= 75并且光= 230
graythresh
使用图像中的最小值和最大值作为边界,这是最符合逻辑的行为 .@Ratbert接受的答案是错误的说法
和
而rayryeng似乎同意这一点 . 大卫帕克斯似乎已经凭经验证实了这一点 .
Anand给出了正确答案,奇怪的是,这似乎有一个反对票 . 他非常令人信服地解释说
正如他解释的那样
除了
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)
与小于或等于,而不是简单的小于 .您的第三个答案似乎对我来说最合适,澄清“全范围的灰度像素值”取决于输入图像的数据类型 . 例如,对于uint8图像,Otsu阈值0.75对应于大约191.对于uint16图像,这将对应于49151 .
那么,为了后人的缘故,我对前面提到的方法进行了比较 . 我拍摄了具有全范围灰度像素强度的典型图像,然后拍摄了相同图像的
dark
和light
版本,并获得了每个的graythresh
值 . 我使用上述每个映射应用Otsu阈值 .光图像非常清楚地表明该算法在图像的像素强度范围内产生阈值 . 如果我们假设全范围的像素强度,Otsu算法将产生低于图像中任何实际存在的阈值,这没有多大意义,至少假设现有的黑色背景是透明/不相关的 .
如果你假设图像的现有黑色部分是相关的黑暗,我想有人可以为假设像素强度的全范围做出论证 . 我当然欢迎那里的评论 .
Full size images seen below
修改上面的话:当我将除了
light
图像的上半部分以外的所有图像变黑并再次取出Otsu阈值时,我得到相同的阈值0.3020 . 如果图像的暗部分与Otsu阈值相关,则额外的黑暗会影响该值,因此,Ratbert的答案在经验上被证明是正确的 .