首页 > 解决方案 > 使用 opencv 的 Sobel 滤波器逼近真实的高度图梯度幅度

问题描述

我有一个表示网格采样高度函数的图像 ( cv::Mat, type )。网格每像素CV_32F具有恒定的栅格。(dx,dy)

我想估计它的梯度幅度。使用 OpenCV 的 Sobel 滤波器,我近似于这样的导数:

dfdx=zz.Sobel(zz,cv2.CV_32F,1,0,ksize=3,scale=?)
dfdy=zz.Sobel(zz,cv2.CV_32F,0,1,ksize=3,scale=?)
gradMag=np.sqrt(dfdx**2+dfdy**2)

scale参数几乎没有记录,但查看源代码,它用于乘以导数内核,即(-1,0,1)用于有限差分。使用 3x3 Sobel 内核,我假设比例应该是 1/2*dx 或 1/2*dy(有限差分 scehme)以获得真实比例的导数,但情况似乎并非如此:我正在测试这个在具有不同光栅但没有得到一致结果的半球合成图像上。

应该如何使用比例来合并栅格尺寸,从而获得真正的导数估计?

标签: opencvderivativesobel

解决方案


比例必须等于 0.25,从这里开始:OpenCV 的 Sobel 过滤器 - 为什么它看起来如此糟糕,尤其是与 Gimp 相比?

内核的归一化除数可以通过以下公式计算:

enter code heref = max(abs(sumNegative), abs(sumPositive))

其中 sumNegative 是内核中负值的总和,而 sumPositive 是内核中正值的总和。


推荐阅读