OPENCV中sobel算子x和y方向上梯度的合成问题

import cv2
import numpy as np  
img = cv2.imread("lena.jpg", 0)
x = cv2.Sobel(img,cv2.CV_16S,1,0)
y = cv2.Sobel(img,cv2.CV_16S,0,1)
absX = cv2.convertScaleAbs(x)   
absY = cv2.convertScaleAbs(y)
resule = cv2.addWeighted(absX,0.5,absY,0.5,0)  # result = 0.5x + 0.5y

请问为什么不是用均方根呢?

result_new = np.sqrt(x * x + y * y)
result_new = np.rint(result_new).astype(np.uint8)
cv2.imshow("new",result_new)  # 出来结果不一致,好像是错误的

Sobel算子可以用来计算图像的梯度信息,其中梯度指的是图像中像素灰度值的变化率。在x和y方向上计算梯度可以分别得到两张图像,分别表示x和y方向上的梯度信息。如果要将这两张图像合成,可以使用cv2.addWeighted函数。

  • 在上面的代码中,result = cv2.addWeighted(absX,0.5,absY,0.5,0)表示将absX和absY两张图像按权重0.5进行加权平均得到一张图像,即result = 0.5 * absX + 0.5 * absY。
  • 如果要使用均方根的方式将x和y方向的梯度合成,可以使用result_new = np.sqrt(x * x + y * y)。这里先将x和y分别平方,然后将两张图像的平方和开方,得到一张图像。
  • 在使用均方根合成时,可能会出现结果不一致的情况。这是因为使用均方根合成梯度信息会比使用加权平均的方式更加复杂,其结果也更加不确定。在实际使用中,应该根据实际情况选择合适的方法。

可以用均方根,或者说准确的说应该使用均方根。
但是,均方根的计算量大,耗时较长。所以在工程上,在 absX 和 absY 的取值范围,可以直接用加法代替均方根。
因为 SobelX 和 SobelY 的绝对值大小并不重要,我们关心的主要是其相对大小。