【问题标题】:How to filter lines without Sobel filter in OpenCV如何在 OpenCV 中过滤没有 Sobel 过滤器的行
【发布时间】:2011-09-22 15:18:24
【问题描述】:

我正在尝试仅使用线性过滤器来检测线条。我的第一次尝试是像这样旋转内核,但不起作用:

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。

【问题讨论】:

  • 仅供参考:OpenCV 提供了特殊的Sobel 函数用于使用 Sobel 内核进行过滤。
  • 这正是我不喜欢这个解决方案的原因,它只是一个以不同方式应用的清醒过滤器。

标签: python opencv computer-vision


【解决方案1】:

您可以使用 Canny 算法进行边缘检测(无论如何都使用 Sobel)和 Hough 变换进行线检测。在 Canny 之前执行模糊有助于消除异常线。这是经典的方法。您可以使用实现这两个部分的 OpenCV。

请参阅以下内容:

http://en.wikipedia.org/wiki/Hough_transform

http://en.wikipedia.org/wiki/Canny_edge_detector

以下是 OpenCV 实现的文档: http://opencv.willowgarage.com/documentation/cpp/imgproc_feature_detection.html

见 cvHoughLines* 函数有示例代码

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-19
    • 2019-03-27
    • 2019-03-11
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多