image - 使用 OpenCV 进行水平线检测

标签 image opencv image-processing computer-vision hough-transform

我正在尝试从来自“文档”的图像中找到水平线和垂直线。这些文件是契约(Contract)的扫描页,因此这些行看起来就像您在表格或契约(Contract) block 中看到的那样。

我一直在尝试使用 OpenCV 来完成这项工作。 OpenCV 中的霍夫变换实现似乎对这项工作很有用,但我找不到任何参数组合可以让它清楚地找到垂直线和水平线。我尝试使用和不使用边缘检测。没有运气。如果有人做过类似的事情,我很想知道怎么做。

在此处查看我在 OpenCV 中使用 HoughP 进行实验前后的图像。这是我能做的最好的,http://dl.dropbox.com/u/3787481/Untitled%201.png

所以现在我想知道是否有另一种变换可以让我可靠地找到水平线和垂直线(最好还有虚线)。

我知道这个问题是可以解决的,因为我有 Nuance 和 ABBYY OCR 工具,它们都可以可靠地提取水平线和垂直线,并返回线的边界框。

谢谢! 帕特里克。

最佳答案

您是否看过 HoughLinesP 中的代码示例?功能文档?

我认为您可以将其用作算法的起点。要选择水平和垂直线,您只需按线角过滤掉其他线。

更新:

如我所见,您需要找到的不是线条,而是页面上的水平和垂直边缘。对于此任务,您需要组合多个处理步骤才能获得良好的结果。

对于您的图像,我可以通过将 Canny 边缘检测与 HoughLinesP 相结合来获得良好的结果。这是我的代码(我用过 python,但我想你明白了):

img = cv2.imread("C:/temp/1.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 80, 120)
lines = cv2.HoughLinesP(edges, 1, math.pi/2, 2, None, 30, 1);
for line in lines[0]:
    pt1 = (line[0],line[1])
    pt2 = (line[2],line[3])
    cv2.line(img, pt1, pt2, (0,0,255), 3)
cv2.imwrite("C:/temp/2.png", img)

结果如下:

关于image - 使用 OpenCV 进行水平线检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7227074/

相关文章:

android + 通用图像加载器 : show custom marker with image in google map

c++ - Opencv VideoWriter 只保存一帧

python - 从精巧的边缘获取边界并删除图像的背景

java - 从图像中获取手写文本

python - 在 python 中的绘图中的自定义线之间放置图像

c++ - 使用 OpenCV C++ 进行 Tensorflow 2 对象检测

android - Android-找不到* .apk

c - 模块化出了问题

image-processing - 条码阅读器程序 : barcode Identification methods

c# - 如何从 System.Drawing.Imaging.ImageFormat 获取 contentType