Python 如何在OpenCV中过滤没有Sobel过滤器的行

Python 如何在OpenCV中过滤没有Sobel过滤器的行,python,opencv,computer-vision,Python,Opencv,Computer Vision,我试着用线性滤波器检测线条。我的第一次尝试是像这样旋转内核,但不起作用: 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,

我试着用线性滤波器检测线条。我的第一次尝试是像这样旋转内核,但不起作用:

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。

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

见下文:

以下是OpenCV实现的文档:


请参阅cvHoughLines*函数,其中有示例代码

FYI:OpenCV提供了使用Sobel内核进行过滤的特殊功能。这正是我不喜欢此解决方案的原因,它只是一个以不同方式应用的清醒过滤器。