代码之家  ›  专栏  ›  技术社区  ›  Suhail Gupta

为什么在改变Sobel算子的ddepth参数时,输出图像会有显著差异?

  •  0
  • Suhail Gupta  · 技术社区  · 6 年前

    我在尝试边缘检测 OpenCV 把我和 ddepth Sobel 接线员。当 深度 输出图像的大小与原始图像的大小保持一致 CV_8U 在这种情况下,我得到的输出是

    enter image description here

    对于原始图像

    enter image description here

    深度 参数保持为 CV_64F

    enter image description here

    你能帮我了解这里发生了什么事吗?

    import cv2
    
    img = cv2.imread("valve.png", 0)
    
    sobelx3_64 = cv2.Sobel(img, cv2.CV_64F,1,0,ksize=3)
    
    sobelx3_8 = cv2.Sobel(img, -1,1,0,ksize=3)
    
    cv2.imshow("sobelx3_64", sobelx3_64)
    
    cv2.imshow("sobelx3_8", sobelx3_8)
    
    cv2.waitKey(0)
    
    cv2.destroyAllWindows()
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Zaw Lin    6 年前

    造成这种差异的原因有两个:

    • cv2.imshow("sobelx3_64", sobelx3_64/255) i、 e在(0,1)内规格化它(但是看第二点,这不是完全正确的)。
    • print(sobelx3_8[0:3,0:3]);print(sobelx3_64[0:3,0:3]) . 这将产生以下结果。现在由于范围不同,sobel运算符的实际值大于255,但uint8类型不能适应480,因此opencv会将其饱和为255。与负值类似。

    [[  0 200 255]
     [  0 131 255]
     [  0   0 255]]
    [[   0.  200.  480.]
     [   0.  131.  425.]
     [   0.   -4.  316.]]