Я знаю, что для реализации следующего
я бы использовал этот код:
Mat o_k;
Mat Lapl;
double lambda;
Laplacian(o_k, Lapl, o_k.depth(), 1, 1, 0, BORDER_REFLECT);
Lapl = 1.0 - 2.0*lambda*Lapl;
Однако я пытаюсь реализовать в OpenCVследующее уравнение:
Я знаю, что термин div
, или дивергенция, будет таким, верно?
int ksize = parser.get<int>("ksize");
int scale = parser.get<int>("scale");
int delta = parser.get<int>("delta");
Sobel(res, sobelx, CV_64F, 1, 0, ksize, scale, delta, BORDER_DEFAULT);
Sobel(res, sobely, CV_64F, 0, 1, ksize, scale, delta, BORDER_DEFAULT);
div = sobelx + sobely;
Где res
- результат использования термина в скобках.Но как мне получить термин в скобках?
Или я делаю это неправильно?Будет ли div
выше фактически равным градиенту res
?Если так, то как мне получить расхождение?
РЕДАКТИРОВАТЬ:
По этой ссылке, величина также может быть вычислена как mag = abs(x) + abs(y)
: https://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/sobel_derivatives/sobel_derivatives.html#sobel-derivatives
И поскольку div
градиента является лапласианом, будет ли приведенный ниже код эквивалентен 2-му уравнению?
Sobel(res, sobelx, CV_64F, 1, 0, ksize, scale, delta, BORDER_DEFAULT);
Sobel(res, sobely, CV_64F, 0, 1, ksize, scale, delta, BORDER_DEFAULT);
convertScaleAbs( sobelx, abs_grad_x );
convertScaleAbs( sobely, abs_grad_y );
/// Total Gradient (approximate)
Mat mag;
addWeighted( abs_grad_x, 1, abs_grad_y, 1, 0, mag);
Laplacian(o_k, Lapl, o_k.depth(), 1, 1, 0, BORDER_REFLECT);
Mat top;
top = lambda * Lapl;
Mat result;
divide(top, mag, result);