2010-11-19 4 views
13

J'essaie de concevoir un système de mise au point automatique pour un microscope USB à faible coût. J'ai développé le côté matériel avec un moteur PAP de précision qui est capable d'ajuster le bouton de mise au point dans le microscope, et maintenant je suis dans la partie difficile.Algorithme d'autofocus pour microscope USB

J'ai réfléchi à la façon d'implémenter le logiciel. Le matériel a deux ports USB, un pour la caméra de microscope et un autre pour le moteur. Mon idée initiale est d'écrire une application en C# capable d'extraire l'image du microscope et de faire avancer et reculer le moteur, jusqu'ici tout va bien :)

Maintenant, j'ai besoin d'aide avec l'auto- focus, comment l'implémenter? Il y a un bon algorithme pour ça? Ou peut-être une bibliothèque de traitement d'image qui m'aidera dans ma tâche?

J'ai été googleling mais sans succès ... J'apprécierai n'importe quelle aide/idée/recommandation!

Un grand merci :)

EDIT: Merci les gars pour vos réponses, je vais essayer toutes les options et revenir ici avec les résultats (ou peut-être plus de questions).

+0

Cela semble similaire à cette question - http://stackoverflow.com/questions/2134934/image-focus-calculation –

+0

C'est vrai, je ne montre ce poste avant. Merci. – SubniC

+1

@SubniC Voir aussi http://stackoverflow.com/a/32951113/15485 –

Répondre

6

La pièce la plus importante est le code qui vous indique le degré de flou de l'image. Depuis une image non focalisée perd des données à haute fréquence je vais essayer quelque chose comme ce qui suit:

long CalculateFocusQuality(byte[,] pixels) 
{ 
    long sum = 0; 
    for(int y = 0; y<height-1; y++) 
    for(int x=0; x<width-1; x++) 
    { 
     sum += Square(pixels[x+1, y] - pixels[x, y]); 
     sum += Square(pixels[x, y] - pixels[x, y+1]); 
    } 
    return sum; 
} 

int Square(int x) 
{ 
    return x*x; 
} 

Cet algorithme ne fonctionne pas bien si l'image est bruyante. Dans ce cas, vous pouvez le sous-échantillonner ou utiliser un algorithme plus complexe.

Ou une autre idée calcule la variation des valeurs de pixels:

long CalculateFocusQuality(byte[,] pixels) 
{ 
    long sum = 0; 
    long sumOfSquares = 0; 
    for(int y=0; y<height; y++) 
    for(int x=0; x<width; x++) 
    { 
     byte pixel=pixels[x,y]; 
     sum+=pixel; 
     sumofSquares+=pixel*pixel; 
    } 
    return sumOfSquares*width*height - sum*sum; 
} 

Ces fonctions fonctionnent sur les images monochromes, pour les images RVB résument simplement les valeurs des canaux.

En utilisant cette fonction, changez la mise au point en essayant de maximiser CalculateFocusQuality. Augmentez le stepize si plusieurs tentatives d'affilée améliorent la qualité, et diminuez-la et inversez la direction si l'étape a réduit la qualité.

+0

Merci CodeInChaos, je vais essayer votre snnipet et vous dire comment cela fonctionne :) – SubniC

+0

Il y a une petite faute de frappe dans vos algorithmes: votre y-loop compare x avec la hauteur. En outre, le deuxième algorithme ne donnerait-il pas un score plus élevé pour une image tout en blanc que pour un motif en damier blanc-noir alternant? Cela semble faux, puisque le damier est "plus en évidence". – Mike

+0

@noroom Merci. Aucun algorithme ne faisait ce que je l'avais prévu de faire. Devrait être réparé maintenant. S'il vous plaît laissez-moi savoir si vous trouvez une autre erreur. – CodesInChaos

0

Il y a quelques informations sur Wikipedia

Techniquement, il peut être mis en œuvre comme filtre passe-haut et un système qui se déplace consciencieusement lentille autour du point où sortie du filtre est le plus élevé. traitement numérique n'est pas nécessaire

En outre, 5 des 6 premiers matchs que je reçois de recherche sur Google pour « algorithme de mise au point automatique » semblent avoir des informations pertinentes et utiles (bien que dans un ou deux cas, les détails complets de papiers exige paiement)

+0

Bonjour Paul, merci pour votre temps de réponse, je connais déjà la page wikipedia , ne demandez jamais befor search. Peut-être que je ne suis pas si clair à propos de google :) je l'ai cherché mais je n'ai trouvé aucun algorithme que je pourrais comprendre, mes antécédents mathématiques ne sont pas si forts, à cause de cela, je demande de l'aide. – SubniC

+0

OK. Mais je pense que vous allez avoir besoin d'un bon peu de mathématiques pour celui-ci ... –

+0

Je vais essayer de l'apprendre, si je ne peux pas, je vais trouver un peu pour m'aider. Mais pour le début c'est vraiment sympa les gens ici pour vous diriger vers la bonne direction :) – SubniC

6

L'autofocus d'un microcosystème est un sujet de longue date dans la recherche optique. Vous pouvez en apprendre un peu plus sur les algorithmes concernés here. Les problèmes posés concernent non seulement la manière de mesurer la défocalisation, mais également comment déplacer l'axe optique de manière optimale et comment corriger algorithmiquement les aberrations résiduelles.

HTH!

+0

Bonjour Belisarius, un article très intéressant, je vais essayer d'obtenir des informations qui peuvent m'aider. Cordialement. – SubniC

0

juste quelques-unes de mes expériences en essayant de résoudre une tâche similaire. Sur mon système, une magnificatine de 200x est utilisée. Stepper résolutine dans la direction Z 0.001um.

Les problèmes auxquels j'ai été confronté: -Écoute. L'image sur la position théoriquement meilleure pourrait être évaluée pire en raison de secouer soudainement. Comme l'API de mon système ne permettait pas de déplacer z-axix et de faire des images en parallèle, j'ai dû faire des pas et capturer séquentiellement. Chaque mouvement-arrêt a provoqué des secousses. Fait intéressant, les secousses étaient plus sévères en descendant que de monter.

-Imprécision mécanique. Effectuer un balayage et passer à la meilleure position théorique peut comporter une erreur, car la position du stepper dans le contrôleur peut ne pas être la même que la position mécanique. -Exposition: Selon l'application, la luminosité de l'image peut varier, de sorte que l'exposition doit être ajustée. En fonction de l'algorithme de mise au point-évaluation (que la luminosité soit impliquée dans le calcul ou non), il peut être nécessaire de fixer l'exposition. Cela entraîne le problème de l'œuf de poule - comment configurer l'exposition, si la luminosité de l'image est inconnue et comment faire la mise au point, si l'exposition requise est inconnue. Enfin, pour éviter les problèmes mécaniques, j'ai (re) stocké la meilleure image trouvée pendant la mise au point et je l'ai renvoyée à la fin. En ce qui concerne l'algorithme de mise au point, le meilleur était la recherche d'arêtes combinées avec le nombre entier de couleurs (largeur de l'histogramme). Mais de cause, cela dépend du type d'image que vous traitez.

Cordialement, Valentin Heinitz