使用一组固定结果平滑数组的有效方法

时间:2017-05-26 08:29:21

标签: arrays imagej moving-average processing-efficiency imagej-macro

假设我有1000个数组仅由值0,1,2,3组成。我想要做的是删除其他值的海洋中的奇数值,例如。 0,0,0,0,0,1,0,0,0,0 - > 0,0,0,0,0,0,0,0,0,0。一个简单的移动平均线确实不起作用,因为我总是必须返回值0,1,2,3,所以平均值在0,3,0 - >之间。 1那是错的。 我想出了这个似乎可以做到这一点,但我想知道是否有一种方法可以更有效,更好地完成它。 这适用于ImageJ宏。

r = 7; //window length
for(j=r; j<lengthOf(armsPosition)-r;j++){
    count0 = 0; count1 = 0; count2=0;count3 = 0;
    for(m = j - r/2; m <= j + r/2; m++){
        if(armsPosition[m] == 0)
            count0++;
        else if(armsPosition[m] == 1)
            count1++;
        else if(armsPosition[m] == 2)
            count2++;
        else
            count3++;

    }

    if(count0 >= count1 && count0 >= count2 && count0 >= count3)
        armsPositionA[j]=0;
    else if(count1 > count0 && count1 > count2 && count1 > count3)
        armsPositionA[j]=1;
    else if(count2 > count0 && count2 > count1 && count2 > count3)
        armsPositionA[j]=2;
    else 
        armsPositionA[j]=3;
}

谢谢,

1 个答案:

答案 0 :(得分:0)

如果你不仅限于ImageJ的宏语言,而是打开使用任何支持的scripting languages,你可以使用Apache commons-math中的StatUtils.mode(double[] sample, int begin, int length)方法。

以下Groovy脚本说明了这一点:

import org.apache.commons.math3.stat.StatUtils

a = [1,3,4,21,3,2,21,21,21,21,21,21,4,3,5,2,2,1,1,1,1]

println StatUtils.mode((double[])a, 0, 7)

希望有所帮助。