【问题标题】:Calculate threshold for vector计算向量的阈值
【发布时间】:2014-03-03 09:51:23
【问题描述】:

我有一个向量,我需要为其计算一个阈值以将其转换为二进制向量(高于阈值 = 1,低于 = 0)。向量的值要么接近零,要么远离零。因此,如果绘制向量,值要么位于 X 轴附近,要么飙升(因此值之间存在明显差异)。每次,向量中的值都会改变,所以我需要动态计算阈值。向量可以采用的最大值或最小值没有限制。我知道 otsu 的方法用于灰度图像,但由于我的向量的范围值是变化的,我想我不能使用它。是否有任何标准方法来计算我的案例的阈值?如果没有,有什么好的解决方法吗?

【问题讨论】:

  • 能否发布您的数据样本(包括标准案例和极端案例)以及您目前获得的相关代码?
  • 您可以指定要变为 1 的值的比例。例如,对于 50%,您的阈值将是 median(vector)
  • 将每个向量归一化为 [0 1] 并使用 0.5 进行阈值化?
  • 除非您定义您希望如何更详细地分隔值,否则它是任意的。但这听起来像是一个分类问题。 Matlab 有大量的工具箱。
  • 好的。现在,我正在对向量进行归一化并应用 otsu 的方法,增量为 0.01。它工作正常。谢谢

标签: matlab vector binary-data


【解决方案1】:

我建议您指定将变为 1 的值的百分比,并使用相应的百分位值作为阈值(使用统计工具箱中的prctile 函数计算):

x = [3 45 0.1 0.4 10 5 6 1.2];
p = 70; %// percent of values that should become 1

threshold = prctile(x,p);
x_quant = x>=threshold;

这种方法使阈值自动适应您的值。由于您的数据是无限的,因此使用百分位数可能比使用平均值更好,因为对于平均值,单个较大的值可能会超出您的预期。

在示例中,

x_quant =

     0     1     0     0     1     0     0     0

【讨论】:

    【解决方案2】:

    如果限制在单个向量中没有不同,并且 0 和 1 值的概率几乎相等,为什么不简单地使用向量的平均值作为阈值?

    >> X=[6 .5 .9  3 .4 .6 7]
    
    X =
    
        6.0000    0.5000    0.9000    3.0000    0.4000    0.6000    7.0000
    
    >> X>=mean(X)
    
    ans =
    
         1     0     0     1     0     0     1
    

    如果 1 和 0 的概率不同,您可能需要将比较中的平均值相乘以再次拟合。请注意,这是一种非常简单的方法,可以对其进行改进以更好地适应您的问题

    【讨论】:

      猜你喜欢
      • 2013-01-08
      • 1970-01-01
      • 2020-06-29
      • 2016-08-10
      • 1970-01-01
      • 2020-11-22
      • 2012-10-28
      • 2021-05-13
      • 1970-01-01
      相关资源
      最近更新 更多