python - 根据线条分割图像

标签 python opencv

我拼命地尝试在 openCV 中找到使用 HoughLines 或任何其他方法检测线条的方法,我从文档图像开始,使用结构元素和腐 eclipse 来获取带有线条的二进制图像。

我设法获得了以下文件,但似乎无法获得在我看来(这可能是问题)的明显线条的HoughLines。关于如何继续前进或者我应该使用其他方法从头开始有什么想法吗?

最终目标是将文档的线条提取为单独的图像,然后尝试一些用于手写文本识别的 ML 算法。

Original file

File after erode and structural elem

最佳答案

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

lines = cv2.HoughLines(img_thr, 1, np.pi / 180, threshold=800)

其中 img_thr 是您的二进制图像,给出了很好的结果:

Extracted Lines

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

有一些问题需要解决,以使这个过程更加健壮:

  • 算法可能会为图像中的每行返回多行,因此需要对它们进行重复数据删除。
  • 可能存在一些误报线,因此您需要一些条件来删除它们。我认为查看线条的斜率和连续线条之间的距离应该可以解决问题。
  • cv2.HoughLinesthreshold 参数的效果很大程度上取决于图像分辨率,因此您应该在运行此过程之前将图像大小调整为某个恒定大小。

完整代码:

img_orig = url_to_image('/image/PXDKG.png') # orignal image
img_thr = url_to_image('/image/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)

关于python - 根据线条分割图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52916442/

相关文章:

python - 如何按列值选择行索引

opencv - 使用 openCV SVN 存储库

python - 如何找到最低位置的白色像素?

c++ - 将 Mat 转换为 **float

Python 使用原始文件名 Mechanize 下载文件

python - Python 中的自定义排序

python - 如何在Python中读取一般用户格式的矩阵

python - 循环和科拉茨猜想

python - 与具有相同模板的多个图像进行模板匹配

python - 从api django输入后运行一些功能