Эффективный способ сглаживания массива с фиксированным набором результатов

Допустим, у меня есть массив из 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 ответ

Если вы не ограничены языком макросов ImageJ, но открыты для использования любого из поддерживаемых языков сценариев, вы можете использовать StatUtils.mode(double[] sample, int begin, int length) метод из Apache Commons-Math.

Следующий скрипт 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)

Надеюсь, это поможет.

Другие вопросы по тегам