web-dev-qa-db-fra.com

Comment sélectionner le meilleur ensemble de paramètres dans l'algorithme de détection Canny Edge implémenté dans openCV?

Je travaille avec openCV sur Android. Avec l'aide considérable de cette communauté et des techniciens, je suis en mesure de détecter avec succès une feuille hors de l'image. C'est l'étape que j'ai utilisée.

1.Imgproc.cvtColor()
 2.Imgproc.Canny()
 3.Imgproc.GausianBlur()
 4.Imgproc.findContours()
 5.Imgproc.approxPolyDP()
 6.findLargestRectangle()
 7.find the vertices of the rectangle
 8.find the vertices of the rectangle top-left anticlockwise order using center of mass approach
 9.find the height and width of the rectangle just to maintain the aspect ratio and do warpPerspective transformation.

Après avoir appliqué toutes ces étapes, je peux facilement obtenir le document ou le plus grand rectangle d'une image. Mais cela dépend fortement de la différence des intensités de l'arrière-plan et de la feuille de document. Comme Canny Edge fonctionne sur le principe du gradient d'intensité, une différence d'intensité est toujours supposée du côté de la mise en œuvre. C'est pourquoi Canny a pris en compte les différents paramètres de seuil.

  1. Thershold inférieur
  2. Heigher Thershold

Donc, si le gradient d'intensité d'un pixel est supérieur au seuil supérieur, il sera ajouté en tant que pixel Edge dans l'image de sortie. Un pixel sera complètement rejeté si sa valeur de gradient d'intensité est inférieure au seuil inférieur. Et si un pixel a une intensité entre le seuil inférieur et supérieur, il ne sera ajouté en tant que pixel Edge que s'il est connecté à tout autre pixel ayant une valeur supérieure au seuil supérieur.

Mon objectif principal est d'utiliser la détection Canny Edge pour la numérisation de documents. Je veux donc savoir comment calculer ces seuils de manière dynamique afin qu'il puisse fonctionner avec les deux cas de fond sombre et clair.

J'ai beaucoup essayé en ajustant manuellement les paramètres, mais je n'ai trouvé aucune relation associée aux scénarios.

J'espère que j'éclaircis mon point et merci d'avance

17
Ankur Gautam

Vous pouvez calculer vos seuils en utilisant méthode Ots

Le code (Python) ressemblerait à ceci:

high_thresh, thresh_im = cv2.threshold(im, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
lowThresh = 0.5*high_thresh
19
Mailerdaimon

Utilisez l'extrait suivant que j'ai obtenu de CE BLOG :

v = np.median(gray_image)

#---- apply automatic Canny Edge detection using the computed median----
lower = int(max(0, (1.0 - sigma) * v))
upper = int(min(255, (1.0 + sigma) * v))
edged = cv2.Canny(gray_image, lower, upper)
cv2.imshow('Edges',edged)

Alors qu'est-ce que je fais ici?

Je prends la valeur médiane de l'image en niveaux de gris. La valeur sigma de 0,33 est choisie pour définir le seuil inférieur et supérieur. La valeur 0,33 est généralement utilisée par les statisticiens pour la science des données. C'est donc aussi considéré ici.

3
Jeru Luke