gpt4 book ai didi

python - 解决 cv2::filter2D() 中对负值的抑制

转载 作者:行者123 更新时间:2023-12-02 16:17:50 25 4
gpt4 key购买 nike

我正在使用卷积来计算图像中的梯度。为此,我使用了 OpenCV 的 cv2.filter2D()函数,用 Python 实现。我还编写了一个简单地迭代所有像素的(慢速)实现。输入图像img是使用 cv2.cvtColor() 从 RGB 转换为 YUV 的 .JPG 图像并使用 OpenCV 函数 cv2.split() 进行拆分.我的代码摘要(仅计算一个颜色 channel )是:

imgYUV = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
clr1, clr2, cl3 = cv2.split(imgYUV)
(iH,iW) = clr1.shape[:2]
pad=1
paddedImg = cv2.copyMakeBorder(clr1,pad,pad,pad,pad,cv2.BORDER_REPLICATE)
outputMyImplementation = np.zeros((iH,iW), dtype='int32')
kernel = np.array([[-1,-2,-1],[0,0,0],[1,2,1]])
for y in np.arange(pad, iH+pad):
for x in np.arange(pad, iW+pad):
roi = paddedImg[y-pad:y+pad+1, x-pad:x+pad+1]
k = (roi*kernel).sum()
outputMyImplementation[y-pad,x-pad] = k
outputCV2 = cv2.filter2D(clr1,-1,kernel)
但是,filter2D 似乎从输入图像中修剪了负值:
  • 使用 filter2D() 的最大值:66
  • 使用我的 implementation() 的最大值:66
  • 使用 filter2D() 的最小值:0
  • 使用我的 implementation() 的最小值:-146

  • 使用翻转内核 kernel = np.array([[1,2,1],[0,0,0],[-1,-2,-1]])结果是:
  • 使用 filter2D() 的最大值:146
  • 使用我的 implementation() 的最大值:146
  • 使用 filter2D() 的最小值:0
  • 使用我的 implementation() 的最小值:-66

  • 很明显,负值被抑制了。 cv2.filter2D() 中的所有默认设置对我来说很好,这就是为什么我使用最少的参数。文档没有提到这种行为,并且多个论坛建议不应该压制负值。有人知道为什么会发生这种情况,以及如何解决吗?我有一个解决方法,将内核的结果相加,它是翻转的变体,但这似乎是一个简单问题的糟糕解决方案。
    版本信息:
  • openCV版本 4.4.0.44
  • numpy版本 1.19.2
  • python版本 3.8.5
  • 最佳答案

    解决方案在于输出的深度。通过将其设置为 -1,输入图像的深度用于输出。由于输入图像很可能是 uchar,因此它会饱和到 0。饱和到零的问题可以通过使用以下方法将输出类型设置为 cv2.CV_64F 来解决:outputCV2 = cv2.filter2D(img, cv2.CV_64F, kernel)为了得到与 outputMyImplementation 完全相同的答案,内核必须翻转 180 度。然而,在查看绝对值时,这不是必需的,并且可以按呈现的方式使用代码。

    关于python - 解决 cv2::filter2D() 中对负值的抑制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64318479/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com