Comment obtenir la valeur de seuil de l'histogramme?
Je suis en train d'écrire une application Android dans OpenCV pour détecter des gouttes. Une tâche est au seuil de l'image de différencier les objets de premier plan de l'arrière-plan (voir l'image).
Il fonctionne très bien tant que l'image est connue et je peux passer manuellement une valeur de seuil à seuil()--dans cette image particulière, disons, 200. Mais en supposant que l'image n'est pas connue avec la seule connaissance qu'il y aurait une sombre arrière-plan solide et le plus léger des objets au premier plan comment puis-je dynamiquement comprendre la valeur de seuil?
Je suis venu à travers l'histogramme où je peux calculer la répartition de l'intensité de l'image en niveaux de gris. Mais je ne pouvais pas trouver une méthode pour analyser l'histogramme et choisir la valeur, où les objets d'intérêt (plus léger) se trouve. Qui est; je veux diffèrent évidemment le fond sombre des pointes de la plus claire de premier plan pointes--dans ce cas, au-dessus de 200, mais dans un autre cas peut être dire que, de 100 si les objets sont gris.
source d'informationauteur Tru | 2012-06-29
Vous devez vous connecter pour publier un commentaire.
Si toutes vos images sont comme ça, ou peut être apporté à ce style, je pense que cv2.THRESHOLD_OTSU, c'est à dire otsu est tresholding algorithme est un bon coup.
Ci-dessous est un exemple de l'utilisation de Python dans la commande de terminal :
ret
est la valeur de seuil est calculé automatiquement en fonction. Nous venons de passer " 0 " comme valeur seuil pour cette.J'ai eu 124 dans GIMP ( qui est comparable au résultat que nous avons obtenu). Et il supprime également le bruit. Voir résultat ci-dessous:
Si vous dites que le fond est sombre (noir) et le premier plan est plus léger, alors je vous recommande d'utiliser le Espace de couleurs YUV (ou tout autre YXX comme YCrCbetc.), parce que la première composante de ces espaces de couleurs est luminance (ou foudre).
Ainsi, après la Y canal est extrait (via le
extractChennel
fonction), nous devons analyser l'histogramme de cette chaîne (image):Voir la première (à gauche) bosse? Il représente les zones sombres (l'arrière-plan dans votre situation) sur votre image. Donc, notre objectif à présent est de trouver un segment de marché (en abcisse, c'est la partie rouge dans l'image) qui contient cette bosse. Évidemment, le point à gauche de ce segment est zéro. Le point de droit est le premier point d'où:
J'ai dessiné une ligne verticale verte pour indiquer l'emplacement de la pointe de droite du segment dans cet histogramme.
Et c'est tout! Ce point de droit de l'segment est nécessaire de seuil. Voici le résultat (epsilon est de 10 et la valeur calculée seuil est de 50):
Je pense que ce n'est pas un problème pour vous de supprimer le bruit dans l'image ci-dessus.
Ce qui suit est une implémentation C++ de Abid réponse qui fonctionne avec OpenCV 3.x:
L'exécution de ce à l'encontre de l'image d'origine, je reçois le texte suivant:
OpenCV calculé une valeur de seuil de 122 pour elle, proche de la valeur Abid retrouve dans sa réponse.
Juste pour vérifier, j'ai changé l'image d'origine comme on le voit ici:
Et produits suivants, avec une nouvelle valeur de seuil de 178: