23 #ifndef LIBSEGMENTATION_SRC_PROFILEFILTER_INL_HH 24 #define LIBSEGMENTATION_SRC_PROFILEFILTER_INL_HH 36 #include <blitz/tinyvec-et.h> 42 template<
class T,
int Dim>
43 blitz::RectDomain<Dim>
47 blitz::TinyVector<double,Dim> centerUm,
48 blitz::Array<T,Dim>
const &data,
49 blitz::TinyVector<double,Dim>
const &elSize,
50 blitz::Array<T,Dim> &result,
51 blitz::TinyVector<double,Dim> lbUm,
52 blitz::TinyVector<double,Dim>
const &ubUm,
55 blitz::TinyVector<ptrdiff_t,Dim> lbPx(lbUm / elSize);
56 blitz::TinyVector<ptrdiff_t,Dim> ubPx(ubUm / elSize);
58 for (
int d = 0; d < Dim; ++d)
60 if (lbPx(d) < 0) lbPx(d) = 0;
61 if (ubPx(d) < 0) ubPx(d) = 0;
62 if (lbPx(d) >= data.extent(d)) lbPx(d) = data.extent(d) - 1;
63 if (ubPx(d) >= data.extent(d)) ubPx(d) = data.extent(d) - 1;
65 blitz::RectDomain<Dim> roi(lbPx, ubPx);
66 lbUm = blitz::TinyVector<double,Dim>(lbPx) * elSize;
68 typename blitz::Array<T,Dim>::iterator itDst;
69 blitz::TinyVector<ptrdiff_t,Dim> outShape(ubPx - lbPx + 1);
70 result.resize(outShape);
73 T maxVal = -std::numeric_limits<T>::infinity();
75 ptrdiff_t progressCnt = 0;
76 ptrdiff_t progressUpdate = 0;
78 progressUpdate = result.size() /
82 #pragma omp parallel for 84 #if defined _OPENMP && defined _WIN32 85 for (ptrdiff_t i = 0; i < static_cast<ptrdiff_t>(result.size()); ++i) {
87 for (
size_t i = 0; i < result.size(); ++i) {
92 if (progressCnt % progressUpdate == 0)
94 static_cast<int>(progressCnt / progressUpdate +
102 blitz::TinyVector<ptrdiff_t,Dim> srcPosPx;
104 for (
int d = Dim - 1; d >= 0; --d)
106 srcPosPx(d) = tmp % result.extent(d);
107 tmp /= result.extent(d);
111 blitz::TinyVector<double,Dim> srcPosUm(srcPosPx);
115 blitz::Array<T,1> profile(
116 sampler.
sample(data, elSize, centerUm, srcPosUm));
118 T minDist = std::numeric_limits<T>::infinity();
119 for (
size_t j = 0; j < pdfs.size(); ++j)
121 T d = dist(*(pdfs[j]), profile);
122 if (d < minDist) minDist = d;
125 if(minDist == std::numeric_limits<T>::infinity())
132 std::cerr <<
"ProfileFilter: WARNING: nan value detected and set to " 133 <<
"infinity at position" << srcPosUm << std::endl;
139 result.data()[i] = minDist;
144 if (minDist > maxVal) maxVal = minDist;
148 #pragma omp parallel for 150 #if defined _OPENMP && defined _WIN32 151 for (ptrdiff_t i = 0; i < static_cast<ptrdiff_t>(result.size()); ++i)
153 for (
size_t i = 0; i < result.size(); ++i)
155 result.data()[i] = (result.data()[i] == -1) ? maxVal : result.data()[i];
157 std::cout <<
"profile filter max val " << maxVal << std::endl;
161 #pragma omp parallel for 163 #if defined _OPENMP && defined _WIN32 164 for (ptrdiff_t i = 0; i < static_cast<ptrdiff_t>(result.size()); ++i)
166 for (
size_t i = 0; i < result.size(); ++i)
168 result.data()[i] =
static_cast<T
>(1) - result.data()[i] / maxVal;
174 #endif //LIBSEGMENTATION_SRC_PROFILEFILTER_INL_HH virtual bool isAborted() const =0
virtual bool updateProgress(int progress)=0
int taskProgressMax() const
Encapsulates a normal pdf.
bool any(blitz::TinyMatrix< bool, NRows, NColumns > const &matrix)
any() reduction for boolean blitz::TinyMatrix.
int taskProgressMin() const
blitz::RectDomain< Dim > operator()(ProfileSampler< T, Dim > const &sampler, std::vector< NormalPDF< T > *> const &pdfs, blitz::TinyVector< double, Dim > centerUm, blitz::Array< T, Dim > const &data, blitz::TinyVector< double, Dim > const &elSize, blitz::Array< T, Dim > &result, blitz::TinyVector< double, Dim > lbUm=0.0, blitz::TinyVector< double, Dim > const &ubUm=(std::numeric_limits< double >::infinity()), iRoCS::ProgressReporter *progress=NULL) const
Filters input data.
blitz::Array< T, 1 > sample(blitz::Array< T, Dim > const &data, blitz::TinyVector< double, Dim > const &elSize, blitz::TinyVector< double, Dim > const ¢erUm, blitz::TinyVector< double, Dim > const &positionUm) const