calcul de l'image
Je suis en train de développer une image en se concentrant algorithme pour certains d'automatisation des tests de travail. J'ai choisi d'utiliser AForge.net car il semble comme une belle maturité .net système convivial.
Malheureusement, je n'arrive pas à trouver de l'information sur la construction de l'autofocus des algorithmes à partir de zéro, donc j'ai donné le meilleur de moi-essayez:
prendre de l'image. appliquer sobel bord de filtre de détection, ce qui génère une échelle de gris de bord contour. générer un histogramme et enregistrer la norme dev. le mouvement de la caméra un pas de plus vers le sujet et prendre une autre photo. si la norme de dev est plus petite que la précédente, nous sommes de plus en plus à se concentrer. sinon, nous avons passé la distance optimale pour prendre des photos.
est-il un meilleur moyen?
mise à jour: ÉNORME faille dans ce, par la manière. comme je vous passé optimale de mise au point, mon image de "en bref" de la valeur continue de croître. vous attendez un parabolique-ish fonction de recherche à distance/mise au point-valeur, mais en réalité, vous obtenez quelque chose qui est plus logarithmique
mise à jour 2: ok, alors je suis retourné à ce et la méthode actuelle, nous explorons est donné un peu connu bords (ok, je sais exactement ce que les objets dans la photo), je fais un manuel de pixel d'intensité de comparaison. comme le graphe obtenu devient plus raide, je reçois au centre de l'attention. Je vais poster le code une fois que l'algorithme de base est porté à partir de matlab en c# (ouais, matlab.. :S)
mise à jour 3: yay dernière mise à jour. revint à nouveau. la version finale du code ressemble à ceci:
étape 1: obtenir une image à partir de la liste des images (j'ai pris une centaine de photos à travers le point focalisé)
étape 2: trouver un avantage pour l'objet que je me concentre (Dans mon cas sa un objet rectangulaire qui est toujours à la même place, donc je récolte un HAUT et ÉTROIT rectangle de bord)
étape 3: obtenir la HorizontalIntensityStatistics (Aforge.net classe) pour que l'image recadrée.
étape 4: obtenir l'Histogramme (gris, dans mon cas)
étape 5: calculer la dérivée des valeurs de l'histogramme
étape 6: lorsque la pente est la plus grande, c'est quand vous êtes dans le plus concentré point.
source d'informationauteur Oren Mazor
Vous devez vous connecter pour publier un commentaire.
Il peut être un peu simpliste pour vos besoins, mais j'ai eu de bons résultats avec un algorithme simple qui regarde la différence de pixels voisins. La somme de la différence de pixels 2-loin semble être une mesure raisonnable de contraste de l'image. Je ne pouvais pas trouver l'article original par Brenner dans les années 70, mais il est mentionné dans http://www2.die.upm.es/im/papers/Autofocus.pdf
Un autre problème, c'est quand l'image est très floue, il y a très peu d'informations de mise au point, de sorte qu'il est difficile de dire de quelle façon est de "se rapprocher" ou pour éviter un maximum local.
Vous pouvez avoir un coup d'oeil à la technique utilisée dans la Curiosity de la NASA Mars Rover.
La technique est décrite dans cet article
EDGETT, Kenneth S., et coll. La curiosité de Mars Hand Lens Imager (MAHLI) Enquête. la science de l'Espace commentaires2012, 170.1-4: 259-317.
qui est disponible comme un PDF ici.
Citation de l'article:
Ce qui suit est la Figure 23:
Cette idée a également été suggéré dans cette réponse: https://stackoverflow.com/a/2173259/15485
Ça peut être utile. C'est la façon dont la caméra du système AF fonctionne réellement - Passive Autofocus
Je n'ai pas construit un moi-même, mais ma première pensée serait de faire un 2D DFT sur une partie de l'image. Lorsque l'accent, les hautes fréquences disparaîtra automatiquement.
Pour un paresseux prototype, Vous pouvez essayer de compresser une région de l'image au format JPEG (haute qualité), et de regarder le flux de sortie de taille. Un fichier de grande taille signifie beaucoup de détails, ce qui implique à son tour de l'image est au point. Méfiez-vous que la caméra ne doit pas être trop bruyant, et que vous ne pouvez pas comparer les tailles de fichier à travers les différentes scènes de de parcours.
Alors que la sobel est un choix décent, je serais probablement choisir d'effectuer un bord de l'ampleur de calcul sur les projections dans les directions x et y sur plusieurs petits représentant les régions. L'autre .NET amicale des choix basés sur OpenCV est @ http://www.emgu.com/wiki/index.php/Main_Page.
Je me demande si l'écart-type est le meilleur choix: Si l'image est plus nette, le filtre de sobel image contiendra les pixels clairs sur les bords, mais dans le même temps, de moins en moins de pixels clairs, parce que les bords sont plus. Peut-être vous pouvez essayer d'utiliser une moyenne de 1%, la plus élevée des valeurs de pixel dans la sobel image?
Une autre saveur pour l'accent métrique peut être:
Prenez plusieurs images et leur moyenne ( réduction du bruit).
Puis FFT la moyenne de l'image et utiliser la haute à basse fréquences de l'énergie rapport.
Plus cette ration le mieux se concentrer. Un Matlab démo est disponible (à l'exclusion de la moyenne de phase) dans les démos de la boîte à outils 🙂