Calcul automatique de bas et de haut seuils pour le Savant opération dans opencv
Dans openCV, le bas et le haut des seuils pour le savant de l'opérateur sont obligatoires:
cvCanny(input,output,thresh1,thresh2)
Dans Matlab, il y a une option pour calculer ces automatiquement:
edge(input,'canny')
J'ai regardé dans Matlab code du bord, et ce n'est vraiment pas simple à calculer ces automatiquement.
Êtes-vous au courant de toute mise en œuvre du savant opérateur automatique de calcul du seuil pour opencv?
grâce
- Pouvez-vous poster le code Matlab qui fait cela?
Vous devez vous connecter pour publier un commentaire.
Je suis tombé sur cette réponse alors que je cherchais un moyen pour générer automatiquement Habile de valeurs de seuil.
Espère que cela aide quelqu'un qui vient les chercher pour une bonne méthode pour la détermination automatique des valeurs de seuil pour les Futés de l'algorithme...
Si votre image se compose de distinct de premier plan et d'arrière-plan, puis le bord de l'objet au premier plan pouvez utiliser extraites par ce qui suit:
Calculer Otsu du seuil de l'aide:
Nous n'avons pas besoin de la
_img
. Nous sommes intéressés uniquement par leotsu_thresh_val
mais malheureusement, il n'existe actuellement aucune méthode dans OpenCV qui vous permet de ne calculer que la valeur de seuil.Utiliser le Otsu seuil de la valeur seuil plus élevé et la moitié de la même façon que le seuil inférieur pour les Futés de l'algorithme.
Plus d'informations liées à ce qui peut être trouvé dans ce papier: L'Étude sur L'Application de la Méthode d'Otsu en Habile Opérateur. L'explication de Otsu de la mise en œuvre peut être trouvé ici.
Vous pouvez utiliser la valeur moyenne de la votre entrée en niveaux de gris de l'image et de définir des seuils inférieur et supérieur à l'aide de l'écart-type.
Vous pouvez avoir des explications plus détaillées et d'opencv code ici:
http://www.kerrywong.com/2009/05/07/canny-edge-detection-auto-thresholding/
Aussi, il y a le code pour faire cela automatiquement, par la mise en au OpenCV construire. Je l'ai trouvé sur le OpenCV-liste de diffusion des utilisateurs, donc pas garanties. 🙂
Discussion: http://opencv-users.1802565.n2.nabble.com/Automatic-thresholding-in-cvCanny-td5871024.html
GitHub (code): https://gist.github.com/756833
Consultez ce lien: http://www.pyimagesearch.com/2015/04/06/zero-parameter-automatic-canny-edge-detection-with-python-and-opencv/
Ils mettent en œuvre une solution similaire à l'aide de statistiques de base pour déterminer les haut et bas seuil pour les Futés de détection de contours.
J'ai regardé dans le code source de Matlab Savant détection de bord et j'ai réussi à l'écrire en Java avec OpenCV 3.
Le chemin est le lieu de sortie des images. Et l'image d'entrée doit être d'une échelle de gris de l'image avec U8 type de données.
Le principe de base est d'écarter nonEdgeRate(60%) des pixels non-edge pixel de la luminosité. Un histogramme est utilisé pour trier la luminosité et le seuil supérieur sera réglé de sorte qu'il y a 60% de pixels en dessous. Le seuil inférieur est fixé en multipliant le seuil supérieur par le thresholdRate(0.6).
Noter que le double nonEdgeRate = 0,6 et double thresholdRate = 0.6 est réglé par moi-même dans mon cas d'utilisation spécifiques. Th valeurs d'origine sont de 0,7 et 0,4 séparément dans matlab.
J'ai une autre approche pour le même problème. Cette solution implique également la sélection optimale des seuils de détection de bord.
la valeur de l'échelle de gris de l'image.
Au pseudo-code vous montre comment il faut faire:
Fixer ces seuils des paramètres dans le savant détection de bord de la fonction.
Illustration: Si vous observez une courbe de Gauss dans les statistiques, les valeurs entre 0.33 des deux côtés de la courbe sont considérés dans la distribution. Toute valeur en dehors de ces points sont supposés être des valeurs aberrantes. Puisque les images sont considérées comme des données, ce concept est supposé ici.
Que Luca Del Tongo a suggéré, vous pouvez calculer les seuils de gris de l'image, par exemple, en Java à l'aide d'OpenCV...
threshold1 = mu - stddev
etthreshold2 = mu + stddev