Tag Archives: auto-focus

Visión por ordenador – Regiones nítidas

Head_web_394k

English version

Resulta que últimamente he salido de excursión el “apasionante mundo de la fotografía” y estoy descubriendo bastantes cosas interesantes en las que no había pensado antes. Uno de los asuntos que han despertado mi curiosidad es cómo funciona la función auto-focus. Además, recuerdo haber visto en algún momento una camara que, mientras mostraba la imagen en la pantalla, iluminaba las zonas enfocadas. En aquel momento no me paré a pensar cómo funcionaba aquella arma del diablo pero el momento ha llegado, y como siempre Wikipedia tiene la primera respuesta rápida Wiki.

El objetivo de hoy es desarrollar un pequeño script en Matlab que ilumine las regiones “más enfocadas” de una imagen. El código utilizado está disponible AQUÍ.

Antes de nada, ¿Cuál es la diferencia entre una imagen enfocada y borrosa? Nitidez. Una propiedad que mide cómo varía la intensidad de luz entre un pixel y su vecindad. En el siguiente patrón mostrado, podemos ver cómo efectivamente, el valor de intensidad cambía más suavemente en imágenes emborronadas.

Smooth_Vs_SharpParece ser que hay varias maneras de medir dicha propiedad. Entre todas ellas, destacan dos métodos: basados en kernels Vs métodos frecuenciales. Los métodos basados en Kernels consisten básicamente en registrar la diferencia entre cada pixel y el valor medio de su vecindad. Mientras mayor sea esa diferencia, mayor es la probabilidad de tratarse de una región enfocada. Asumiendo que la imagen a procesar contiene alguna zona enfocada, los valores más altos se registrarán en dichas regiones.

Esa información relativa a la imagen pues, a menos que tengamos un valor absoluto de antemano que permita diferenciar zonas bien enfocadas por este método, este método iluminará “zonas enfocadas” incluso en imágenes totalmente borrosas.

Hay una forma alternativa de medir nitidez que no presenta ese problema y se basa en la cantidad de información de alta frecuencial que contiene la transformada de Fourier de la imagen. Sin haberme informado demasiado, tiene pinta de que son métodos más densos teóricamente hablando así que los métodos basados en kernels cubrirán nuestras expectativas de hoy.

Como se ha referido antes, la nitidez en cada píxel se calcula simplemente aplicando el kernel:

Kernel = \left[\begin{array}{ccc}  0 & -1& 0 \\-1 & 4 & -1 \\ 0 & -1 & 0  \end{array}\right]

Para ver qué hace exactamente, lo aplicaremos sobre una imagen de ejemplo. Las dos imágenes siguientes muestran la imagen original y el resultado de la operación (tras normalizar la “matriz de nitidez” resultante).

03

SharpnessEn la última imagen en blanco y negro, las zonas más oscuras corresponderían a las zonas seleccionadas. Si aplicamos una umbralización a esa imagen, tendremos una imagen binaria (sólo “unos” y “ceros”) con las zonas bien señaladas.

Sharpness_binEste último resultado lo usamos para iluminar píxeles en la imagen original y tenemos lo siguiente.

03

Finalmente, y siguiendo con la tendencia creciente de usar gifs en los posts, una pequeña animación generada a partir de imágenes de la misma escena pero con distintas zonas enfocadas.
Result

Dudas, consultillas y/o comentarios son bienvenidos.

Nos vemos pronto!

Tagged , , , , , ,