【发布时间】:2018-10-21 14:39:34
【问题描述】:
我正在拼命地尝试在 openCV 中找到使用 HoughLines 或任何其他方法检测线条的方法,我从文档图像开始,使用结构元素和腐蚀来获得带有线条的二进制图像。
我设法获得了以下文件,但似乎无法获得在我看来(这可能是问题所在)作为明显线条的 HoughLines。关于如何前进或我应该使用其他方法从头开始的任何想法?
最终目标是将文档的行提取为单独的图像,然后尝试一些用于手写文本识别的 ML 算法。
【问题讨论】:
我正在拼命地尝试在 openCV 中找到使用 HoughLines 或任何其他方法检测线条的方法,我从文档图像开始,使用结构元素和腐蚀来获得带有线条的二进制图像。
我设法获得了以下文件,但似乎无法获得在我看来(这可能是问题所在)作为明显线条的 HoughLines。关于如何前进或我应该使用其他方法从头开始的任何想法?
最终目标是将文档的行提取为单独的图像,然后尝试一些用于手写文本识别的 ML 算法。
【问题讨论】:
我认为霍夫线应该适用于您的情况。跑步
lines = cv2.HoughLines(img_thr, 1, np.pi / 180, threshold=800)
img_thr 是您的二进制图像,结果非常好:
可以通过左端的y坐标(例如)对线条进行排序,然后两条连续的线条将形成一个矩形,可以使用cv2.perspectiveTransform提取。
有几个问题需要解决以使这个过程更加健壮:
cv2.HoughLines 中的threshold 参数的效果很大程度上取决于图像分辨率,因此您应该在运行此过程之前将图像大小调整为某个恒定大小。完整代码:
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)
【讨论】: