python - 在OpenCV中如何在没有Sobel过滤器的情况下过滤线

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

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内核,还有其他选择吗?

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。

请参阅以下内容:

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 *函数有示例代码

https://stackoverflow.com/questions/7517208/

相关文章:

visual-studio-2010 - 使用Visual Studio 2010和C的串行通信(用

android - OpenCV和Android

opencv - 如何将OpenCV功能描述符标准化为整数比例?

opencv - 使用自定义内核的OpenCV散焦模糊?

android - android OpenCV-2.3.0 eclipse

opencv - 即使在彩色视频图像的情况下,nchannel() 也始终返回 1

opencv - 如何使用OpenCV源代码进行调试

image-processing - 将向量与图像中的边缘进行关联

opencv - 调整代码以检测多个圆圈,而不是OPENCV中的一个圆圈

opencv - cvCreateCameraCapture不起作用