Python 按直线分割图像

Python 按直线分割图像,python,opencv,Python,Opencv,我拼命想在openCV中找到我的方法,使用HoughLines或任何其他方法来检测线条,我从文档图像开始,使用结构元素和腐蚀来获得带有线条的二值图像 我设法获得了下面的文件,但似乎无法获得在我看来(这里可能是问题所在)作为明显的行之后的HoughLines。有没有关于如何前进的想法,或者我应该使用其他方法从头开始 最终目标是将文档中的行提取为单独的图像,然后尝试使用ML算法进行手写文本识别 我认为Hough线应该适用于你的情况。运行 lines = cv2.HoughLines(img_thr

我拼命想在openCV中找到我的方法,使用HoughLines或任何其他方法来检测线条,我从文档图像开始,使用结构元素和腐蚀来获得带有线条的二值图像

我设法获得了下面的文件,但似乎无法获得在我看来(这里可能是问题所在)作为明显的行之后的HoughLines。有没有关于如何前进的想法,或者我应该使用其他方法从头开始

最终目标是将文档中的行提取为单独的图像,然后尝试使用ML算法进行手写文本识别


我认为Hough线应该适用于你的情况。运行

lines = cv2.HoughLines(img_thr, 1, np.pi / 180, threshold=800)
其中,
img\u thr
是您的二值图像,结果非常好:

这些线可以按左端的y坐标排序(例如),然后两条连续的线将形成一个矩形,可以使用
cv2.perspectiveTransform
提取矩形

有几个问题需要解决,以使该程序更加可靠:

  • 算法可以为图像中的每一行返回多行,因此需要消除重复
  • 可能存在一些假阳性行,因此您需要一些条件来删除它们。我认为观察直线的坡度和连续直线之间的距离应该可以完成这项工作
  • cv2中
    threshold
    参数的效果。HoughLines
    在很大程度上取决于图像分辨率,因此在运行此过程之前,您应该将图像大小调整为某个恒定大小
完整代码:

img_orig = url_to_image('https://i.stack.imgur.com/PXDKG.png') # orignal image
img_thr = url_to_image('https://i.stack.imgur.com/jZChK.png')  # binary image
h, w, _ = img_thr.shape
img_thr = img_thr[:,:,0]

lines = cv2.HoughLines(img_thr, 1, np.pi / 180, threshold=800)
img_copy = img_orig.copy()
points = []
for rho,theta in lines[:, 0]:
    a, b = np.cos(theta), np.sin(theta)
    x0, y0 = a*rho, b*rho
    x1, x2 = 0, w
    y1 = y0 + a*((0-x0) / -b)
    y2 = y0 + a*((w-x0) / -b)
    cv2.line(img_copy,(int(x1),int(y1)),(int(x2),int(y2)),(255,0,0),4)
    points.append([[x1, y1], [x2, y2]])
points = np.array(points)

多么简单,我不知道我以前的参数从哪里来,但这是完美的,谢谢!