首页 > 解决方案 > 为什么 Sobel 滤波器实现不能正确检测图像的边缘?

问题描述

我正在尝试使用 opencv 实现 Sobel 过滤器。但是,没有得到预期的边缘检测图像。

使用 cv2.getDerivKernels() 获取 x 和 y 方向的相应内核。然后 sepFilter2D() 用于应用内核分别获得 x 方向和 y 方向的导数。然后,找出导数的大小并与阈值进行比较,得到边缘检测图像。

x 和 y 方向的导数分别绘制,给出了预期的结果。但最终的结果并不是预期的。请通过下面提供的代码。

阈值可能有问题,因为我把它取为 200,但也尝试了较小的值,仍然没有好的结果。不确定如何决定采用什么阈值。

# Kernels for derivatives in x direction
kx1,kx2 = cv2.getDerivKernels(0,1,5)
img_x = cv2.sepFilter2D(image,ddepth=-1,kernelX=kx2,kernelY=kx1)

# Kernels for derivatives in y direction
ky1,ky2 = cv2.getDerivKernels(1,0,5)
img_y = cv2.sepFilter2D(image,ddepth=-1,kernelX=ky1,kernelY=ky2)

# Magnitude
magnitude = np.sqrt((img_x * img_x) + (img_y * img_y))
magnitude *= 255.0/np.max(magnitude)
mag = magnitude.astype("uint8")

# Compare with a threshold value
final_mag = np.zeros(mag.shape,dtype="uint8")
for i in range(mag.shape[0]):
    for j in range(mag.shape[1]):
         if mag[i,j]<200:
             final_mag[i,j] = 0
         else:
             final_mag[i,j] = 255
cv2.imshow("final_mag",final_mag)

标签: pythonpython-3.xopencvcv2

解决方案


推荐阅读