如何在OpenCV中过滤不使用Sobel滤波器的行

1 投票
1 回答
2258 浏览
提问于 2025-04-17 02:51

我正在尝试用线性滤波器来检测图像中的线条。我第一次尝试的方法是旋转一个滤波器,但效果不好:

kernel = zeros((13,13))
kernel60 = zeros((13,13))

kernel[4] = [0,0,0,0,-1,-1,-1,-1,-1,0,0,0,0]
#kernel[5] = [0,0,0,0,0]
kernel[6] = [0,0,0,0,2,2,2,2,2,0,0,0,0]
#kernel[7] = [0,0,0,0,0]
kernel[8] = [0,0,0,0,-1,-1,-1,-1,-1,0,0,0,0]

rotate60 = zeros((2,3))
GetRotationMatrix2D((6,6),60,1, rotate60)
WarpAffine(kernel,kernel60,rotate60,CV_WARP_FILL_OUTLIERS, ScalarAll(0))

之后,我准备了一个滤波器,它是两个Sobel滤波器的线性组合(可调滤波器)。这个方法有效,但我更希望能找到一个不是Sobel滤波器的滤波器,类似于我第一次尝试的那种。有没有其他的替代方案?

Sobel滤波器组合:

kernel_x[0] = [-1,0,+1]
kernel_x[1] = [-1,0,+1]
kernel_x[2] = [-1,0,+1]

kernel_y[0] = [-1,-1,-1]
kernel_y[1] = [0,0,0]
kernel_y[2] = [+1,+1,+1]

normal_theta = radians(-30)
kernel = multiply(cos(theta),kernel_x) + multiply(sin(theta),kernel_y)

然后进行滤波处理:

Filter2D(src,dst,kernel)

我在Windows电脑上使用Python和numpy。

1 个回答

0

你可以使用Canny算法来检测边缘(它其实也用到了Sobel算子),然后用Hough变换来检测直线。在进行Canny处理之前先模糊一下图像,可以帮助去掉一些不必要的线条。这是一个经典的方法。你可以使用OpenCV,它实现了这两个部分。

可以参考以下链接:

Hough变换的维基百科页面

Canny边缘检测器的维基百科页面

这里是OpenCV实现的文档: OpenCV图像处理特征检测文档

在文档中可以找到cvHoughLines*函数,里面有示例代码。

撰写回答