samples net libreria lab framework downloads c# image-processing automated-tests computer-vision aforge

c# - net - image processing lab



cálculo de foco de imagen (7)

Estoy tratando de desarrollar un algoritmo de enfoque de imagen para algunos trabajos de automatización de pruebas. Elegí usar AForge.net, ya que parece un buen sistema maduro de .net.

Lamentablemente, parece que no puedo encontrar información sobre la creación de algoritmos de enfoque automático desde cero, así que le di mi mejor intento:

tomar imagen. aplique el filtro de detección de borde sobel, que genera un contorno de borde en escala de grises. generar un histograma y guardar el dev. estándar mueva la cámara un paso más cerca del sujeto y tome otra fotografía. si el desarrollador estándar es más pequeño que el anterior, estamos enfocando más. de lo contrario, hemos pasado la distancia óptima para tomar fotografías.

hay una mejor manera?

actualización: gran defecto en esto, por cierto. a medida que paso el punto de enfoque óptimo, mi valor de "imagen en foco" continúa creciendo. esperarías una función parabólica que mire la distancia / el valor del foco, pero en realidad obtienes algo que es más logarítmico

actualización 2: está bien, así que volví a esto y el método actual que estamos explorando tiene algunos bordes conocidos (está bien, así que sé exactamente cuáles son los objetos en la imagen), hago una comparación manual de intensidad de píxeles. a medida que el gráfico resultante se hace más pronunciado, me enfoco más. Voy a publicar el código una vez que el algoritmo central se transporta desde matlab a c # (sí, matlab ..: S)

actualización 3: yay actualización final. volvimos a esto de nuevo. el código final se ve así:

paso 1: obtener una imagen de la lista de imágenes (tomé un centenar de fotos a través del punto enfocado)

paso 2: encuentra un borde para el objeto que estoy enfocando (en mi caso es un objeto rectangular que siempre está en el mismo lugar, así que recorto un rectángulo ALTO y ESTRECHO de un borde)

paso 3: obtener la HorizontalIntensityStatistics (clase Aforge.net) para esa imagen recortada.

paso 4: obtener el histograma (gris, en mi caso)

paso 5: encuentra la derivada de los valores del histograma

paso 6: cuando tu pendiente es la más grande, es cuando estás en el punto más enfocado.


Me pregunto si la desviación estándar es la mejor opción: si la imagen se vuelve más nítida, la imagen del filtro de Sobel contendrá píxeles más brillantes en los bordes, pero al mismo tiempo menos píxeles brillantes, porque los bordes se están volviendo más delgados. ¿Tal vez podrías intentar usar un promedio del 1% de los valores de píxeles más altos en la imagen Sobel?


No he construido uno yo mismo, pero mi primer pensamiento sería hacer una DFT 2D en una parte de la imagen. Cuando esté fuera de foco, las frecuencias altas desaparecerán automáticamente.

Para un prototipo diferido, puede intentar comprimir una región de la imagen con JPEG (alta calidad) y observar el tamaño de la secuencia de salida. Un archivo grande significa muchos detalles, lo que a su vez implica que la imagen está enfocada. Tenga en cuenta que la cámara no debería ser demasiado ruidosa y que, por supuesto, no puede comparar el tamaño de los archivos en diferentes escenas.


Si bien el sobel es una opción decente, probablemente elegiría hacer un cálculo de la magnitud del borde en las proyecciones en las direcciones xey en varias pequeñas regiones representativas. Otra opción amigable de .NET basada en OpenCV es @ http://www.emgu.com/wiki/index.php/Main_Page .


Otro sabor para la métrica de enfoque podría ser:

Toma varias imágenes y promételas (reducción de ruido). Luego, FFT es la imagen promediada y usa la relación de energía de alta a baja frecuencia. Cuanto mayor sea esta ración, mejor será el enfoque. Una demostración de Matlab está disponible (excluyendo la etapa de promediado) dentro de las demostraciones de la caja de herramientas :)


Puede ser un poco simplista para sus necesidades, pero he tenido buenos resultados con un algoritmo simple que analiza la diferencia con los píxeles vecinos. La suma de la diferencia de píxeles de 2 intentos parece ser una medida razonable del contraste de la imagen. No pude encontrar el documento original de Brenner en los años 70, pero se menciona en http://www2.die.upm.es/im/papers/Autofocus.pdf

