【问题标题】:Improve HoughLines for horizontal lines detect (Python, OpenCV)改进水平线检测的 HoughLines (Python, OpenCV)
【发布时间】:2017-09-28 15:15:19
【问题描述】:

我有这个源图片:

我的目标是删除底线,同时保持字母/数字不变。

这是我使用的代码:

import cv2
import numpy as np

img = cv2.imread('src.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

edges = cv2.Canny(gray,100,200,apertureSize = 5)

minLineLength = 0
maxLineGap = 19
lines = cv2.HoughLinesP(edges,1,np.pi/180,15,minLineLength,maxLineGap)
for x in range(0, len(lines)):
    for x1,y1,x2,y2 in lines[x]:
        cv2.line(img,(x1,y1),(x2,y2),(255,255,255),2)

cv2.imshow('hough',img)
cv2.waitKey(0)

我目前取得的最好成绩是这样的:

我怎样才能更好地改进它,尽可能地清洁图像? 比如图像周围的所有杂物,文字下的点和(静止的)线,我该如何去除它们?

谢谢。

OT:有没有办法创建一个这样的轨迹栏来更改参数(apertureSize、minLineLength、maxLineGap 等)以实时查看结果?

【问题讨论】:

  • 您是否考虑过在顶部运行 OCR 并使用从中收集的数据将其他所有内容变为白色?
  • 事实上是的。考虑到这一点,我昨天使用了 OCR,试图提取字符并删除其他所有内容。但是,正如您所看到的,这里有手写字符,而 OCR 根本就失败了。这是你的意思吗?
  • 谢谢,我会尝试将其转换为 Python。 (几乎)不了解 C++ :)
  • @Zindarod 你知道如何将上面的代码实现到 trackbar 中吗?

标签: python opencv hough-transform houghlinesp


【解决方案1】:

根据@Link 的要求:

我在 python 方面的经验有限,所以我不知道这段代码的线程安全性如何,但这应该向您展示在 python OpenCV 中创建跟踪栏的基础知识。

def onChange(pos):
    global img
    global gray
    global dst

    dst = np.copy(img)

    apertureSize = cv2.getTrackbarPos("ApertureSize", "Result")
    minLineLength = cv2.getTrackbarPos("LineLength", "Result")
    maxLineGap = cv2.getTrackbarPos("LineGap", "Result")

    # according to OpenCV, aperture size must be odd and between 3 and 7
    if apertureSize % 2 == 0:
        apertureSize += 1
    if apertureSize < 3:
        apertureSize = 3

    edges = cv2.Canny(gray,100,200,apertureSize = apertureSize)

    lines = cv2.HoughLinesP(edges,1,np.pi/180,15,minLineLength,maxLineGap)
    for x in range(0, len(lines)):
        for x1,y1,x2,y2 in lines[x]:
            cv2.line(dst,(x1,y1),(x2,y2),(255,255,255),2)

#Run Main
if __name__ == "__main__" :

    img = cv2.imread("image.png", -1)
    dst = np.copy(img)

    cv2.namedWindow("Result", cv2.WINDOW_NORMAL)

    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

    #default values for trackbars
    defaultApertureSize = 5
    minLineLength = 0
    maxLineGap = 19

    # according to OpenCV, aperture size must be odd and between 3 and 7
    # the aperture size range is (0 - 6)
    cv2.createTrackbar("ApertureSize", "Result", defaultApertureSize, 6, onChange)

    # line length range is (0 - 10)
    cv2.createTrackbar("LineLength", "Result", minLineLength, 10, onChange)

    # line gap range is (0 - 19)
    cv2.createTrackbar("LineGap", "Result", maxLineGap, 19, onChange)

    while True:
        cv2.imshow("Result", dst)
        key = cv2.waitKey(1)
        if key == ord('q'):
            break

    cv2.destroyAllWindows()

【讨论】:

    【解决方案2】:

    从 Hough 获得线段后,您可以搜索它们以找到可能是底线一部分的线段(即正确的角度和截距),然后删除这条预测线上的所有黑点,而不仅仅是通过呵呵。

    另一个提示,尝试 cv::adaptivethreshold 而不是 canny,并尝试先做一个小的高斯模糊以去除背景斑点。

    编辑:您正在使用 HoughP 单独查找每个留置权段。您正在寻找一条(断线)线,因此使用常规 Hough 可能会更好,并从结果中选择图像下半部分最强的水平线 - 然后沿该方向擦除所有点。

    ot:cv::namedWindow 可以有一个trackbar,你可以很容易地取回值

    【讨论】:

    • 我会做阈值和高斯来看看会发生什么,但我不知道如何做你解释的第一部分。我的意思是,这就是我想做的,沿着 X 坐标检测所有的点并删除它们。此外,霍夫是迄今为止我对此类工作的“最佳”推荐。顺便说一句,我会试试你说的。
    猜你喜欢
    • 2017-02-06
    • 1970-01-01
    • 2011-11-05
    • 2019-09-28
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    相关资源
    最近更新 更多