}
}
+ class Nld_Step_Scalar_Invoker : public cv::ParallelLoopBody
+ {
+ public:
+ Nld_Step_Scalar_Invoker(cv::Mat& Ld, const cv::Mat& c, cv::Mat& Lstep, float _stepsize)
+ : _Ld(&Ld)
+ , _c(&c)
+ , _Lstep(&Lstep)
+ , stepsize(_stepsize)
+ {
+ }
+
+ virtual ~Nld_Step_Scalar_Invoker()
+ {
+
+ }
+
+ void operator()(const cv::Range& range) const
+ {
+ cv::Mat& Ld = *_Ld;
+ const cv::Mat& c = *_c;
+ cv::Mat& Lstep = *_Lstep;
+
+ for (int i = range.start; i < range.end; i++)
+ {
+ for (int j = 1; j < Lstep.cols - 1; j++)
+ {
+ float xpos = ((*(c.ptr<float>(i)+j)) + (*(c.ptr<float>(i)+j + 1)))*((*(Ld.ptr<float>(i)+j + 1)) - (*(Ld.ptr<float>(i)+j)));
+ float xneg = ((*(c.ptr<float>(i)+j - 1)) + (*(c.ptr<float>(i)+j)))*((*(Ld.ptr<float>(i)+j)) - (*(Ld.ptr<float>(i)+j - 1)));
+ float ypos = ((*(c.ptr<float>(i)+j)) + (*(c.ptr<float>(i + 1) + j)))*((*(Ld.ptr<float>(i + 1) + j)) - (*(Ld.ptr<float>(i)+j)));
+ float yneg = ((*(c.ptr<float>(i - 1) + j)) + (*(c.ptr<float>(i)+j)))*((*(Ld.ptr<float>(i)+j)) - (*(Ld.ptr<float>(i - 1) + j)));
+ *(Lstep.ptr<float>(i)+j) = 0.5f*stepsize*(xpos - xneg + ypos - yneg);
+ }
+ }
+ }
+
+ private:
+ cv::Mat * _Ld;
+ const cv::Mat * _c;
+ cv::Mat * _Lstep;
+ float stepsize;
+ };
+
/* ************************************************************************* */
/**
* @brief This function performs a scalar non-linear diffusion step
*/
void nld_step_scalar(cv::Mat& Ld, const cv::Mat& c, cv::Mat& Lstep, float stepsize) {
-#ifdef _OPENMP
-#pragma omp parallel for schedule(dynamic)
-#endif
- for (int i = 1; i < Lstep.rows - 1; i++) {
- for (int j = 1; j < Lstep.cols - 1; j++) {
- float xpos = ((*(c.ptr<float>(i)+j)) + (*(c.ptr<float>(i)+j + 1)))*((*(Ld.ptr<float>(i)+j + 1)) - (*(Ld.ptr<float>(i)+j)));
- float xneg = ((*(c.ptr<float>(i)+j - 1)) + (*(c.ptr<float>(i)+j)))*((*(Ld.ptr<float>(i)+j)) - (*(Ld.ptr<float>(i)+j - 1)));
- float ypos = ((*(c.ptr<float>(i)+j)) + (*(c.ptr<float>(i + 1) + j)))*((*(Ld.ptr<float>(i + 1) + j)) - (*(Ld.ptr<float>(i)+j)));
- float yneg = ((*(c.ptr<float>(i - 1) + j)) + (*(c.ptr<float>(i)+j)))*((*(Ld.ptr<float>(i)+j)) - (*(Ld.ptr<float>(i - 1) + j)));
- *(Lstep.ptr<float>(i)+j) = 0.5f*stepsize*(xpos - xneg + ypos - yneg);
- }
- }
+ cv::parallel_for_(cv::Range(1, Lstep.rows - 1), Nld_Step_Scalar_Invoker(Ld, c, Lstep, stepsize));
for (int j = 1; j < Lstep.cols - 1; j++) {
float xpos = ((*(c.ptr<float>(0) + j)) + (*(c.ptr<float>(0) + j + 1)))*((*(Ld.ptr<float>(0) + j + 1)) - (*(Ld.ptr<float>(0) + j)));