Enabled parallel processing of the nld_step_scalar function
This commit is contained in:
parent
9fc90f4069
commit
e7e00201f1
@ -290,6 +290,48 @@ namespace cv {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
* @brief This function performs a scalar non-linear diffusion step
|
||||||
@ -303,18 +345,7 @@ namespace cv {
|
|||||||
*/
|
*/
|
||||||
void nld_step_scalar(cv::Mat& Ld, const cv::Mat& c, cv::Mat& Lstep, float stepsize) {
|
void nld_step_scalar(cv::Mat& Ld, const cv::Mat& c, cv::Mat& Lstep, float stepsize) {
|
||||||
|
|
||||||
#ifdef _OPENMP
|
cv::parallel_for_(cv::Range(1, Lstep.rows - 1), Nld_Step_Scalar_Invoker(Ld, c, Lstep, stepsize));
|
||||||
#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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int j = 1; j < Lstep.cols - 1; j++) {
|
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)));
|
float xpos = ((*(c.ptr<float>(0) + j)) + (*(c.ptr<float>(0) + j + 1)))*((*(Ld.ptr<float>(0) + j + 1)) - (*(Ld.ptr<float>(0) + j)));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user