opencv的sobel函数求梯度问题,求出的梯度值异常

时间:2022-09-26 09:54:11
用opencv中的sobel函数求图像的梯度,代码如下:

    Sobel(src, grad_x, src.depth(), 1, 0);
convertScaleAbs(grad_x,grad_absx);

Sobel(src, grad_y, src.depth(), 0, 1);
convertScaleAbs(grad_y,grad_absy);

//addWeighted( grad_absx, 0.5, grad_absy, 0.5, 0, grad);

pow(grad_absx,2.0f,grad_absx);
pow(grad_absy,2.0f,grad_absy);
add(grad_absx,grad_absy,grad,noArray(),CV_64FC1);
pow(grad,0.5f,grad);

原图像为:
opencv的sobel函数求梯度问题,求出的梯度值异常
输出的grad显示为:
opencv的sobel函数求梯度问题,求出的梯度值异常
可以看出来梯度处理的不对。另外矩阵grad的右下角数据明显异常(对应图像的右下角),正常值应该在0~255范围内,而右下角大量异常值,如2.5327E+176。如下图,其中单数列为梯度值。
opencv的sobel函数求梯度问题,求出的梯度值异常
如果用上述代码中的addWeighted()语句求梯度,grad显示如下:
opencv的sobel函数求梯度问题,求出的梯度值异常
这个图像貌似正常点,但是求出的梯度值又明显不对,如下图:
opencv的sobel函数求梯度问题,求出的梯度值异常

代码中的方法是按sobel算子定义来的,grad是grad_absx和grad_absy的平方根,为什么算出来的结果显示得很不对,而addWeighted()的方法显示就比较对。另外为什么求出的结果中有那么多异常值?
求大神来解惑。

1 个解决方案

#1


grad_absx 和 grad_absy的像素是浮点表示的吗?最终结果出现非数值的情况应该是执行 pow(grad,0.5f,grad); 之前,grad含有负数

#1


grad_absx 和 grad_absy的像素是浮点表示的吗?最终结果出现非数值的情况应该是执行 pow(grad,0.5f,grad); 之前,grad含有负数