2017-09-18 6 views
0

Étant donné le code followig:Supprimer les lignes segmentées (OpenCV, Python)

import numpy as np 
import cv2 

gray = cv2.imread('image.png') 
edges = cv2.Canny(gray,50,150,apertureSize = 3) 
cv2.imwrite('edges-50-150.jpg',edges) 
minLineLength=100 
lines = cv2.HoughLinesP(image=edges,rho=1,theta=np.pi/180, threshold=100,lines=np.array([]), minLineLength=minLineLength,maxLineGap=80) 

a,b,c = lines.shape 
for i in range(a): 
    cv2.line(gray, (lines[i][0][0], lines[i][0][1]), (lines[i][0][2], lines[i][0][3]), (0, 0, 255), 1, cv2.LINE_AA) 
    cv2.imwrite('houghlines.jpg', gray) 
    cv2.imshow('img', gray) 
    cv2.waitKey(0) 

je peux atteindre les lignes horizontales qu'il ya dans cette image (source):

src

C'est le résultat:

result

Comment puis-je supprimer les lignes qui sont en rouge? Ce que je veux accomplir est de supprimer ces lignes afin que l'image soit plus propre et prête à être utilisée par un autre processus. Le code provient de here.

+1

Chang e la couleur rouge (0, 0, 255) à blanc (255, 255, 255) –

+0

Aide un peu. Merci. Vous êtes bon aussi avec OpenCV? – Link

+0

Oui, j'ai travaillé sur la vision par ordinateur et le traitement d'image de 1,5 ans –

Répondre

2

Cochez ce lien http://docs.opencv.org/3.2.0/d1/dee/tutorial_moprh_lines_detection.html et de détecter les lignes horizontales. Ensuite, définissez les valeurs de pixel sur zéro contenant des lignes horizontales. Le code donné est en C++ mais vous pouvez facilement le convertir en Python.

Vous pouvez également rejeter des lignes horizontales à partir de vos lignes détectées en utilisant la pente des lignes. Exclure toutes les lignes ayant une pente presque égale à zéro.

Voici le code snippet vous pouvez utiliser (j'ai fait peu de changements dans votre code en fonction de la pente et la fermeture morphologique):

import numpy as np 
import cv2 

gray = cv2.imread('image.png') 
edges = cv2.Canny(gray,50,150,apertureSize = 3) 
cv2.imwrite('edges-50-150.jpg',edges) 
minLineLength=100 
lines = cv2.HoughLinesP(image=edges,rho=1,theta=np.pi/180, threshold=100,lines=np.array([]), minLineLength=minLineLength,maxLineGap=80) 

a,b,c = lines.shape 
for i in range(a): 
    x = lines[i][0][0] - lines [i][0][2] 
    y = lines[i][0][1] - lines [i][0][3] 
    if x!= 0: 
     if abs(y/x) <1: 
      cv2.line(gray, (lines[i][0][0], lines[i][0][1]), (lines[i][0][2], lines[i][0][3]), (255, 255, 255), 1, cv2.LINE_AA) 

se = cv2.getStructuringElement(cv2.MORPH_ELLIPSE , (3,3)) 
gray = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, se) 
cv2.imwrite('houghlines.jpg', gray) 
cv2.imshow('img', gray) 
cv2.waitKey(0) 

Entrée:

input

Sortie:

output

+0

Déjà utilisé le code converti en Python. C'est [ici] (https://stackoverflow.com/questions/46274961/removing-horizontal-lines-in-image-opencv-pyhton-matplotlib?noredirect=1#comment79515464_46274961) – Link

+0

J'ai modifié ma réponse. Si vous n'avez pas obtenu de résultat à l'aide d'opérations morphologiques, essayez d'exclure les lignes en fonction de la pente. – Jazz

+0

J'ai ajouté un extrait de code à ma réponse. Si votre problème n'est pas résolu, vous pouvez le vérifier. – Jazz