2017-09-28 3 views
1

Ich habe diese Quelle Bild:HoughLines Verbesserung für horizontale Linien erkennen (Python, OpenCV)

src

Mein Ziel ist es, die untere Zeile zu entfernen, während die Buchstaben/Zahlen unberührt bleiben.

Dies ist der Code, den ich verwenden:

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) 

Das beste Ergebnis, das ich jetzt dies erreicht:

out

Wie kann ich es weiter zu verbessern, um das Bild zu reinigen, so viel wie möglich ? Zum Beispiel alle Trümmer rund um das Bild, Punkte und (noch) Linien unter den Wörtern, wie kann ich sie entfernen?

Vielen Dank.

OT: gibt es eine Möglichkeit, eine Trackbar von diesem zu erstellen, die die Parameter ändern (ApertureSize, MinLineLength, MaxLineGap usw.), um Ergebnisse in Echtzeit zu sehen?

+0

Haben Sie sich Gedanken über eine OCR über die Spitze läuft und mit den von der gesammelten Daten alles andere weiß zu machen? – GPPK

+0

In der Tat ja. Ich habe gestern OCR verwendet, um die Zeichen zu extrahieren und alles andere zu löschen. Aber, wie Sie sehen können, hier sind Handschrift-Zeichen und OCR einfach scheitern hier. Ist das meinst du? – 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

Antwort

1

Per @Link ‚s Anfrage:

ich Erfahrung in Python begrenzt haben, damit ich nicht wissen, wie threadsicher dieser Code ist, aber das sollte Ihnen die Grundlagen zum Erstellen von Trackbars in Python OpenCV zeigen.

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

Es funktioniert ziemlich gut. Vielen Dank.Jetzt muss ich es studieren;) – Link

1

Sobald Sie die Liniensegmente von Hough haben, können Sie sie suchen, um diejenigen zu finden, die wahrscheinlich Teil der unteren Zeile sind (dh richtigen Winkel und Schnittpunkt), dann entfernen Sie alle schwarzen Punkte entlang dieser vorhergesagten Linie und nicht nur die gefundenen Segmente durch Hough.

Ein weiterer Tipp, versuchen Sie cv :: adaptivethreshold eher als canny und versuchen Sie eine kleine Gaußsche Unschärfe zuerst zu entfernen Hintergrundflecken.

Bearbeiten: Sie verwenden HoughP, die jedes Pfandsegment einzeln findet. Sie suchen nach einer einzelnen (unterbrochenen) Linie, daher wäre es wahrscheinlich besser, regulären Hough zu verwenden und aus den Ergebnissen die stärkste horizontale Linie in der unteren Hälfte des Bildes auszuwählen - löschen Sie dann alle Punkte in dieser Richtung.

ot: Der cv :: namedWindow ein trackbar haben kann, wo man leicht den Wert zurück kann

+0

Ich werde Schwelle und Gaussian tun, um zu sehen, was passiert, aber ich weiß nicht, wie man den ersten Teil tut, den Sie erklärten. Ich meine, was ich tun wollte, entlang der X-Koordinate alle Punkte erkennen und löschen. Auch Hough war die "beste" Empfehlung, die ich bis jetzt für diese Art von Arbeit hatte. BTW, ich werde versuchen, was du gesagt hast. – Link

Verwandte Themen