python - 为什么 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)
解决方案
推荐阅读
- r - 如何将图像设置为R中极坐标中条形图的标签
- terraform - Terraform remote-exec:“错误:操作太早,设备尚未播种或设备模型未确认”
- sorting - Google表格:在表格之间移动行和排序时如何处理过滤视图?
- yocto - 安装共享库依赖问题的 Yocto 配方
- javascript - 如何从Vue中的组件重新加载数据?
- arrays - 字典的Swift数组,如何检查任何一个元素的值大于“一”
- ios - 如何将随机数转换为字符串?
- javascript - Socket.io 客户端似乎连接到同一服务器上的不同套接字
- swiftui - 在一年的最后一周,一年的周数变为 1
- java - 如何将返回的 ArrayList 中的 TextArea 添加到框架中?