1 package com.github.celldynamics.quimp.geom.filters;
2
3 import java.awt.geom.Point2D;
4 import java.util.Arrays;
5 import java.util.Collection;
6 import java.util.List;
7
8 import org.scijava.vecmath.Point2d;
9 import org.scijava.vecmath.Tuple2d;
10
11 import com.github.celldynamics.quimp.plugin.utils.IPadArray;
12 import com.github.celldynamics.quimp.plugin.utils.QuimpDataConverter;
13
14
15
16
17
18
19
20 public class PointListProcessor {
21
22 private QuimpDataConverter dt;
23
24
25
26
27
28
29 public PointListProcessor(List<? extends Tuple2d> list) {
30 dt = new QuimpDataConverter(list);
31 }
32
33
34
35
36
37
38 public PointListProcessor(Collection<? extends Point2D> list) {
39 dt = new QuimpDataConverter(list);
40 }
41
42
43
44
45
46
47
48
49 public PointListProcessor smoothMean(int window, int iters) {
50 double[] x = dt.getX();
51 double[] y = dt.getY();
52
53 for (int i = 0; i < iters; i++) {
54 y = runningMean(y, window);
55 x = runningMean(x, window);
56 }
57 dt = new QuimpDataConverter(x, y);
58 return this;
59 }
60
61
62
63
64
65
66
67
68 public PointListProcessor smoothMedian(int window, int iters) {
69 double[] x = dt.getX();
70 double[] y = dt.getY();
71
72 for (int i = 0; i < iters; i++) {
73 y = runningMedian(y, window);
74 x = runningMedian(x, window);
75 }
76 dt = new QuimpDataConverter(x, y);
77 return this;
78 }
79
80
81
82
83
84
85 public List<Point2d> getList() {
86 return dt.getList();
87 }
88
89
90
91
92
93
94 public List<Point2D> getListAwtDouble() {
95 return dt.getListofDoublePoints();
96 }
97
98
99
100
101
102
103 public List<Point2D> getListAwtInt() {
104 return dt.getListofIntPoints();
105 }
106
107
108
109
110
111
112 public QuimpDataConverter getDataConverterInstance() {
113 return dt;
114 }
115
116
117
118
119
120
121
122
123 public static double[] runningMean(double[] data, int windowSize) {
124 if (windowSize % 2 == 0) {
125 throw new IllegalArgumentException("Window must be odd");
126 }
127 double[] ret = new double[data.length];
128 int cp = windowSize / 2;
129
130 for (int c = 0; c < data.length; c++) {
131 double mean = 0;
132 for (int cc = c - cp; cc <= c + cp; cc++) {
133 int indexTmp = IPadArray.getIndex(data.length, cc, IPadArray.CIRCULARPAD);
134 mean += data[indexTmp];
135 }
136 mean = mean / windowSize;
137 ret[c] = mean;
138 }
139 return ret;
140 }
141
142
143
144
145
146
147
148
149 public static double[] runningMedian(double[] data, int windowSize) {
150 if (windowSize % 2 == 0) {
151 throw new IllegalArgumentException("Window must be odd");
152 }
153 double[] ret = new double[data.length];
154 int cp = windowSize / 2;
155 double[] xs = new double[windowSize];
156 int l = 0;
157
158 for (int c = 0; c < data.length; c++) {
159 l = 0;
160 for (int cc = c - cp; cc <= c + cp; cc++) {
161 int indexTmp = IPadArray.getIndex(data.length, cc, IPadArray.CIRCULARPAD);
162 xs[l] = data[indexTmp];
163 l++;
164 }
165
166 Arrays.sort(xs);
167 ret[c] = xs[cp];
168 }
169 return ret;
170 }
171 }