如何在OpenCV中计算图像的散度和梯度?

时间:2018-09-26 23:18:49

标签: opencv gradient

我知道要实现以下目标 enter image description here

我将使用以下代码:

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中实现以下等式:

enter image description here

我知道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是拉普拉斯算子,下面的代码是否等效于第二个方程式?

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);

0 个答案:

没有答案