Me preguntaba si hay una manera de determinar si una imagen está borrosa o no analizando los datos de la imagen.
203
Me preguntaba si hay una manera de determinar si una imagen está borrosa o no analizando los datos de la imagen.
Respuestas:
Sí lo es. Calcule la Transformada rápida de Fourier y analice el resultado. La transformación de Fourier le dice qué frecuencias están presentes en la imagen. Si hay una baja cantidad de frecuencias altas, la imagen está borrosa.
Definir los términos 'bajo' y 'alto' depende de usted.
Editar :
Como se indicó en los comentarios, si desea un flotador único que represente el desenfoque de una imagen determinada, debe calcular una métrica adecuada.
La respuesta de Nikie proporciona esa métrica. Convolucione la imagen con un núcleo laplaciano:
Y use una métrica máxima robusta en la salida para obtener un número que pueda usar para el umbral. Intente evitar suavizar demasiado las imágenes antes de calcular el Laplaciano, porque solo descubrirá que una imagen suavizada está borrosa :-).
fuente
Otra forma muy simple de estimar la nitidez de una imagen es usar un filtro de Laplace (o LoG) y simplemente elegir el valor máximo. Usar una medida robusta como un cuantil del 99.9% probablemente sea mejor si espera ruido (es decir, elegir el enésimo contraste más alto en lugar del contraste más alto). Si espera un brillo de imagen variable, también debe incluir un paso de preprocesamiento para normalizar el brillo de la imagen / contraste (por ejemplo, ecualización de histograma).
Implementé la sugerencia de Simon y esta en Mathematica, y la probé en algunas imágenes de prueba:
La primera prueba difumina las imágenes de prueba usando un filtro gaussiano con un tamaño de núcleo variable, luego calcula la FFT de la imagen borrosa y toma el promedio de las frecuencias más altas del 90%:
Resultado en una trama logarítmica:
Las 5 líneas representan las 5 imágenes de prueba, el eje X representa el radio del filtro gaussiano. Los gráficos están disminuyendo, por lo que la FFT es una buena medida de nitidez.
Este es el código para el estimador de borrosidad "LoG más alto": simplemente aplica un filtro LoG y devuelve el píxel más brillante en el resultado del filtro:
Resultado en una trama logarítmica:
La extensión de las imágenes no borrosas es un poco mejor aquí (2.5 frente a 3.3), principalmente porque este método solo usa el contraste más fuerte en la imagen, mientras que el FFT es esencialmente un promedio sobre toda la imagen. Las funciones también disminuyen más rápido, por lo que podría ser más fácil establecer un umbral "borroso".
fuente
Durante algunos trabajos con una lente de enfoque automático, me encontré con este conjunto muy útil de algoritmos para detectar el enfoque de la imagen . Está implementado en MATLAB, pero la mayoría de las funciones son bastante fáciles de portar a OpenCV con filter2D .
Básicamente es una implementación de encuestas de muchos algoritmos de medición de enfoque. Si desea leer los documentos originales, en el código se proporcionan referencias a los autores de los algoritmos. El artículo de 2012 de Pertuz, et al. El análisis de los operadores de medidas de enfoque para la forma desde el foco (SFF) ofrece una excelente revisión de todas estas medidas, así como de su rendimiento (tanto en términos de velocidad como de precisión aplicadas a SFF).
EDITAR: se agregó código MATLAB en caso de que el enlace muera.
Algunos ejemplos de versiones de OpenCV:
No hay garantías de si estas medidas son o no la mejor opción para su problema, pero si rastrea los documentos asociados con estas medidas, pueden darle más información. ¡Espero que encuentres útil el código! Sé que lo hice.
fuente
Partiendo de la respuesta de Nike. Es sencillo implementar el método basado en laplacian con opencv:
Devolverá un breve indicando la máxima nitidez detectada, que según mis pruebas en muestras del mundo real, es un indicador bastante bueno de si una cámara está enfocada o no. No es sorprendente que los valores normales dependan de la escena, pero mucho menos que el método FFT, que tiene una tasa de falsos positivos alta para ser útil en mi aplicación.
fuente
Se me ocurrió una solución totalmente diferente. Necesitaba analizar cuadros fijos de video para encontrar el más nítido en cada (X) cuadros. De esta manera, detectaría imágenes borrosas y / o desenfocadas.
Terminé usando la detección de Canny Edge y obtuve MUY MUY buenos resultados con casi todos los tipos de video (con el método de Nikie, tuve problemas con los videos VHS digitalizados y los videos entrelazados pesados).
Optimicé el rendimiento estableciendo una región de interés (ROI) en la imagen original.
Usando EmguCV:
fuente
Gracias nikie por esa gran sugerencia de Laplace. Los documentos de OpenCV me apuntaron en la misma dirección: usando python, cv2 (opencv 2.4.10) y numpy ...
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
numpy.max(cv2.convertScaleAbs(cv2.Laplacian(gray_image,3)))
El resultado es entre 0-255. Encontré que cualquier cosa superior a 200ish está muy enfocada, y para 100, es notablemente borrosa. el máximo nunca tiene mucho menos de 20 incluso si está completamente borroso
fuente
Una forma que estoy usando actualmente mide la extensión de los bordes en la imagen. Busque este documento:
Por lo general, está detrás de un muro de pago, pero he visto algunas copias gratuitas. Básicamente, localizan bordes verticales en una imagen y luego miden qué tan anchos son esos bordes. Al promediar el ancho se obtiene el resultado final de estimación de desenfoque para la imagen. Los bordes más anchos corresponden a imágenes borrosas, y viceversa.
Este problema pertenece al campo de la estimación de calidad de imagen sin referencia . Si lo busca en Google Scholar, obtendrá muchas referencias útiles.
EDITAR
Aquí hay una trama de las estimaciones de desenfoque obtenidas para las 5 imágenes en la publicación de Nikie. Los valores más altos corresponden a un mayor desenfoque. Utilicé un filtro gaussiano de tamaño fijo 11x11 y varié la desviación estándar (usando el
convert
comando de imagemagick para obtener las imágenes borrosas).Si compara imágenes de diferentes tamaños, no olvide normalizar por el ancho de la imagen, ya que las imágenes más grandes tendrán bordes más anchos.
Finalmente, un problema importante es distinguir entre el desenfoque artístico y el desenfoque no deseado (causado por falta de enfoque, compresión, movimiento relativo del sujeto hacia la cámara), pero eso está más allá de enfoques simples como este. Para ver un ejemplo de desenfoque artístico, eche un vistazo a la imagen de Lenna: el reflejo de Lenna en el espejo es borroso, pero su rostro está perfectamente enfocado. Esto contribuye a una estimación de desenfoque más alta para la imagen de Lenna.
fuente
Probé una solución basada en el filtro laplaciano de esta publicación. No me ha ayudado. Entonces, probé la solución de esta publicación y fue buena para mi caso (pero es lenta):
¡La imagen menos borrosa tiene el
sum
valor máximo !También puede ajustar la velocidad y la precisión cambiando el paso, p. Ej.
esta parte
puedes reemplazar con este
fuente
Las respuestas anteriores aclararon muchas cosas, pero creo que es útil hacer una distinción conceptual.
¿Qué sucede si toma una imagen perfectamente enfocada de una imagen borrosa?
El problema de detección de desenfoque solo está bien planteado cuando tiene una referencia . Si necesita diseñar, por ejemplo, un sistema de enfoque automático, compara una secuencia de imágenes tomadas con diferentes grados de desenfoque o suavizado e intenta encontrar el punto de desenfoque mínimo dentro de este conjunto. En otras palabras, debe hacer una referencia cruzada de las diversas imágenes utilizando una de las técnicas ilustradas anteriormente (básicamente, con varios niveles posibles de refinamiento en el enfoque, buscando la única imagen con el mayor contenido de alta frecuencia).
fuente
El código Matlab de dos métodos que se han publicado en revistas de gran prestigio (Transacciones IEEE sobre procesamiento de imágenes) están disponibles aquí: https://ivulab.asu.edu/software
verifique los algoritmos CPBDM y JNBM. Si revisa el código, no es muy difícil portarlo y, por cierto, se basa en el método de Marzialiano como característica básica.
fuente
Lo implementé, use fft en matlab y verifique el histograma de la media de cálculo de fft y std, pero también se puede hacer la función de ajuste
fuente
Eso es lo que hago en Opencv para detectar la calidad del enfoque en una región:
fuente