2016-09-28 7 views
5

J'essaie d'obtenir un seuil de l'échiquier d'étalonnage. Je ne peux pas détecter directement les coins de l'échiquier car il y a de la poussière car j'observe un micro échiquier. J'essaie plusieurs méthodes et HoughLinesP semble être l'approche la plus simple. Mais les résultats ne sont pas bons, comment améliorer mes résultats?Python Comment détecter les lignes verticales et horizontales dans une image avec HoughLines avec OpenCV?

import numpy as np 
import cv2 

img = cv2.imread('lines.jpg') 
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 
edges = cv2.Canny(gray,50,150,apertureSize = 3) 
print img.shape[1] 
print img.shape 
minLineLength=100 
lines = cv2.HoughLinesP(image=edges,rho=0.02,theta=np.pi/500, threshold=10,lines=np.array([]), minLineLength=minLineLength,maxLineGap=100) 

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

Comme vous pouvez le voir sur la figure ci-dessous, je ne peux pas obtenir mon jeu d'échecs, les lignes sont tracées dans beaucoup de directions ... (l'image d'origine: https://s22.postimg.org/iq2b91xq9/droite_Image_00000.jpg)

enter image description here

+0

Utilisez seuillage, ou tentent de réduire les petits points (Erode, dilatent). – linusg

+0

J'essaie déjà mais pas couplé avec des lignes de hough. Peut-être que cela pourrait aider à obtenir les lignes? merci pour votre hellp;) – user3601754

+0

Je voudrais vraiment faire un autre essai de seuillage! – linusg

Répondre

15

Vous utilisez une valeur trop faible pour rho.

Essayez le code ci-dessous: -

import numpy as np 
import cv2 

gray = cv2.imread('lines.jpg') 
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), 3, cv2.LINE_AA) 
    cv2.imwrite('houghlines5.jpg',gray) 

Notez le changement de valeur rho, la valeur pi et maxLineGap pour réduire les valeurs aberrantes.

image d'entrée Input Image

Arêtes image Edges Image

image de sortie Output Image

+0

comment enregistrer l'image sans les lignes rouges? Je voudrais avoir l'image sans toutes les lignes. Merci – Link

+1

@Link - Je ne suis pas sûr de ce que vous entendiez par image sans les lignes. Si vous avez juste besoin de sortir l'image originale, utilisez 'cv2.imwrite ('imagename.jpg', gris)', avant de dessiner des lignes, c'est-à-dire avant d'exécuter la commande 'cv2.line' et d'utiliser' imwrite' en dehors de la boucle. – saurabheights

0

I J'écrirais plutôt ceci comme un commentaire mais malheureusement je ne peux pas. Vous devriez changer minLineLength et minLineGap. Ou si c'est juste que vous devez trouver, je voudrais obtenir toutes les lignes et vérifier les angles entre eux pour obtenir des lignes seulement le long des carrés. J'ai déjà travaillé avec HoughLineP et c'est basé sur les deux arguments ci-dessus. En outre, essayez d'utiliser le filtrage bilatéral. J'aide vraiment quand l'affûtage en utilisant le filtre médian n'aide pas.

Bilateral Filter

-1

dans le traitement des images, ils sont des rôles que vous devez passer par tels que les filtres avant d'aller pour la détection des bords, dans votre état la poussière est juste un bruit que vous devez enlever par le filtre, l'utilisation Gausse ou blure après cette utilisation de seuillage, puis utiliser canny pour les bords et en option ils sont la détection de cornere que vous pouvez utiliser, ou vous pouvez simplement aller pour le point clé après seuil si je ne me trompe pas .. essayer de faire ces étapes et voir la resulte