提高HoughLines的水平线检测(Python的,OpenCV的)

问题描述:

我有这个源图像:提高HoughLines的水平线检测(Python的,OpenCV的)

src

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

这是我使用的代码:

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) 

我现在取得了最好的结果是这样的:

out

我怎样才能更好地改善它,给尽可能多的清洁影像尽可能? 例如,图像周围的所有碎片,单词下的点和(仍)行,我怎样才能删除它们?

谢谢。

OT:有没有一种方法可以创建一个跟踪栏来改变参数(apertureSize,minLineLength,maxLineGap等)以实时查看结果?

+0

您是否想过在顶部运行OCR并使用从其收集的数据将其他所有数据都变成白色? – GPPK

+0

其实是的。我使用了昨天的OCR,试图提取字符并删除其他所有内容。但是,正如你所看到的,这里有手写字符和OCR根本无法在此。 这是你的意思吗? – Link

+1

C++的TrackBar:http://docs.opencv.org/3.3.0/da/d6a/tutorial_trackbar.html 的Python的TrackBar:http://docs.opencv.org/3.3.0/d9/dc8/tutorial_py_trackbar.html – zindarod

按@link的要求:

我有限的经验,在蟒蛇所以不知道这个代码是如何安全线程的,但是这应该告诉你在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() 
+0

它工作得很好。谢谢。现在我必须研究它;) – Link

一旦你从霍夫线段您可以搜索他们找到可能是底线的一部分的那些(即正确的角度和拦截),然后卸下所有的黑点沿着这条预测线,而不是发现,只有段通过霍夫。

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

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

OT:简历:: namedWindow可以有一个trackbar在那里你可以很容易地回到价值

+0

我会做阈值和高斯来看看会发生什么,但我不知道如何做你解释的第一部分。我的意思是,我想要做的,沿着X坐标检测所有的点并删除它们。另外,霍夫是我迄今为止进行的这类工作中的“最佳”调教。顺便说一句,我会尝试你所说的。 – Link