/** Stable median calculation. */ public double calcStableMedian(double lowerFrac, double upperFrac, IntArrayList list) { // This works for any size! list.trimToSize(); Arrays.sort(list.elements()); int sum = 0; int cnt = 0; for (int i = (int) (lowerFrac * list.size()); i < (int) (list.size() * upperFrac); i++) { sum += list.get(i); cnt++; } return (double) sum / cnt; // below is the original. it Relies on bucket-sorting. It should be perfectly possible to write // a linear-time stable median // based on the normal linear-time median algorithm. This is needed to handle non-8bit images. // Value might be off a bit but not much (need to think of indexing), and it doesn't matter for // this application /* int numbins=66000; int[] elem=list.elements(); int numElem=list.size(); //Calculate histogram int[] histogram=new int[numbins]; //int[] elem=curBgOutside.elements(); //int numElem=curBgOutside.size(); for(int i=0;i<numElem;i++) histogram[elem[i]]++; int jumpElem=0; int lowerIndex=(int)(numElem*lowerFrac); int upperIndex=(int)(numElem*upperFrac); int sum=0; int cnt=0; for(int i=0;i<numbins;i++) { int thisNum=histogram[i]; int take=Math.min(upperIndex,jumpElem+thisNum)-Math.max(lowerIndex, jumpElem); if(take>0) { sum+=take*i; cnt+=take; } jumpElem+=thisNum; } return (double)sum/cnt; */ }