0

Sagen wir, ich habe Array von 1000 zusammengesetzt nur aus den Werten 0,1,2,3. Was ich tun möchte, ist den ungeraden Wert in einem Meer anderer Werte zu entfernen, z. 0,0,0,0,0,1,0,0,0,0 -> 0,0,0,0,0,0,0,0,0,0,0. Ein einfacher gleitender Durchschnitt funktioniert nicht wirklich, weil ich immer die Werte 0,1,2,3 zurückgeben muss, also über 0,3,0 -> 1 mitteln und das ist falsch. Ich kam mit diesem, scheint, um die Arbeit zu tun, aber ich frage mich, ob es eine Methode, um es effizienter und schöner zu tun. Dies ist für ein ImageJ-Makro.Effiziente Art der Glättung eines Arrays mit einer festen Reihe von Ergebnissen

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; 
} 

Danke,

Antwort

0

Wenn Sie zu ImageJ der Makrosprache beschränkt, sondern offen für jede der unterstützten scripting languages verwenden, können Sie die StatUtils.mode(double[] sample, int begin, int length) Methode von Apache commons-Mathematik verwenden.

Die folgende Groovy-Skript veranschaulicht dies:

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) 

Hoffnung, das hilft.

+0

Danke. Ich habe darüber nachgedacht, das ganze Makro entweder auf Scripting oder auf ein vollständiges Pledge-Plugin umzustellen, obwohl das ziemlich viel Lernzeit erfordern würde, etwas, das ich momentan nicht wirklich habe. – hadroque

Verwandte Themen