2010-11-19 17 views
13

Estoy tratando de diseñar un sistema de enfoque automático para un microscopio USB de bajo costo. He estado desarrollando el lado del hardware con un motor PAP de precisión que puede ajustar la perilla de enfoque en el microscope, y ahora estoy en la parte difícil.Algoritmo de autoenfoque para microscopio USB

He estado pensando en cómo implementar el software. El hardware tiene dos puertos USB, uno para la cámara del microscopio y otro para el motor. Mi idea inicial es escribir una aplicación en C# que sea capaz de obtener la imagen desde el microscopio y mover el motor adelante y atrás, hasta ahora todo bien :)

Ahora necesito un poco de ayuda con el auto- enfoque, cómo implementarlo? Hay algún buen algoritmo para esto? ¿O tal vez una biblioteca de procesamiento de imágenes que me ayudará en mi tarea?

He estado buscando contenido en google pero sin éxito ... agradeceré cualquier ayuda/idea/recomendación!

Muchas gracias :)

EDIT: Gracias a todos por sus respuestas, voy a tratar todas las opciones y volver aquí con los resultados (o tal vez más preguntas).

+0

Esto suena similar a esta pregunta - http://stackoverflow.com/questions/2134934/image-focus-calculation –

+0

Así es, yo no mostraron ese puesto antes. Gracias. – SubniC

+1

@SubniC Vea también http://stackoverflow.com/a/32951113/15485 –

Respuesta

6

La pieza más importante es el código que le indica qué tan desenfocada está la imagen. Como una imagen desenfocada pierde datos de alta frecuencia que me gustaría probar algo como lo siguiente:

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; 
} 

Este algoritmo no funciona bien si la imagen es ruidoso. En ese caso, podría reducir la resolución, o utilizar un algoritmo más complejo.

O otra idea es el cálculo de la variación de los valores de píxel:

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; 
} 

Estas funciones se aplican a imágenes monocromáticas, para imágenes RGB simplemente sumar los valores de los canales.

Usando esta función cambie el enfoque tratando de maximizar CalculateFocusQuality. Aumente el tamaño del paso si varios intentos seguidos mejoran la calidad, y disminuya e invierta la dirección si el paso reduce la calidad.

+0

Gracias CodeInChaos, voy a probar tu Snnipet y te cuento cómo funciona :) – SubniC

+0

Hay un pequeño error en tus algoritmos: tu y-loop está comparando x con la altura. Además, ¿no le daría el segundo algoritmo una puntuación más alta para una imagen completamente blanca que para un patrón de tablero de ajedrez blanco-negro alternante? Esto parece incorrecto, ya que el tablero de ajedrez está "más enfocado". – Mike

+0

@noroom Gracias. Ninguno de los algoritmos estaba haciendo lo que pretendía que hiciera. Debería ser arreglado ahora. Por favor, avíseme si encuentra otro error. – CodesInChaos

0

Hay un poco de información sobre Wikipedia

Técnicamente se puede implementar como filtro de paso alto y un poco de sistema que concienzudamente mueve la lente alrededor del punto donde salida del filtro es más alta. procesamiento digital no se requiere

Además, 5 de los 6 primeros partidos que recibo de Google para "algoritmo de enfoque automático" parecen tener información relevante y útil (aunque en uno o dos casos los detalles completos de los documentos requiere pago)

+0

Hola Paul, gracias por su tiempo respondiendo, ya sé la página wikipedia , nunca preguntes antes de la búsqueda. Tal vez no estoy tan claro sobre Google :) lo busqué pero no encontré ningún algoritmo que pudiera entender, mi formación matemática no es tan sólida, por eso estoy pidiendo ayuda aquí. – SubniC

+0

OK. Pero creo que vas a necesitar un poco de matemática para este ... –

+0

Trataré de aprenderlo, si no puedo, encontraré algunos que me ayuden. Pero para el comienzo es realmente agradable la gente de aquí para que te dirijas en la dirección correcta :) – SubniC

6

El autoenfoque de un microcoscopio es un tema de larga data en la investigación óptica.
Puede aprender un poco sobre los algoritmos involucrados here.

Los problemas involucrados no son solo cómo medir el desenfoque, sino también cómo mover el eje óptico de una manera óptima y cómo corregir algorítmicamente las aberraciones residuales.

HTH!

+0

Hola, Belisarius, papel muy interesante, intentaré obtener información que pueda ayudarme. Saludos. – SubniC

0

algunas de mis experiencias tratando de resolver tareas similares. En mi sistema se usa una magnificación de 200x. Resolución de pasos en la dirección Z 0.001um.

Los problemas que he enfrentado: - Agitación. La imagen en una posición teóricamente mejor podría evaluarse peor debido a una sacudida repentina. Como la API de mi sistema no permitía mover z-axix y hacer imágenes en paralelo, tuve que moverme en pasos y capturar de forma secuencial. Cada movimiento de parada causó temblores. Curiosamente, los temblores fueron más severos mientras se movía hacia abajo que hacia arriba.

- Imprecisión mecánica. Hacer un escaneo y moverse a la posición teóricamente mejor puede tener un error, porque la posición de paso en el controlador puede no ser la misma que la posición mecánica.

-Exposición: Dependiendo de la aplicación, el brillo de la imagen puede variar, por lo que la exposición debe ajustarse. Dependiendo del algoritmo de evaluación del enfoque (ya sea que el brillo esté involucrado en el cálculo o no), puede requerirse que la exposición sea fija. Eso da como resultado el problema del huevo de gallina: cómo configurar la exposición, si se desconoce el brillo de la imagen y cómo enfocar, si se requiere la exposición no se conoce.

Finalmente, para evitar problemas mecánicos, he (re) almacenado la mejor imagen encontrada al enfocar y la devolví al final. En cuanto al algoritmo para el valor de foco, lo mejor fue buscar bordes combinados con un número entero de colores (ancho de histograma). Pero de causa, depende del tipo de imagen que procesa.

Saludos, Valentin Heinitz

Cuestiones relacionadas