【问题标题】:Why is there a significant difference in the output image on changing the ddepth parameter for Sobel operator?为什么更改 Sobel 算子的 ddepth 参数时输出图像会有显着差异?
【发布时间】:2019-06-13 10:25:43
【问题描述】:

我尝试使用OpenCV 进行边缘检测,但在应用Sobel 运算符时与ddepth 参数混淆。当输出图像的ddepth 与在这种情况下为CV_8U 的原始图像保持相同时,我得到的输出为

原图

但是当ddepth 参数保持为CV_64F 时,输出图像看起来像

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

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()

【问题讨论】:

    标签: python opencv image-processing opencv3.0 edge-detection


    【解决方案1】:

    造成差异的原因有两个:

    • 首先是显示器。 Opencv 的 imshow 只考虑浮点类型图像的 (0,1) 和 uint8 类型图像的 (0,255) 之间的值。对于浮动图像,任何大于 1 的值都将被视为 1。这就是为什么你看到大部分图像变成白色的原因。您可以通过cv2.imshow("sobelx3_64", sobelx3_64/255) 修复它,即在 (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.]]
    

    【讨论】:

      猜你喜欢
      • 2019-12-04
      • 1970-01-01
      • 2021-10-17
      • 2021-08-31
      • 2015-03-27
      • 2017-07-28
      • 2020-03-12
      • 1970-01-01
      • 2019-05-12
      相关资源
      最近更新 更多