Otro problema es cuando la imagen está extremadamente desenfocada, hay muy poca información de enfoque, por lo que es difícil decir en qué dirección se está "acercando" o para evitar un máximo local.


Puedes echar un vistazo a la técnica utilizada en el Curiosity Mars Rover de la NASA.

La técnica se describe en este artículo

EDGETT, Kenneth S., y col. Curiosity Mars Hand Lens Imager (MAHLI) Investigación. Reseñas de ciencias espaciales , 2012, 170.1-4: 259-317.

que está disponible en formato PDF aquí .

Citando del artículo:

7.2.2 Autofoco

Se prevé que el enfoque automático sea el método principal mediante el cual MAHLI se centra en Marte. El comando autofocus indica a la cámara que se mueva a una posición inicial de recuento de motor inicial y recoja una imagen, mueva un número específico de pasos y recopile otra, y continúe haciéndolo hasta alcanzar el número total de imágenes ordenadas, cada una separada por un motor especificado Incremento de cuenta. Cada una de estas imágenes está comprimida en JPEG (Joint Photographic Experts Group, ver CCITT (1993)) con el mismo factor de calidad de compresión aplicado. El tamaño del archivo de cada imagen comprimida es una medida del detalle de la escena, que a su vez es una función del enfoque (una imagen enfocada muestra más detalles que una vista borrosa y desenfocada de la misma escena). Como se ilustra en la Fig. 23, la cámara determina la relación entre el tamaño del archivo JPEG y el recuento del motor y ajusta una parábola a los tres tamaños de archivo máximos vecinos. El vértice de la parábola proporciona una estimación de la mejor posición de conteo del motor de enfoque. Habiendo hecho esta determinación, MAHLI mueve el grupo de enfoque del lente a la mejor posición del motor y adquiere una imagen; esta imagen se almacena, las imágenes anteriores utilizadas para determinar la posición de enfoque automático no se guardan.

El enfoque automático se puede realizar en todo el campo de visión de MAHLI, o se puede realizar en un subcuadro que corresponde a la parte de la escena que incluye los objetos que se estudiarán. Dependiendo de la naturaleza del tema y el conocimiento de las incertidumbres en el posicionamiento del brazo robótico de MAHLI, los usuarios pueden optar por adquirir un subcuadro de enfoque automático centrado o pueden seleccionar un subtrama de enfoque automático descentrado si el conocimiento de posicionamiento es suficiente para determinar dónde el cuadro secundario debe ubicarse. Se recomienda encarecidamente el uso de subtramas para realizar el enfoque automático, ya que esto generalmente hace que el sujeto esté en mejor enfoque que en el caso en que se aplica el enfoque automático al CCD completo; además, la posición del recuento de motor resultante del enfoque automático que utiliza un subtrama generalmente da como resultado una determinación más precisa de la distancia de trabajo de la escala de píxeles.

La siguiente es la Figura 23:

Esta idea también se sugirió en esta respuesta: https://.com/a/2173259/15485


Esto podría ser útil. Así es como funciona realmente el sistema AF de la cámara: enfoque automático pasivo

Medición de contraste

La medición del contraste se logra midiendo el contraste dentro de un campo sensor, a través de la lente. La diferencia de intensidad entre los píxeles adyacentes del sensor aumenta naturalmente con el enfoque correcto de la imagen. El sistema óptico se puede ajustar hasta que se detecte el máximo contraste. En este método, AF no involucra la medición de distancia real y generalmente es más lento que los sistemas de detección de fase, especialmente cuando se trabaja bajo luz tenue. Sin embargo, como no utiliza un sensor separado, el enfoque automático de detección de contraste puede ser más flexible (como se implementa en el software) y potencialmente más preciso. Este es un método común en cámaras de video y cámaras digitales de nivel de consumidor que carecen de obturadores y espejos reflejos. Algunas réflex digitales (incluidas las cámaras Olympus E-420, Panasonic L10, Nikon D90, Nikon D5000, Nikon D300 en modo trípode, Canon EOS 5D Mark II, Canon EOS 50D) utilizan este método cuando enfocan sus modos de visualización en vivo. Un nuevo sistema de lentes intercambiables, Micro Four Thirds, utiliza exclusivamente autofoco de medición de contraste y se dice que ofrece un rendimiento comparable al de los sistemas de detección de fase.