首页 > 解决方案 > 如何在 OpenCV 中计算图像的散度和梯度?

问题描述

我知道要实现以下 在此处输入图像描述

我会使用这段代码:

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梯度是拉普拉斯算子,下面的代码是否等同于第二个方程?

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

标签: opencvgradient

解决方案


推荐阅读