23 #ifndef LIBMARGRET_SRC_EDGEFILTER_INL_HH 24 #define LIBMARGRET_SRC_EDGEFILTER_INL_HH 42 blitz::Array<DataT,3>
const &data,
43 blitz::TinyVector<double,3>
const &elSize,
44 blitz::Array<DataT,3> &result,
45 blitz::TinyVector<double,3>
const &lbUm,
46 blitz::TinyVector<double,3>
const &ubUm,
50 blitz::TinyVector<ptrdiff_t,3> lb(lbUm / elSize);
51 blitz::TinyVector<ptrdiff_t,3> ub(ubUm / elSize);
52 for (
int d = 0; d < 3; ++d)
54 if (lb(d) < 0) lb(d) = 0;
55 if (ub(d) < 0) ub(d) = 0;
56 if (lb(d) >= data.extent(d)) lb(d) = data.extent(d) - 1;
57 if (ub(d) >= data.extent(d)) ub(d) = data.extent(d) - 1;
59 blitz::RectDomain<3> roi(lb, ub);
60 blitz::Array<DataT,3> cropped(ub - lb + 1);
64 blitz::TinyVector<double,3> sigma(elSize(1));
69 blitz::Array<blitz::TinyVector<DataT,3>,3> dCropped;
71 cropped, elSize, dCropped,
73 blitz::Array<DataT,3> dCroppedMag(cropped.shape());
77 #pragma omp parallel for 79 for (ptrdiff_t i = 0; i < dCropped.size(); ++i)
81 dCroppedMag.data()[i] =
static_cast<DataT
>(
82 std::sqrt(
blitz::dot(dCropped.data()[i], dCropped.data()[i])));
83 if (dCroppedMag.data()[i] != 0.0)
84 dCropped.data()[i] /= dCroppedMag.data()[i];
88 result.resize(data.shape());
91 ptrdiff_t progressCnt = 0;
92 ptrdiff_t progressUpdate = 0;
94 progressUpdate = cropped.size() /
100 #pragma omp parallel for 102 for (ptrdiff_t i = 0; i < cropped.size(); ++i)
105 if (progress != NULL)
108 if (progressCnt % progressUpdate == 0)
110 static_cast<int>(progressCnt / progressUpdate +
118 blitz::TinyVector<ptrdiff_t,3> p;
120 for (
int d = 2; d >= 0; --d)
122 p(d) = tmp % cropped.extent(d);
123 tmp /= cropped.extent(d);
125 blitz::TinyVector<double,3> pl(
126 blitz::TinyVector<double,3>(p) - dCropped(p));
127 blitz::TinyVector<double,3> pu(
128 blitz::TinyVector<double,3>(p) + dCropped(p));
130 if (dCroppedMag.data()[i] > ip.
get(dCroppedMag, pl) &&
131 dCroppedMag.data()[i] > ip.
get(dCroppedMag, pu))
132 result(blitz::TinyVector<ptrdiff_t,3>(p + lb)) =
133 dCroppedMag.data()[i];
137 template<
class DataT>
139 blitz::Array<DataT, 3>
const &data,
140 blitz::TinyVector<double,3>
const &elSize,
141 int direction,
double scaling,
145 blitz::TinyVector<ptrdiff_t,3> dataShape(data.shape());
147 DataT maxVal = blitz::max(data);
148 DataT minVal = blitz::min(data);
150 blitz::Array<DataT,3> edgeNormedIm(dataShape);
152 if (maxVal != minVal)
153 edgeNormedIm = (data - minVal) / (maxVal - minVal);
155 blitz::Array<DataT,3> dx(dataShape);
158 DataT* data_in = edgeNormedIm.data();
159 DataT* data_out_x = dx.data();
161 ptrdiff_t r2r_offs = dataShape(2);
162 ptrdiff_t l2l_offs = dataShape(1) * dataShape(2);
169 for (ptrdiff_t lev = 0; lev < dataShape(0); ++lev)
171 for (ptrdiff_t row = 0; row < dataShape(1); ++row)
173 ptrdiff_t offset = lev * l2l_offs + row * r2r_offs + 1;
174 for (ptrdiff_t col = 1; col < dataShape(2) - 1; ++col)
178 0.5 * (data_in[offset+1] - data_in[offset-1]) * scaling);
183 for (ptrdiff_t lev = 0; lev < dataShape(0); ++lev)
185 for (ptrdiff_t row = 0; row < dataShape(1); ++row)
187 dx(lev, row, static_cast<ptrdiff_t>(0)) =
188 dx(lev, row, static_cast<ptrdiff_t>(1));
189 dx(lev, row, dataShape(2) - 1) = dx(lev, row, dataShape(2) - 2);
197 for (ptrdiff_t lev = 0; lev < dataShape(0); ++lev)
199 for (ptrdiff_t row = 1; row < dataShape(1) - 1; ++row)
201 ptrdiff_t offset = lev * l2l_offs + row * r2r_offs;
202 for (ptrdiff_t col = 0; col < dataShape(2); ++col)
204 data_out_x[offset] =
static_cast<DataT
>(
205 0.5 * (data_in[offset+r2r_offs]
206 - data_in[offset-r2r_offs]) * scaling);
211 for (ptrdiff_t lev = 0; lev < dataShape(0); ++lev)
213 for (ptrdiff_t col = 0; col < dataShape(2); ++col)
215 dx(lev, static_cast<ptrdiff_t>(0), col) =
216 dx(lev, static_cast<ptrdiff_t>(1), col);
217 dx(lev, dataShape(1) - 1, col) = dx(lev, dataShape(1) - 2, col);
225 for (ptrdiff_t lev = 1; lev < dataShape(0) - 1; ++lev)
227 for (ptrdiff_t row = 0; row < dataShape(1); ++row)
229 ptrdiff_t offset = lev * l2l_offs + row * r2r_offs;
230 for (ptrdiff_t col = 0; col < dataShape(2); ++col)
232 data_out_x[offset] =
static_cast<DataT
>(
233 0.5 * (data_in[offset+l2l_offs]
234 - data_in[offset-l2l_offs]) * scaling);
239 for (ptrdiff_t row = 0; row < dataShape(1); ++row)
241 for (ptrdiff_t col = 0; col < dataShape(2); ++col)
243 dx(static_cast<ptrdiff_t>(0), row, col) =
244 dx(static_cast<ptrdiff_t>(1), row, col);
245 dx(dataShape(0) - 1, row, col) = dx(dataShape(0) - 2, row, col);
virtual bool isAborted() const =0
DataT get(blitz::Array< DataT, Dim > const &data, blitz::TinyVector< double, Dim > const &pos) const
Get the Array value at the given subpixel position.
The Implementation of the filter computing the gradient of the input data using central differences...
blitz::Array< DataT, 3 > _calculateGradients(blitz::Array< DataT, 3 > const &data, blitz::TinyVector< double, 3 > const &elSize, int direction, double scaling, iRoCS::ProgressReporter *progress)
The Implementation of the convolution of the input data with a Gaussian.
The LinearInterpolator class provides sub-pixel access to blitz++ Arrays using linear interpolation...
virtual bool updateProgress(int progress)=0
int taskProgressMax() const
int BlitzIndexT
The native integer type for indexing blitz++ Arrays.
int taskProgressMin() const
Mirror out-of-Array coordinates at the Array boundaries to get in-Array indices and values...
virtual void apply(blitz::Array< DataT, Dim > const &data, blitz::TinyVector< double, Dim > const &elementSizeUm, blitz::Array< ResultT, Dim > &filtered, iRoCS::ProgressReporter *pr=NULL) const
Apply the filter to the given Array.
Always pick the closest in-Array position to the position passed.
void edgeFilter(blitz::Array< DataT, 3 > const &data, blitz::TinyVector< double, 3 > const &elSize, blitz::Array< DataT, 3 > &result, blitz::TinyVector< double, 3 > const &lbUm, blitz::TinyVector< double, 3 > const &ubUm, iRoCS::ProgressReporter *progress)
calculate gradient magnitude with non-maximum-supression
double dot(blitz::Array< DataT, 1 > const &vec1, blitz::Array< DataT, 1 > const &vec2)
Calculation of the inner product (dot product) of the given vectors.
The CentralGradientFilter class implements the SeparableFilter interface and provides gradient comput...